0%

深入浅出Zookeeper

https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.html

ZooKeeper是什么

ZooKeeper是一个开源的分布式协调服务,设计目标是将哪些复杂且容易出错的分布式一致性服务封装起来,构成一个高效的原语(原语的执行必须连续且不可分割)集,并以一系列简单易用的接口提供给用户时使用

常用场景

  1. 命名服务:通过ZooKeepe的顺序节点生成全局唯一ID
  2. 数据发布/订阅:通过Watcher机制可以很方便的实现数据发布/订阅。其他机器可以通过监听ZooKeeper上的节点变化来实现配置的动态更新
  3. 分布式锁:通过创建唯一节点获得分布式锁,当获得锁的乙方执行完相关的代码或者挂掉后就释放,也需要使用Watcher机制

一些可以使用的场景

[[手写rpc#注册中心|使用ZooKeeper作为注册中心手写RPC]]

使用ZooKeeper作为分布式锁

重要概念

Data model

ZooKeeper数据模型使用层次化的多叉树形结构,每个节点上都可以存储数据,而且数据可以是数字、字符串、二进制序列。每个节点可以有N个子节点。每个数据节点叫做znode,是数据的最小单元,每个znode都有唯一的路径标识
znode存储的数据大小上线为1M,避免将大数据保存在ZooKeeper中

znode

分类:

  • 持久(PERSISTENT)节点:一旦创建就存在即使ZooKeeper集群宕机,知道将其删除
  • 临时(EPHEMERAL)节点:临时节点的声明周期与客户端会话绑定。会话节点小时则节点消失,临时节点只能作为叶子节点,不可创建属于自己的子节点。
  • 持久顺序节点:除了具有持久节点外,子节点的名称还有顺序性。

znode的组成:

  • stat:状态信息
  • data:节点存放数据的具体内容

版本:

ZooKeeper会为每一个znode维护一个叫做Stat的数据结构
Stat中记录了三个znode相关的版本:

  • dataVersion:当前znode节点的版本号
  • cversion:当前znode子节点的版本
  • aclVersion:当前znode的ACL的版本

ACL:权限控制

  • CREATE:创建子节点
  • READ:获取节点数据和列出其子节点
  • WRITE:设置/更新节点数据
  • DELETE:删除子节点
  • ADMIN:设置节点ACL的权限
    身份认证有四种方式:
  • world:默认,任何用户都可以无条件访问
  • auth : 不适用任何id,代表任何已经认证的用户
  • digest:用户名:密码的方式
  • ip:对指定ip进行限制

Watcher(事件监听器)

ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发时,ZooKeeper服务器会将事件通知到感兴趣的客户端上。

Session

ZooKeeper服务端与客户端之间的一个TCP长连接。客户端可以通过它进行心跳检测与服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应。同时也能接收来在服务器的Watcher事件通知

集群

ZooKeeper将集群中节点的角色分为三类:

  • Leader 为客户端提供读写服务,负责投票的发起和决议,更新系统状态
  • Follower:只读,将写服务转发给Leader,参与选举过程的头票
  • Observer:只读,写服务转发给Leader,不参与选举中的投票,也不参与”过半写成功”策略。 在不影响写性能的情况下提升集群的读性能。

Leader的选举过程

条件:
当Leader服务器出现网络中断、崩溃退出与重启等异常情况是,会进去Leader选举过程。
流程:

  1. Leader election 选举阶段:开始投票,只要有一个节点获得过半节点的票数即可作为准Leader
  2. Discovery发现阶段:followers跟准节点leader进行通信,同步followers最近接收的事务提议
  3. Synchronization 同步阶段:利用leader前一阶段获得的最新提议历史,同步集群中所有的副本,同步之后,准leader成为正式节点
  4. Broadcast 广播阶段:Zookeeper集群正式对外提供事务服务,leader及逆行消息广播,如果有新的节点加入,还需要进行同步
    节点的状态:
  • LOOKING:寻找Leader
  • LEADING:Leader状态,对应的节点成为Leader
  • FOLLOWING:对应的节点成为Follower
  • OBSERVING:对应的节点成为OBSERVING
    脑裂问题通过过半机制解决

ZAB协议

ZooKeeper Atomic Broadcast,原子广播
###3 模式

  • 崩溃恢复:启动或者出现异常状况时,进行崩溃恢复状态,当选举出新的Leader节点,并且已经进行状态同步之后,退出恢复状态。
  • 消息广播:当集群中已经完成状态通过,整个服务架构进入消息广播模式。新加入的节点会自觉进入数据恢复状态。

常见的Java API

curator-x-discovery是 Apache Curator 库中的一个模块,用于简化与 Apache ZooKeeper 交互时的服务发现和注册功能

ServiceDiscovery 用于管理服务的注册和发现
ServiceInstance 描述一个服务的信息
CuratorFramework zk连接客户端