zookeeper的主备同步和leader选举是通过ZAB协议来完成的。写一下能够记得更牢一些。
因为ZK大多数是读,少部分写,所以读都是读follower。写的是leader
数据同步的过程类似于二阶段提交
- Client 写数据到leader,leader为每一个follower构建队列,异步将写入的数据放到队列里
- 队列里的数据发送proposal给到每一个follower
- follower收到后,将数据写入,并且发送ack
- leader收到大多数的ack之后,发送ack给到每一个follower,follower根据如果没问题就commit,然后发送给leader,leader收到之后给到client
像这样的分布式协议,主要还是考虑特殊情况。
可能出现的特殊情况如下:
- leader故障,毫无疑问, ZK重新选取主,然后重试
- 有一半的follower没ack,然后就没法commit,client接收到的也是失败,数据并没有持久化了,不会丢失。
- leader发送commit 丢了,那么follower没法commit,数据也没持久化下来,client接收到的失败。