ZooKeeper原理剖析

2024-02-22  本文已影响0人  Cherron

分布式数据一致性的解决方案

架构

客户端<------------->ZooKeeper集群(至少三台,建议奇数)
ZooKeeper 客户端库将选择一个任意服务器并尝试连接到它。如果此连接失败,或者客户端因任何原因与服务器断开连接,客户端将自动尝试列表中的下一个服务器,直到(重新)建立连接。


架构

Server角色:Leader、Follower和Observer

  1. Leader:
  1. Follower
  1. Observer:观察ZooKeeper集群的最新状态变化并将这些状态变更同步过来

Server工作状态

  1. LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
  2. FOLLOWING:跟随者状态。表明当前服务器角色是Follower。
  3. LEADING:领导者状态。表明当前服务器角色是Leader。
  4. OBSERVING:观察者状态。表明当前服务器角色是Observer。

主从节点一致

  1. Leader服务器挂了,所有集群中的服务器进入LOOKING状态
  2. 首先,它们会选举产生新的Leader服务器
  3. 接着,新的Leader服务器与集群中Follower服务进行数据同步
  4. 当集群中超过半数机器与该 Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式
  5. Leader 服务器开始接收客户端的事务请求生成事务Proposal进行事务请求处理。

选举机制

(1)启动时

选举
  1. 服务器1(myid=1)启动,当前只有一台服务器,无法完成Leader选举
  2. 服务器2(myid=2)启动,此时两台服务器能够相互通讯,开始进入Leader选举阶段
  3. 每个服务器发出一个投票
    包含zxid、myid,zxid表示当前节点最新存储的数据的事务编号
  4. 接受来自各个服务器的投票
  1. 处理投票

优先检查ZXID。ZXID比较大的服务器优先作为leader。
如果ZXID相同的话,就比较myid,myid比较大的服务器作为leader。 服务器1的投票是(1,0),它收到投票是(2,0),两者zxid都是0,因为收到的myid=2,大于自己的myid=1,所以它更新自己的投票为(2,0),然后重新将投票发出去。对于服务器2呢,即不再需要更新自己的投票,把上一次的投票信息发出即可。

  1. 统计投票
  1. 服务器3(myid=3)启动,继续进入Leader选举阶段
  1. 服务器4启动,发起一次选举。
  1. 服务器5启动,发起一次选举。
  1. 投票结束,服务器3当选为Leader

(2)Leader挂了,重新选举

其中第二步仅限于余下的非Observer服务器

重新选举

数据模型:层次模型(文件系统模型)

分层命名空间

节点类型

  1. 持久节点
  2. 持久顺序节点
  3. 临时节点
  4. 临时顺序节点

分布式锁(临时顺序节点)

  1. 获取锁过程 (创建临时节点,检查序号最小)
  2. 释放锁 (删除临时节点,监听通知)

分布式锁和Redis的对比

Zookeeper是强一致性(CP),Redis是最终一致性(AP),而且前者当获取不到锁时,只需添加一个监听器即可,不用一直轮询,性能消耗小。更推荐Zookeeper

1.获取锁

2.释放锁

节点存储的数据(尽量小于1k,不能超过1M)

存储数据、访问权限、子节点引用、节点状态信息


节点数据

使用场景

有条件的更新和监视

ZooKeeper支持 watch 的概念。客户端可以在 znode 上设置监视,并与server建立长连接。当 znode 发生变化时,watch 被触发时,server通过长连接向客户端发送消息,客户端会收到一个数据包,说明 znode 已更改。如果客户端和其中一个 ZooKeeper 服务器之间的连接断开,客户端将收到本地通知。

ACL访问控制

  1. 仅适用于特定的znode,不适合child_node,不是递归的
  2. 权限有:
  1. 对象类型:

一致性保证

上一篇 下一篇

猜你喜欢

热点阅读