zookeeper深入理解-同事讨论引起的一场理解

雷小涛 2019-06-25

首先说说是怎么引起这次深入理解zk的吧。

A同事:突然问了一句“zk一般集群都是奇数台,要是集群坏了一台机器该怎么工作,还能正常工作吗?”
B同事:这个zk集群自己会动态抛弃一台,又是奇数台。
当时我心里默默想着zk他那个集群投票的paxos算法,哎对呀一定要超过半数的投票通过才能正常执行。恍惚中觉得B同事的说法好像挺ok的。
A同事:(一般zk都是7台,坏了一台就还有6台,我们使用的是7台的集群)剩了6台,要是投票数3v3,应该是算这次投票失败吧。
听了A的回复,我感觉是哈,好像也有道理。为了验证这俩的说法。我对zk又有了一次深入的理解。

1.zk的集群节点分类

Leader、Follower和Observer
Leader:最终决策者,也是集群master,负责手机Follower的意见
Follower:参与决议事件
Observer:用于提升zk性能的节点,主要是提高其对外读的性能提高,并且这类节点不参与投票,也提高了zk增删改的性能.(因为zk基于投票选举策略的思路,每次的增删改请求都将被转发到集群Leader节点进行后续的投票表
决)

2.zk投票表决机制以及集群数量

Leader将收到的请求(增删改),广播给所以Follower节点,在广播给所以Follower节点之前会生成一个单调递增的id,zid,当Leader只要收到超过半数以上决议通过,就执行该请求,不会等待其他未表决(未返回的)Follower节点,所有广播的消息都将按zid排序进行执行。
因此zk集群的数量其实任意台都行,这里的集群数量暂且不考虑Observer,出于稳定性和可用性的考虑(CAP理论),都会多台机器部署。因为zk的投票机制,要超过半数的投票通过,才能执行此次请求。比如3台,必须要2台机    
器决议通过之后才能执行,即剩下2台依旧可以正常对外提供服务,可容错1台,4台,必须要3台机器决议通过之后才能执行,即剩下3台依旧可以正常对外提供服务,可容错1台。所以偶数和奇数台的可容错(可用性)是一样的,
为何要多一台机器去部署呢?并且zk多一台机器参与表决,写入的性能也会线性下降。
      机器数量        容错数量
        1                0
        2                0
        3                1
        4                1
        
        2n-1            n-1
        2n              n-1

相关推荐