一、Zookeeper内部原理

~~~     [zookeeper内部原理之Leader选举]
~~~ [zookeeper内部原理之ZAB一致性协议]
### --- Leader选举:选举机制

~~~ # 半数机制:
~~~ 集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
~~~ # Zookeeper虽然在配置文件中并没有指定Master和Slave。
~~~ 但是,Zookeeper工作时,是有一个节点为Leader,其它为Follower,
~~~ Leader是通过内部的选举机制产生的。

二、集群首次启动

### --- 集群首次启动

~~~ 假设有五台服务器组成的Zookeeper集群,它们的id从1-5,
~~~ 同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。
~~~ 假设这些服务器依序启动,来看看会发生什么,

|NO.Z.00007|——————————|BigDataEnd|——|Hadoop&Zookeeper.V07|——|Zookeeper.v07|内部原理|Leader选举_服务器

三、Zookeeper的选举机制

### --- Zookeeper的选举机制

~~~ # 服务器1启动,
~~~ 此时只有它一台服务器启动了,它发出去的报文没有任何响应,
~~~ 所以它的选举状态一直是LOOKING状态。
~~~     # 服务器2启动,
~~~ 它与最开始启动的服务器1进行通信,互相交换自己的选举结果,
~~~ 由于两者都没有历史数据,所以id值较大的服务器2胜出,
~~~ 但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),
~~~ 所以服务器1、2还是继续保持LOOKING状态。

~~~ # 服务器3启动,
~~~ 根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,
~~~ 此时有三台服务器选举了它,所以它成为了这次选举的Leader。
~~~     # 服务器4启动,
~~~ 根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,
~~~ 但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。

~~~ # 服务器5启动,
~~~ 同4一样称为follower。

四、集群非首次启动

### --- 集群非首次启动

~~~ 每个节点在选举时都会参考自身节点的zxid值(事务ID);优先选择zxid值大的节点称为Leader!!

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart

                                                                                                                                                   ——W.S.Landor