===== 发布/订阅 =====
原理:基于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选举完成之后,为什么还需要去更新锁节点?
===== 分布式锁 =====
=== 排它锁 ===
原理:多个客户端创建同一个临时节点,只有一个客户端能创建成功。其他客户端发现这个节点已经存在之后,会在这个节点上注册监听,当该节点被删除时,立刻触发新一轮竞争
=== 共享锁 ===
原理:创建一个顺序节点,所有的读操作都在该节点下创建一个子节点。写操作时,判断这个顺序节点下有没有子节点,如果没有才能写。
===== 分布式队列 =====
原理:创建一个根顺序节点,每个会话都在该节点下创建一个目录。
- 获取根目录下所有子节点
- 确定自己的序号在子节点中的顺序
- 判断自己是不是序号最小的节点,如果是,直接处理逻辑
- 如果自己不是序号最小的节点,那就向比自己小一号的节点注册一个监听
- 收到watcher的通知,那重复步骤1
更多案例:参考【从paxos到zookeeper】