zookeeper 是什么?
zookeeper 是一个分布式协调服务
zookeeper 的特征,都保障了什么?
1、顺序一致性:客户端的请求按顺序进行相应
2、原子性:要么成功要么失败,没有中间商赚差价
3、统一视图:无论客户端连接到哪台服务器,都能看到统一的结果视图
4、可靠性:一旦服务端数据的状态发生了变化,就会立即存储起来,除非此时有另一个请求对其进行了变更,否则数据一定是可靠的
5、及时性(数据一致性):系统的客户视图保证在特定时间范围是最新的
zookeeper 的数据结构
zookeeper 是一个目录树结构
zookeeper 都有哪些角色?都负责什么?
leader:主节点(领导者)- 负责读写,并参与选举
follower:从节点(跟随者)- 负责读,并参与选举
observer:从从节点(观察者)-负责读,没有选举权和被选举权
zookeeper 是如何与client 保持通信的?
session
zookeeper 是如何保证数据一致性的?
基于ZAB 协议:原子广播
- client向node发送write请求
- follower向leader发送write请求
- leader向follower发送广播
- 超过半数以上的follower成功响应
- leader 将消息插入到队列,队列采用FIFO机制,保证消息顺序
zookeeper 是如何选举的?
zookeeper 的选举机制不同其他,zookeeper 的leader 是谦让出来的
假设leader节点宕机,三个follower分别为ABC
- 选出数据最完整的节点,即PID最大的节点,假设是A、B两个节点
- 校验A、B 两个节点的myid,最大的当选为leader 节点
官方给出的速度为200 ms,基本是无感的,并且在ABC选举的过程中,不对外提供服务,保证数据完整性
zookeeper 是如何对节点进行监听的?
通过watch命令
zookeeper 自己通过watch实现了心跳、发现
zookeeper 如果实现服务注册中心?
zookeeper 如何实现分布式锁?
方案1:client 主动轮询,心跳。弊端:时效性差,有一定的延迟性,压力
方案2:client watch zookeeper。弊端:假设有1000 台服务器,zk 要同时通知,鸭梨大
方案3:watch + seq
实现步骤:
- client 同时创建sequence节点,每个client 得到的响应结果都不同
- 假设小明client拿到了第1个seq节点,小红client拿到了第2各seq节点,小刚client拿到了第3各seq节点
- 拿到第一个节点的client实现业务逻辑,执行完成后释放锁,并删除seq01节点
- 小红等着小明释放锁,自己就成为了第1个seq,并实现业务逻辑
- 小刚及后面的client重复此步骤
- 除了第1个节点,其他的节点只需要监听上一个节点是否delete,获取到响应结果后,依次判断自己是否为第1个节点
对应步骤1:
对应步骤3、4