===== 发布/订阅 ===== 原理:基于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】