二阶段提交协议(Two-Phase Commit)
ZAB协议(ZooKeeper Atomic Broadcast)
- 作用
- 要解决的问题
- 正确、高效地处理客户端大量的并发请求
- 分布式环境中,要保证一个全局的变更序列被顺序应用
- 容错处理(这一点是基于解决第1点问题使用的 主备模式 而提出)
- 核心概念
- 协议定义
- 并不像Paxos算法那样的通用的分布式一致性算法
- 是一种特别为ZooKeeper设计的崩溃可恢复的原子消息广播算法
- Leader服务器
- Follower服务器
- 基本流程
- Leader负责将一个客户端事务请求转换成一个事务Proposal(提议),并将该Proposal分发给集群中所有Follower
- Leader等待超过半数的Follower进行正确反馈
- Leader向所有Follower分发Commit消息,要求将前一个Proposal进行提交
- 举例
- Zookeeper 客户端会随机的链接到 zookeeper 集群中的一个节点
- 如果是读请求,就直接从当前节点中读取数据
- 如果是写请求,那么节点就会向 Leader 提交事务,Leader 接收到事务提交,会广播该事务,只要超过半数节点写入成功,该事务就会被提交
- 基本模式
- 崩溃恢复
- Leader选举
- 选举出一个Leader,同时Leader会维护一个Follower列表,客户端可以和这些 Follower进行通信
- 协议并没有规定选举算法
- 实现中使用的如:Fast Leader Election
- 数据同步
- Leader要负责将本身的数据与Follower完成同步,做到多副本存储。这样也是提现了CAP中的高可用和分区容错
- Follower将队列中未处理完的请求消费完成后,写入本地事务日志中
- 消息广播
- Leader可以接受客户端新的事务Proposal,将新的Proposal广播给所有的Follower
- 关键概念及理解
- ZAB协议的主备模型(具体的说就是核心概念中的介绍)
- 消息广播是基于具有FIFO特性的TCP协议来进行网络通信的
- 换一种说法:Leader与每一个Follower之间都维护了一个单独的FIFO消息队列进行收发消息
- 消息队列可以做到异步解耦:Leader和Follower之间只需要往队列中发消息即可
- ZAB协议中Leader等待Follower的ACK反馈消息:只要半数以上的Follower成功反馈即可,不需要收到全部Follower反馈
- 崩溃恢复需要保证的两点原则
- ZAB协议需要确保那些已经在Leader上提交的事务Propocal,最终被所有服务器都提交
- ZAB协议需要确保在丢弃只在Leader上提出的事务Proposal (而没有被提交)
参考
https://www.jianshu.com/p/2bceacd60b8a
FastLeaderElection选主算法流程详解
Zookeeper架构及FastLeaderElection机制
ZooKeeper学习
原文:https://www.cnblogs.com/wangzhiyi/p/11298686.html