用户工具


发布/订阅

原理:基于watcher事件通知机制

常用于同步配置信息,配置信息一般满足如下特性:

  • 数据量小
  • 内容在运行时动态变化
  • 集群中所有机器共享

命名服务

原理:基于zookeeper的顺序节点的特性:在顺序节点下调用create()方法会返回一个完整的节点名,例如:job-00003。那这个文件的完整路径就是一个全局唯一的名字了

master选举

原理:多个客户端创建同一个节点,只有一个客户端能创建成功(必须是临时节点,当master与zookeeper失去连接时zookeeper会自动清除临时节点,否则别的节点仍然不能创建该节点,会导致剩下的slave无法成为master)。其他客户端发现这个节点已经存在之后,会在这个节点上注册监听,当该节点被删除时,立刻触发新一轮竞选

脑裂

有一种情况:假如master假死一段时间,zookeeper以为master挂了,删除了其创建的锁节点(其他slave可能立马成为了master)。一段时间后假死的master恢复了,它还以为他是master。这样就出现2个master了。

避免方法:所有机器在竞争创建锁节点的时候,必须加上acl访问控制信息

假如master假死一段时间,zookeeper以为master挂了,删除了其创建的锁节点(其他slave可能立马成为了master)。一段时间后假死的master恢复了,当它去更新锁节点时,发现它没有权限,他就知道自己现在已经不是master了,并将自己自动降级为slave。

我不太明白,master选举完成之后,为什么还需要去更新锁节点?

分布式锁

排它锁

原理:多个客户端创建同一个临时节点,只有一个客户端能创建成功。其他客户端发现这个节点已经存在之后,会在这个节点上注册监听,当该节点被删除时,立刻触发新一轮竞争

共享锁

原理:创建一个顺序节点,所有的读操作都在该节点下创建一个子节点。写操作时,判断这个顺序节点下有没有子节点,如果没有才能写。

分布式队列

原理:创建一个根顺序节点,每个会话都在该节点下创建一个目录。

  1. 获取根目录下所有子节点
  2. 确定自己的序号在子节点中的顺序
  3. 判断自己是不是序号最小的节点,如果是,直接处理逻辑
  4. 如果自己不是序号最小的节点,那就向比自己小一号的节点注册一个监听
  5. 收到watcher的通知,那重复步骤1

更多案例:参考【从paxos到zookeeper】