

首先简单说一下分布式系统。这是一个比较宽泛的概念。他的产生和出现是为了应对和解决以往系统的问题。 我的简单理解是一套互相连接共同向外提供服务的系统,系统内部节点间通过某种方式进行通信。常见的大的如电商网站,小的如一个数据库集群,缓存集群等。 在分布式系统出现之前使用的单机系统,一旦服务器的操作系统、硬盘、网络等出现问题,就可能会出现服务中断,数据丢失等问题。 另外,单机的性能再高,存储能力再扩展,也是有限的,而分布式系统可以包含大量的服务器用来分散带宽、存储和计算压力。 第三,由于跨较远区域甚至跨国的网络延迟有时还是客观的,所以服务器集中在一个地方很难向较大范围提供较好的服务和体验。 百度上对分布式系统的解释:
-
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
-
内聚性:系统内的节点、服务目的、分工、规则明确。
-
透明性:分布式系统对外提供服务,调用该系统的外部用户不用考虑塔式怎么工作的,只要根据规则进行使用就成,也不需要知道里面包含多少台计算机,都在什么地方。
一致性问题

比较容易理解的常见的实际问题: 一个系统包含5个节点,由于网络原因其中3个节点和另2个节点失去了联系,这时候系统应该怎么处理,是否还可以继续提供服务。 如果继续提供服务,他们之间的数据就是不一致的,后面节点间的网络恢复后,怎么解决数据不一致的问题。 节点间的网络延迟、磁盘读写、CPU处理能力不同,保存到这个系统中的数据在哪些情况下可以认为保存成功了,还要以一种效率较高的方式来实现。
三、ZAB协议

-
客户向主节点请求写数据X;
-
主节点为该数据生成一个唯一的递增Id,叫ZXIDX(Id);
-
主节点把X(Id)发给所有的从节点,跟他们确认能不能正常把数据记录下来,这个操作叫 Propose 提议;
-
超过一半的节点向主节点回复没问题,这个回复操作叫 ACK 应答;
-
节点收到一半以上从节点的肯定答复后,给所有的从节点发送确认提交请求,表示你们可以把这个数据保存下来了,同时自己也正式保存这个数据,这个过程叫 Commit 提交。
-
发消息到每一个自己还能连上的节点:包含自己的节点编号叫 myid 和 自己保存的数据的最大的 ZXID。
-
谁的ZXID最大,谁就是新的主节点。为什么呐?因为这表示他的数据最新。尽量确保数据一致性。
-
ZXID相同的时候,谁的myid最大谁是新的主节点;
-
收到其他节点的数据后,跟自己的判断,如果对方比自己的大,就认同对方为主节点;
-
得到一半以上(注意这里又是一半以上),节点认同的候选的节点成为新的主节点。

下面再简单介绍几句Raft算法。 Raft算法很多地方跟ZAB很像,也分主节点和从节点,主节点选举的地方有一点差别。
-
发现主节点失踪一段时间后,所有从节点向其他从节点发消息,让他们选自己为新的主节点;
-
还没参加选举的节点如果收到其他节点的选举请求,就选举自己收到的第一个节点,后面谁再请求自己支持选举,就告诉他们我已经支持另一个节点了;
-
如果一个节点发现另一个节点得到的支持比自己多,也就开始无条件支持那个节点选举,同时让支持自己的节点也去支持它
-
如果一轮没选出来得到大多数节点支持的主节点,就开始下一轮选举,直到一个节点得到了大部分节点支持,成为新的主节点。

还有一个叫Paxos的一致性算法,更复杂,惭愧我目前还不敢确保完全理解,Paxos算法还衍生出来好几种变体,经典的Paxos算法不分主节点和从节点。 其实现在大部分的一致性算法都是起源于或参考了Paxos算法,有人说只有Paxos才是真正的一致性算法。
Q&A

Q:主节点本身也是选举出来的,如果主节点挂了呢? A:一般分布式一致性算法可以确保在部分节点挂掉的情况下保持数据的一致性,在大部分节点都同时挂掉的情况不能确保。比如一共5个节点,2个挂掉没问题,其中可以包括主节点,如果3个挂掉了,就不能确保了。一般出现这种情况时,比如5个节点只剩了2个,这两个节点就不再提供服务了。 Q:在主节点失去心跳到选举新的主节点作为写入,这期间的数据怎么保证最终一致?那还是这个问题。 A:主节点失联的时候不能写数据。如果此时主节点上有没有提交的数据它就挂了,那么客户端就不能得到这个消息成功写入的响应。因此系统本身的数据是一致的。主节点上没提交的数据在从节点上也是未提交,因此没提交数据的ZXID不算数。严格的讲这段时间系统是不可写的。 Q:一般主从节点重新选举的频率是多少? A:这个要看具体情况了,跟服务器,网络,机房环境,系统本身开发的怎么样,压力这些都有关系;节点挂掉才会进行选举,不过具有主节点的系统,主节点的压力也会比较大,协议的具体实现互相差别也很大,涉及到开发细节的话还有很多参数要考虑,比如心跳间隔,节点数量等。 本文转载自公众号: 凤凰牌老熊,点击查看原文。