- Zoookeeper
- 提供分布式系统中分布式协同服务
- Leader/Follwer/observer
- 1.follower接收到客户端发送过来的写请求后,会把该写请求转发给leader处理
- 2.leader接收到follower发送过来的写请求后,会转换成带有各种状态的事务,会把事务进行广播
- 3.所有接收到proposal的follower就要进行投票,都需要向leader返回ACK
- 4.发送事务提交请求
- observer不参与选举
- zk默认端口2181
- watcher(事件监听器),特定事件的监听
- 持久性节点:一直存在
- 临时性节点:会被自动清理,和客户端会话绑定
- 顺序性节点:加一个后缀表示顺序
- 事务ID(ZXID:64位数字)
- watcher实现分布式监听
- zookeeper开源客户端zkclient
- 有超时重连和事件注册功能
- 可以递归创建节点
- zkclient可以对不存在的节点监听
- Curator客户端。提供了fluent风格
- 基于zk的两大特性对集群机器监控
- 1.订阅通知
- 2.临时节点的会话生命周期
- 集群管理:日志系统用zk
- 1.注册收集器机器
- 2.任务分发
- 3.状态汇报
- 4动态分配
- 如果收集器挂掉或者扩容,重新分配
- 4.1全局动态分配
- 4.2局部动态分配:收集器汇报负载,把挂掉的节点转移给负载低的收集器
- master选举
- 1.所有节点向数据库插入同一主键id,成功的就是master
- 2.zk创建同一临时节点,成功就是master,其他客户端在父节点注册节点变更事件
- zk分布式锁
- 1排他锁
- 只允许持有锁操作,只有一个事务获得锁
- 1.1创建一个临时节点锁
- 1.2只有创建成功了的获取锁,其他注册监听事件
- 1.3释放锁:当执行完主动释放,节点挂掉自动释放
- 2.共享锁
- 数据对所有事务可见
- 2.1创建临时顺序节点
- 2.2读写请求区分,创建顺序节点后对父节点变更监听
-
对于读请求,如果没有比自己序号小的子节点或者比自己小的节点都是读请求 - 可以成功获取锁
-
对于写请求,如果自己不是序号最小的写节点,需要等待 - 接到事件变更通知后,重复校验步骤
- 2.3释放锁
- 羊群效应
- 如果集群规模大,重复大量的watcher通知,对zk集群造成巨大开销
- 可以只注册前面一个节点的监听事件,不在父节点
- 读请求监听前面的最后一个写请求,写请求监听前面一个节点
- 分布式队列
- 临时顺序节点
- 分布式屏障(barrier)
- ZAB协议:不完全是paxos算法
- 核心是定义改变zk服务器数据状态的事务请求的处理方式
- 崩溃恢复模式:ZAB协议保证事务可以在所有服务器上都能提交成功保证事务一致性
- 消息广播模式:类似二阶段提交,超过半数follower就广播commit
- ZAB与paxos
- 相同
- 1。都存在leader进程
- 2.都会超过半数follower反馈才会提交
- 3.有leader周期
- 不同
- 服务器角色
- leader:
- 事务请求的调度者和处理者。集群内部服务器的调度者
- follower:
- 处理非事务请求,转发事务请求给leader
- 参与proposal投票
- 参与leader选举
- observer:
- 工作原理和follower基本一致,只是不参与投票