2021 L9
ZK没有提供强一致性
Key Idea
- 写操作都是异步的,客户端可以一次向ZooKeeper提交多个操作,会排队执行,leader对于批量的操作仅会写入一次磁盘。
- 运行读操作在任意服务器执行(故无法保证强一致性)。
线性一致性
- 可以构建所有操作的顺序。
- 顺序与真实时间匹配。
- 读操作返回最后写入的值。
ZK的优化
- 提供线性化写入。
- 所有操作按照FIFO的顺序执行。
- 读取操作会观察到同一客户端的最后一次写入(不一定能观察到其他客户端的最新写入)。
- 读取时可观察到日志的某些前缀,可能读取到旧值,但不会读到相对于当前客户端的旧值,换句话说不会回到过去(即如果客户端读x获取前缀1,下一次读的有效结果前缀必须大于等于1)。 - 每次写入(写入最后一定会回到leader)后会有对应的zxid,如果读取到一个没有对应zxid的节点时,不会立刻返回失败,而是等待节点更新到相同的zxid。(ZK也会负责处理负载均衡) - 节点使用exists获取到另一个节点的值存在的同时,注册对应的watch,后续如果值发生更改后,节点会收到通知(通知是在另一个节点发生下一个write时发送的),节点就可以选择重新从exists开始执行。
Znode API
- Znode tree:
- 挂载机器节点(ip或者dns),有版本号。
- 常规节点,复制状态机。
- 临时节点:当session离开后,或者没收到心跳,自动删除。
- 顺序节点,在特定的znode下一个接一个排序,按照序列号排序。
Test and Set
将1 set
入内存,并原子返回旧值;