zookeeper基本知识点

zookeeper

1) 基本特性

a) 是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务
b) 核心是原子广播机制,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议
c) 数据模型是,具有层次结构类似与文件系统
d) 提供了一项基本服务:分布式锁服务, 在分布式锁的基础上,摸索了出了其他的使用方法:配置维护、组服务、分布式消息队列、分布式通知/协调等

2) 一致性原理

a) 全局串行化所有的写操作
b) 保证同一客户端的指令被FIFO执行(以及消息通知的FIFO)
c) 与redis的读写方式一样串行+队列

3) 分布式锁的原理

a) 排它锁(X锁)的核心是保证当前有且只有一个事务获得锁,并且锁被释放后,所有正在等待锁的事务能被通知到
b) 利用节点名称的唯一性来实现共享锁
所有客户端通过create()创建锁节点,在该锁节点位置下创建临时节点/exclusive_lock/lock。但有且只有一个能够创建成功。该客户端获得锁,其他客户端到该节点上注册节点变更Watcher监听
当前取得锁的客户端会话失效,Zookeeper自动删除该临时节点或正常执行完业务逻辑,客户端主动删除该临时节点
当节点信息发生变更后, 通知所有注册Watcher的客户端,重新开始竞争锁
c) 利用临时顺序节点实现共享锁
zk中有一种节点叫做顺序节点,假如在/lock/目录下创建节3个点,ZooKeeper集群会按照提起创建的顺序来创建节点,节点分别为/lock/0000000001、/lock/0000000002、/lock/0000000003
zk中有一种节点叫做临时节点,临时节点由某个客户端创建,当客户端与zk集群断开连接,则开节点自动被删除
所有客户端都去/lock目录下创建临时顺序节点,如果创建节点序列号是/lock/目录下最小的节点,则获得锁
如果没有获得锁,则监视比自己创建节点的序列号小的节点(比自己创建的节点小的最大节点),进入等待
当节点信息发生变更后, 通知所有注册Watcher的客户端,重新开始竞争锁
d) 使用menagerie,封装好的java工具

4) 提供的操作有

a) 创建/读取/更新/删除节点,监控节点变化

5) 典型应用场景

a) 统一命名服务
分布式全局id: 借用ZK创建节点的有序性来生成一个顺序增长的,可以在集群环境下使用的,命名易于理解的ID
节点路径的唯一性以及良好的可读性,适合在分布式应用中需要保证唯一性又要方便识别记忆的场景,如分布式服务中的服务地址列表(dubbo) 
b) 配置管理
集群中有20台服务器配置项都相同,若要修改某个配置项就必须逐一修改每台服务器,这样非常麻烦且易出错
将配置信息保存在zk的某个目录节点中
集群所有服务器监控该节点,一旦配置信息发生变化,每台应用机器就会收到 zk的通知,从而获取到最新配置
c) 集群管理
分布式锁是其中一个应用场景
代替心跳机制使得监控系统能感知集群机器的变更,降低应用之间的耦合
利用EPHEMERAL(临时节点)类型的节点,一旦创建该节点的server宕机,那么该节点就会自动被删除的特性
i. 监控系统在/clusterServer节点注册watcher
ii. 动态增加机器就往/clusterServe创建EPHEMERAL子节点/clusterServers/{hostname}
iii. 机器增加和宕机都会通知父节点
d) 负载均衡
从库动态增减
i. 建立从库父节点/slaves
ii. 数据库(从库)启动时,增加临时子节点/slaves/db00001,将数据库连接信息添加到节点
iii. 应用启动时监控从库父节点/slaves,并从/slaves获取所有从库连接
iv. 从库有增减时,通过watcher机制通知应用服务器
e) 分布式锁(共享排他锁)
f) 分布式队列管理
同步队列: 一个队列的成员都聚齐时,这个队列才可用
i. 创建一个父目录 /synchronizing,每个成员都监控标志位目录 /synchronizing/start 是否存在
ii. 每个成员都加入这个队列,加入队列的方式就是创建 /synchronizing/member_i 的临时目录节点
iii. 每个成员获取 / synchronizing 目录的所有目录节点,也就是 member_i
iv. 判断 i 的值是否已经是成员的个数,如果小于成员个数等待 /synchronizing/start 的出现,如果已经相等就创建 /synchronizing/start
v. 分布式环境中,一个大任务Task A,需要在很多子任务完成(或条件就绪)情况下才能进行的场景
fifo: 特定的目录下创建 SEQUENTIAL 类型的子目录 /queue_i,这样就能保证所有成员加入队列时都是有编号的,出队列时通过 getChildren( ) 方法可以返回当前所有的队列中的元素,然后消费其中最小的一个,这样就能保证 FIFO
g) 分布式通知/协调
注册临时节点,节点变更后的watcher机制,通知所有监控节点的应用

猜你喜欢

转载自blog.csdn.net/zyf_balance/article/details/78729242