上一篇(L8)

下一篇(L10)

2021 L9

ZK没有提供强一致性

Key Idea

  • 写操作都是异步的,客户端可以一次向ZooKeeper提交多个操作,会排队执行,leader对于批量的操作仅会写入一次磁盘。
  • 运行读操作在任意服务器执行(故无法保证强一致性)。

线性一致性

  • 可以构建所有操作的顺序。
  • 顺序与真实时间匹配。
  • 读操作返回最后写入的值。

ZK的优化

  1. 提供线性化写入。
  2. 所有操作按照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入内存,并原子返回旧值;