Zookeeper 协议
简介:分布式协调服务,提供诸如统一命名、配置管理等基础服务
越来越多的分布式应用面临数据一致性问题,Zookeeper的设计目标是将那些复杂且容易出错的分布式一致服务封装起来,构建一个高效可靠的原语集,并以一系列简单可用的接口提供给用户使用
设计目标:
- 简单的数据模型
- 可构建集群
- 顺序访问
- 高性能
基础概念:
- 集群
- 会话
- Znode
- 版本
- Watcher
- ACL create read write delete admin
Zookeeper简单应用场景
- redis 服务发现和治理
在redis实际应用中,一般会有一个主节点redis,几个从属节点redis。
主节点处理用户写请求,从节点向主节点同步数据,处理用户读的请求。
当主节点故障的时候,从节点会通过raft算法选举出新的主节点处理用户写请求。
问题产生:如何在主服务器变更后,更新项目redis读写配置?
原始做法: 修改项目代码里面的redis地址和端口,然后上传代码,再重新部署
Zookeeper解决方法:通过zookeeper监控主从服务器变动,在项目里面引入zookeeper客户端,当主服务器变更的时候,zookeeper客户端会收到通知,在通知回调里,我们可以收到新的主节点地址和端口,根据他写一段redis重启代码,这样就避免了服务器重启
Zookeeper 使用和API
创建 create(final String path, byte data, List<ACL> acl, CraeteMode createMode)
读取 getChildren(path, watcher, watch, cb, ctx, stat) getData(path, watcher, stat, watch, cb, ctx)
更新 setData(path, data, version)
删除 delete (path ,version)
判断节点是否存在 exists(path, watcher)
ZAB协议
ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议
ZAB不像Paxos算法那样是一种通用的分布式一直算法,他是一种特别为Zookeeper设计的崩溃可恢复的原子广播算法
- 主备模式,单一主进程处理事务
- 全局的变更时序,也就是说如果一个状态更新已经发生了,那么所有其依赖的状态变更都应该被提前处理了
- 支持崩溃恢复
Zookeeper两种基本模式,崩溃恢复和消息广播,还有一种数据恢复模式
Leader服务器收到事务,转化成Proposal,Follow服务器收到事务,转发给Leader
消息广播
类似二阶段提交
区别在于移除了中断逻辑,所有的Follower要么正常反馈Leader提出的事务Proposal,要么抛弃Leader服务器。所以这意味着
- Leader收到过半的Ack就可以Commit了,不需要等所有的回复
- 无法处理Leader奔溃退出带来的数据不一致
基于TCP协议,可以做到FIFO
Leader会为每个Proposal分配一个ZXID
Leader为每一个Follower保存一个队列,发送Proposal,然后Follow保存事务日志到磁盘,然后回复ACK,Leader收到过半ACK后广播Commit,然后Follow提交Commit
崩溃恢复
ZAB保证如果一个事务的Proposal在一台机器上被处理成功,那么应该在所有的机器上都处理成功,两种特征
- ZAB协议需要确保已经在Leader服务器上确认的事务最终被所有的服务器都提交
- ZAB协议需要确保丢弃那些只在Leader服务器上被提出的事务
谁是Leader:让所有机器中拥有最高的Proposal ZXID的Follower做Leader
步骤分成三步:发现、同步、广播
- 步骤 F.1.1 Follower F 将自己最后接受的事务Proposal的epoch值CEPOCH(Fp)发送给准Leader L
- 步骤 L.1.1 当接受到来自过半Follower发送的CEPOCH值后,准Leader发送NEWEPOCH(e’)给过半的Follower
- 步骤 F.1.2 赋值并且发送ACK(当前Follower的事务集合)
- Leader选出一个覆盖最全面的Proposal组合
同步阶段
- 将最全面的Proposal组合同步给所有的Follower
广播阶段
e为主进程序列号也是主进程周期
Zookeeper 应用场景
数据发布、订阅
- 实现配置信息的集中式管理和数据的动态更新
- 应用:数据库、机器列表、选项开关
负载均衡 DDNS - 本地host
- 全自动的dns,消费者和服务者、注册中心、检测中心
命名服务 - 全局唯一ID,mysq auto increment 单机有效,UUID太长、含义不明
- 用创建顺序节点的方式实现
分布式协调通知 - 任务调度
Master选举
分布式锁
分布式队列
在我们系统中的应用
数据库等信息的配置
服务地址的配置
分布式锁