Zookeeper集群为何是奇数
1. 简介
在 ZooKeeper 集群中,会有三种角色,leader、 follower、 observer 分别对应着总统、议员、观察者。
半数以上投票通过:客户端的增删改操作无论访问到了哪台 ZooKeeper 服务器,最终都会被转发给 leader 服务器,再由 leader 服务器分给 ZooKeeper 集群中所有 follower 服务器去投票(投票指的是在内存中做增删改操作),半数投票通过就被认为操作可执行(commit),否则不可执行。
observer 观察者服务器是针对于查询操作做负载的,observer 与 follower 服务器最大的不同在于 observer 没有投票权,在客户端发起的增删改操中,leader 服务器是不会把消息传递给 observer 服务器让其投票的。但是查询操作跟 follower 一样,客户端的查询到了 observer 服务器节点,observer 服务器去访问 leader 服务器取最新的数据然后返回给客户端。其中 observer 并不计算在投票机器数目中,半数工作不包括 observer 机器数。
2. 容错
由于在增删改操作中需要半数以上服务器通过,来分析以下情况:
2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉。
3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉。
4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉。
5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉。
6台服务器,至少3台正常运行才行(6的半数为3,半数以上最少为4),正常运行可以允许2台服务器挂掉。
通过以上可以发现,3台服务器和4台服务器都最多允许1台服务器挂掉,5台服务器和6台服务器都最多允许2 台服务器挂掉。但是明显4台服务器成本高于3台服务器成本,6台服务器成本高于5台服务器成本,这是由于半数以上投票通过决定的。
3. 防脑裂
一个 ZooKeeper 集群中,可以有多个 follower、observer 服务器,但是必需只能有一个 leader 服务器。如果 leader 服务器挂掉了,剩下的服务器集群会通过半数以上投票选出一个新的leader服务器。
集群互不通讯情况:
一个集群3台服务器,全部运行正常,但是其中1台裂开了,和另外2台无法通讯。3台机器里面2台正常运行过半票可以选出一个leader。
一个集群4台服务器,全部运行正常,但是其中2台裂开了,和另外2台无法通讯。4台机器里面2台正常工作没有过半票以上达到3,无法选出 leader 正常运行。
一个集群5台服务器,全部运行正常,但是其中2台裂开了,和另外3台无法通讯。5台机器里面3台正常运行过半票可以选出一个 leader。
一个集群6台服务器,全部运行正常,但是其中3台裂开了,和另外3台无法通讯。6台机器里面3台正常工作没有过半票以上达到4,无法选出 leader 正常运行。
通可以上分析可以看出,为什么 ZooKeeper 集群数量总是单出现,主要原因还是在于防脑裂。如果出现脑裂,ZooKeeper 集群就无法正常运行了。