Loading

Zookeeper

date: 2020-04-21 19:17:00
updated: 2020-04-23 08:38:00

Zookeeper

1. 知识点

ZooKeeper 集群中包含 Leader、Follower 以及 Observer 三个角色:

Leader:负责进行投票的发起和决议,更新系统状态,Leader 是由选举产生;
Follower: 用于接受客户端请求并向客户端返回结果,在选主过程中参与投票;
Observer:可以接受客户端连接,接受读写请求,写请求转发给 Leader,但 Observer 不参加投票过程,只同步 Leader 的状态,Observer 的目的是为了扩展系统,提高读取速度。

pic1

Zookeeper 系统中只要集群中存在超过一半的节点(这里指的是投票节点即非 Observer 节点)能够正常工作,那么整个集群就能够正常对外服务。基于此,如果想搭建一个能够允许 N 台机器 down 掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。

多增加节点对性能和写可用性有影响。节点数越多意味着 Leader 发出的提案需要更多的节点(半数以上)来接受提案,这必然增加提案 commit 的耗时,也就意味着对写请求的性能以及可用性影响比较大。还要考虑机房容灾情况,所以一般会跨机房部署,比如三机房部署,221分配节点,任意一个机房故障都不影响正常使用。把leader和follwer放在一起,都设有observer,由 client -> observer -> leader 的方式通信,可以降低投票节点的工作负载,降低 Leader 和 Follower 的不稳定性,从而提高整个集群的稳定性和可用性。

原子广播zab协议ZooKeeper Atomic Broadcast。仿照kafka保证数据可靠性那种方式

参考

Zab 协议实现的作用
1)使用一个单一的主进程(Leader)来接收并处理客户端的事务请求(也就是写请求),并采用了Zab的原子广播协议,将服务器数据的状态变更以 事务proposal (事务提议)的形式广播到所有的副本(Follower)进程上去。

2)保证一个全局的变更序列被顺序引用。
Zookeeper是一个树形结构,很多操作都要先检查才能确定是否可以执行,比如P1的事务t1可能是创建节点"/a",t2可能是创建节点"/a/bb",只有先创建了父节点"/a",才能创建子节点"/a/b"。

为了保证这一点,Zab要保证同一个Leader发起的事务要按顺序被apply,同时还要保证只有先前Leader的事务被apply之后,新选举出来的Leader才能再次发起事务。

3)当主进程出现异常的时候,整个zk集群依旧能正常工作。

posted @ 2020-10-22 10:42  猫熊小才天  阅读(70)  评论(0编辑  收藏  举报