雷小涛 2019-06-25
A同事:突然问了一句“zk一般集群都是奇数台,要是集群坏了一台机器该怎么工作,还能正常工作吗?” B同事:这个zk集群自己会动态抛弃一台,又是奇数台。 当时我心里默默想着zk他那个集群投票的paxos算法,哎对呀一定要超过半数的投票通过才能正常执行。恍惚中觉得B同事的说法好像挺ok的。 A同事:(一般zk都是7台,坏了一台就还有6台,我们使用的是7台的集群)剩了6台,要是投票数3v3,应该是算这次投票失败吧。 听了A的回复,我感觉是哈,好像也有道理。为了验证这俩的说法。我对zk又有了一次深入的理解。
Leader、Follower和Observer Leader:最终决策者,也是集群master,负责手机Follower的意见 Follower:参与决议事件 Observer:用于提升zk性能的节点,主要是提高其对外读的性能提高,并且这类节点不参与投票,也提高了zk增删改的性能.(因为zk基于投票选举策略的思路,每次的增删改请求都将被转发到集群Leader节点进行后续的投票表 决)
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
ZooKeeper支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取ZooKeeper服务的当前状态及相关信息。用户在客户端可以通过telnet或nc向ZooKeeper提交相应的命令