前提

这段时间开始需要接触分布式相关的东西,改造公司的几个传统集中式项目,又要临时抱佛脚补补基础了。

书籍

从网上只找到国内阿里中间件出版的一本书《从Paxos到ZooKepper分布式一致性原理与实践》


如果习惯了国外的一些动物书,什么权威指南之类的,看这本书封面的画风,很容易让人忽略掉它其中实际的内容

以下是书中的一些概念。

集中式的特点

所谓的集中式系统就是指由一台或多台主计算机组成中心节点, 数据集中存储干这个中 心节点中, 并且整个系统的所有业务单元都集中部署在这个中心节点上, 系统的所有功 能均由其集中处理。 也就是说, 在集中式系统中, 每个终端或客户端机器仅仅负责数据 的录人和输出, 而数据的存储与控制处理完全交由主机来完成。 集中式系统最大的特点就是部署结构简单。 由干集中式系统往往基于底层性能卓越的大 型主机, 因此无须考虑如何对服务进行多个节点的部署, 也就不用考虑多个节点之间的 分布式协作问题。

分布式的特点

分布性

分布式系统中的多台计算机都会在空间上随意分布,同时,机器的分布情况也会随时变动。

对等性

分布式系统中的计算机没有主/从之分, 既没有控制整个系统的主机, 也没有被控制的从机, 组成分布式系统的所有计算机节点都是对等的。 副本 (Replica) 是分布 式系统最常见的概念之一, 指的是分布式系统对数据和服务提供的一种冗余方式。 在常见的分布式系统中, 为了对外提供高可用的服务, 我们往往会对数据和服务进行副本处理。 数据副本是指在不同的节点上持久化同一份数据, 当某一个节点上存 储的数据丢失时, 可以从副本上读取到该数据, 这是解决分布式系统数据丢失问题 最为有效的手段。 另一类副本是服务副本, 指多个节点提供同样的服务, 每个节点都有能力接收来自外部的请求并进行相应的处理。

并发性

在一个计算机网络中, 程序运行过程中的并发性操作是非常常见的行为, 例如同一个分布 式系统中的多个节点, 可能会并发地操作一些共享的资源, 诸如数据库或分布式存 储等, 如何准确并高效地协调分布式并发操作也成为了分布式系统架构与设计中最 大的挑战之一。

缺乏全局时钟

一个典型的分布式系统是由一系列在空间上随 意分布的多个进程组成的, 具有明显的分布性, 这些进程之间通过交换消息来进行 相互通信。 因此, 在分布式系统中, 很难定义两个事件究竟谁先谁后, 原因就是因 为分布式系统缺乏一个全局的时钟序列控制。

故障总会发生

组成分布式系统的所有计算机, 都有可能发生任何形式的故障。 一个被大量工程实 践所检验过的黄金定理是: 任何在设计阶段考虑到的异常情况, 一定会在系统实际 运行中发生, 并且, 在系统实际运行过程中还会遇到很多在设计时未能考虑到的异 常故障。 所以, 除非需求指标允许, 在系统设计时不能放过任何异常情况。

分布式环境的各种问题

通信异常

从集中式向分布式演变的过程中, 必然引人了网络因素, 而由于网络本身的不可靠性, 因此也引入了额外的问题。 分布式系统需要在各个节点之间进行网络通信, 因此每次网 络通信都会伴随着网络不可用的风险, 网络光纤、 路由器或是 DNS 等硬件设备或是系 统不可用都会导致最终分布式系统无法顺利完成一次网络通信。 另外, 即使分布式系统 各节点之间的网络通信能够正常进行, 其延时也会远大于单机操作。 通常我们认为在现 代计算机体系结构中, 单机内存访问的延时在纳秒数量级 (通常是 10nS 左右), 而正常 的一次网络通信的延迟在 0-1~1mS 左右 (相当于内存访问延时的 l05~l06 倍), 如此巨 大的延时差别, 也会影响消息的收发的过程, 因此消息丢失和消息延迟变得非常普遍。

网络分区

当网络由于发生异常情况, 导致分布式系统中部分节点之间的网络延时不断增大, 最终 导致组成分布式系统的所有节点中, 只有部分节点之间能够迸行正常通信, 而另一些节 点则不能一一我们将这个现象称为网络分区, 就是俗称的 “脑裂”。 当网络分区出现时, 分布式系统会出现局部小集群, 在极端情况下, 这些局部小集群会独立完成原本需要整 个分布式系统才能完成的功能, 包括对数据的事务处理, 这就对分布式一致性提出了非常大的挑战

三态

从上面的介绍中,我们已经了解到了在分布式环境下,网络可能会出现各式各样的问题, 因此分布式系统的每一次请求与响应, 存在特有的“三态”概念, 即成功、失败与超时。 在传统的单机系统中, 应用程序在调用一个函数之后, 能够得到一个非常明确的响应: 成功或失败。 而在分布式系统中, 由干网络是不可靠的, 虽然在绝大部分情况下, 网络 通信也能够接收到成功或失败的响应, 但是当网络出现异常的情况下, 就可能会出现超 时现象, 通常有以下两种情况:

  • 由于网络原因, 该请求 (消息) 并没有被成功地发送到接收方, 而是在发送过程 就发生了消息丢失现象。
  • 该请求 (消息) 成功的被接收方接收后, 并迸行了处理, 但是在将响应反馈给发 送方的过程中, 发生了消息丢失现象。

    当出现这样的超时现象时,网络通信的发起方是无法确定当前请求是否被正确成功处理的。

    节点故障

    节点故障则是分布式环境下另一个比较常见的问题, 指的是组成分布式系统的服务器节点出现的宕机或 “僵死” 现象。 通常根据经验来说, 每个节点都有可能会出现故障, 并且每天都在发生。

分布式系统事物处理的挑战

ACID理论

事务 (Transaction) 是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元 (Unit), 狭义上的事务特指数据库事务。 一方面, 当多个应用程序并发访 问数据库时, 事务可以在这些应用程序之间提供一个隔离方法, 以防止彼此的操作互相 干扰。 另一方面, 事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即使在异常状态下仍能保持数据一致性的方法。事物就有四个特征,分别是原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durablity) ,简称为事物的ACID特性

原则性

事物的原子性指的是事物必须是一个原子操作的操作序列单元,事物中包含的各项操作在一此执行过程中,只运行出现以下两种状态,全部执行成功,全部不执行。任何一项操作失败都将导致整个事物失败,同时其他已经被执行的操作都将被撤销并且回滚,只有所有的操作全部成功,整个事物才算是成功完成的。

一致性

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性, 一个事务在执行 之前和执行之后, 数据库都必须处干一致性状态。 也就是说, 事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态, 因此当数据库只包含成功事务提交 的结果时, 就能说数据库处干一致性状态。 而如果数据库系统在运行过程中发生故障, 有些事务尚未完成就被迫中断, 这些未完成的事务对数据库所做的修改有一部分已写人 物理数据库, 这时数据库就处于一种不正确的状态, 或者说是不一致的状态。

隔离性

事务的隔离性是指在井发环境中, 并发的事务是相互隔离的, 一个事务的执行不能被其 他事务干扰。 也就是说, 不同的事务并发操纵相同的数据时, 每个事务都有各自完整的 数据空间, 即一个事务内部的操作及使用的数据对其他并发事务是隔离的, 并发执行的 各个事务之间不能互相干扰。

持久性

事务的持久性也被称为永久性, 是指一个事务一旦提交, 它对数据库中对应数据的状态变更就应该是永久性的。 换句话说, 一旦某个事务成功结束, 那么它对数据库所做的更 新就必须被永久保存下来一即便发生系统崩溃或机器宕机等故障, 只要数据库能够重新启动, 那么一定能够将其恢复到事务成功结束时的状态。