zookeeper-小记
zookeeper 崩溃恢复过程中两个关键性问题
Q1:leader 提交事务 A 后崩溃,follower 没有收到提交事务 A 的消息,再次选举 leader 时如何确保事务 A 被应用?
A1:既然 leader 已经在本地提交了事务 A,那么说明事务 A 肯定已经经过了多数 follower 的确认,即多数 follower 上都有事务 A 的记录,leader 崩溃后,重新选举出的新 leader 肯定包含未提交的事务 A,因为事务 A 的事务 ID 最大,新 leader 会继续提交事务 A。
Q2:leader 在还未将事务 B 广播到集群中时崩溃,在重新选举 leader 并在旧 leader 恢复正常后如何处理事务 B?
A2:事务 B 将会被删除,不会被提交。leader 在接收到一个请求,并将其转化为事务 B 后崩溃,此时还没有将事务 B 广播到集群中,即此事务只存在于 leader 机器上,经过新一轮的 leader 选举后,旧 leader 恢复正常并加入集群,此时会发现事务 B 的事务 ID 所使用的 epoch 号与新 leader 的对不上,那么事务 B 就会被删除。
应用场景
把握好 zookeeper 的主要特性就可以将其应用在多种多样的场景下。主要特性如下:
- 节点
- 树结构
- 持久节点
- 持久顺序节点
- 临时节点
- 临时顺序节点
- 节点只能被注册一次
- watcher
在《从 Paxos 到 Zookeeper》一书中提到的应用场景以及我认为场景所应用到的主要特性如下:
- 数据发布/订阅(配置中心)
- watcher
- DNS 服务负载均衡
- 树结构
- watcher
- 命名服务
- 持久顺序节点
- 分布式协调/通知
- 临时节点
- 临时顺序节点
- watcher
- 集群管理
- 临时节点
- watcher
- Master 选举
- 节点只能被注册一次
- watcher
- 分布式锁
- 节点只能被注册一次(排他锁/写锁/独占锁)
- 临时顺序节点(共享锁/读锁)
- watcher
- 分布式队列
- 临时顺序节点
- watcher