分布式一致性协议_草稿图
2024-05-16 20:46:53 0 举报
该文件是一个关于分布式一致性协议的草稿图,主要介绍了分布式系统中实现一致性的算法和机制。这种协议对于确保数据在多个节点间保持一致性至关重要,特别是在高可用性和容错性要求较高的场景中。文件中包含了核心算法的描述,以及在实际应用中需要注意的事项。
作者其他创作
大纲/内容
节点B
节点D
撤退
跟随者
我已经到北京了
叛-楚
key-02
节点可以同时作为提议者和接受者
X=1
XA PREPARE 'xid'
节点E
预留操作
节点C
接受者B
Key
Value
Bob
1000
Tom
5000
Lucy
9000
客户端
进攻
撤退:楚、齐
提议者(客户端2)
区块头
区块体
投票给节点A
请求
1.写请求
MySQL
读操作的核心流程
Shard1
节点A
D
key-01
原链被丢弃
叛-燕
韩
魏
2.日志复制RPC
DATA-3
LEADING
客户端向节点1发送写请求
1.预留资源,明天攻打秦国
攻击链被接受成为有效的链
赵
提交请求
DATA
领导者B提议指令Z被成功复制到节点B、C
接受者(节点C)
R
接受者C
C
节点A发起谣言传播
候选人
ZAB状态:DISCOVERY
A、B、C3节点集群发生了分区故障
领导者节点作为唯一提议者
用户C(reader)
2^32-1
交易数
读取R个副本的数据
用户B(reader)
XA COMMIT 'xid'/XA ROLLBACK 'xid'
ZAB状态:SYNCHRONIZATION
DATA-2
2.Success
DATA-1
Read level=2
3,1,102,B
+
进攻:苏秦、楚、燕
C0
2
CommitProcessor
进攻:楚、苏秦、齐
A
撤销操作
DTP模型
上海航空
3.领导者创建包含事务标识符最大值的LEADINFO消息,并响应跟随者
进攻:苏秦、楚
楚
客户端1、2发送接受请求
用户A(writer)
进攻:苏秦
苏秦
调用XA COMMIT来提交事务(或者调用XA ROLLBACK来回滚事务)
2.对比和修复节点C中Shard1、Shard2缺失的数据
更新操作
深圳
预准备阶段
苏秦、齐、燕分别作为指挥官发送作战信息
心跳信息
SET X=7
加密摘要
订票系统
2,1,101,B
处理链1
节点2
苏秦带领赵、魏、楚、韩抗秦
2.将4节点集群变更为5节点集群
客户端访问节点2执行读操作
学习者
Node-B-01
X=2
有效投票信息3,1,102,B3,1,102,C
3节点3副本的InfluxDB集群
准备阶段
攻击链(更长)
扩容A、B、C3节点集群为A、B、C、D、E5节点集群
InfluxDB程序的逻辑架构示意图
写请求
节点
4.1 Yes
时间
RM API
1.设置ZAB状态为成员发现状态
5.跟随者设置ZAB状态为数据同步状态
Alice
3000
Jerry
2000
节点B、C变更ZAB状态为成员发现
齐
节点B、C分别接收来自对方的选票
将x从0更新为1
准备响应[尚无提案]
Node-C-02
GET X
节点A、B、C组成的ZooKeeper集群
插入操作
节点B、C变更节点状态并结束选举
叛将楚向苏秦发送作战指令\"进攻\",向齐、燕发送作战指令撤退\"
4.success
4.领导者将提案广播给集群的所有节点
成功
SendAckRequestProcessor
集群个节点处于跟随者状态
B2
节点1
3.提交日志记录
领导者
Shard2
Shard3
Alice接收并核验消息
0
X<-3
Y<-1
Y<-9
X<-2
X<-0
Y<-7
X<-5
提议者(客户端1)
同时对两个数据库分别执行插入操作和更新操作
楚向苏秦发送作战指令\"进攻\
FOLLOWING
ACK
Raft集群
META
2.检测到连接到领导者的读操作超时,变更状态为LOOKING
key-03
客户端1、2发送准备请求
LOOKING
提交执行阶段
接受者
读操作可以在任何节点上执行
4.推荐自己,并将投票信息广播给所有节点
数据同步的实现流程
请求投票
接受者A
1.跟随者
节点1执行写操作并只将节点1的X值更新为2
撤退:楚、齐、燕
FinalRequestProcessor
原链
Basic Paxos通过二阶段提交来达成共识
Digest-2
接受响应
跟随者发起领导者选举
有效投票信息2,1,101,B
确认操作
预留、撤销、确认操作的关系图
节点A采用拉方式修复自己的数据副本的熵
1。明天攻打秦国
执行两次单节点变更
3.2 Yes
魏明天带兵攻打秦国
叛将楚发送\"撤退\"作战指令
1。明天取消攻打秦国
读请求3
进攻:楚
直接复制缺失的分片数据
其他节点投票给节点A
主节点将提案广播到其他节点
楚(叛徒)
节点A通过反熵修复了节点D中缺失的数据
B
5.跟随者返回NEWLEADER消息的响应给领导者
循环修复各节点的数据差异
2.跟随者将写请求转发给领导者
视图变更消息
主节点
苏秦向齐、楚、燕发送作战指令\"进攻\"
Proxy
日志项
1.1 明天攻打秦国,方便么?
节点C任期编号:4
节点C任期编号:1超时时间:300ms
叛徒楚作为主节点
任期编号
1
3
4
指令
X<-7
Y<-5
Bob发送加密摘要和消息
私钥加密
韩明天带兵攻打秦国
1.明天取消攻打秦国
7.提议的领导者是否赢得大多数选票
操作1
2.1 评估明天是否方便,预留时间,锁定
3.1 Yes
B0
提议者
否
ZAB状态:BROADCAST
进攻:苏秦、齐
1.明天攻打秦国
燕
5.跟随者接收到提案,持久化存储,并返回确认响应给领导者
节点服务器收到读请求就立即响应X的值
DIFFNEWLEADER
1.注册确认操作和撤销操作
撤退:楚、燕
节点A任期编号:1选票:1
生成数字签名
hash(key-01)%3=2
4.成功
3.领导者将缓存的数据发送给跟随者
节点B返回确认响应给节点C并设置ZAB状态为数据同步状态
XA
投票请求RPC
存储
SET X=2
Success
日志完整性高的跟随者拒绝投票给日志完整性低的候选人
1.跟随者接收到写请求
7.当跟随者接收到COMMIT消息后,提交提案,如果是自己接收到写请求,返回成功响应给客户端
创建两条处理链
TM
A0
节点C发生故障
1.对比和修复节点B中Shard1、Shard2缺失的数据
节点C返回差异数据和NEWLEADER消息给节点B
接受者(节点A)
取消阶段
节点C设置ZAB状态为广播状态并发送UPTODATE消息给所有跟随者
3.发起领导者选举
1.2 明天攻打秦国,方便么?
节点B设置ZAB状态为广播状态
TX接口
2.数据
索引值
5
6
7
8
领导者处理不一致日志
调用XA START 和XA END来定义事务分支对应的操作
处理链2
提议者B
客户端1
keyX
节点A采用推拉方式修复自己和节点D的数据副本的熵
苏秦向楚发送作战指令\"进攻\"
P1
接受者(节点B)
3.成功
双花攻击
冷热不均的一致哈希寻址
SyncRequestProcessor
赵发起视图变更
2.2 明天攻打秦国
5.xa_end()
旧配置的大多数,2个节点
CC
撤销
将节点A、B、C映射到哈希环上
当领导者处于稳定状态时,直接进入接受阶段
日志记录索引值
X<-9
X<-1
1.将3节点集群变更为4节点集群
进攻:楚、苏秦
领导者A提议者指令X、Y但指令只成功复制到了节点A
赵明天带兵攻打秦国魏明天带兵攻打秦国韩明天带兵攻打秦国
从深圳经上海中转去北京
备份节点将接收到的写请求转发给主节点
节点B任期编号:1
4.执行返回结果
Sequentially consistent but not linerizable
深圳航空
101:[尚无提案]102:[尚无提案]
齐决定撤退,楚和燕决定进攻
8.xa_close()
由两个节点组成的KV存储系统
InfluxDB
齐、楚转发消息
B1
Write level =2
苏秦向所有将军发送作战指令\"进攻\"
3.3 执行事务
AP
节点B、C正常接收和保存选票
节点A向其他节点发送请求投票RPC消息
2.写请求
执行指令
节点A任期编号:0超时时间:150ms
调用XA PREPARE 来执行提交请求阶段
旧配置大多数,3个节点
提交提案
4.2 Yes
RM
3.领导者接收写请求,创建提案并持久化存储
预留
2.增加1个新节点到4节点集群
Sequentially consistent and linerizable
4.执行操作
C1
区块链的构成
2.跟随者发送FOLLOWINFO消息
验证方
苏秦发消息给赵
客户端请求
摘要
2.解决
3.响应查询到数据给客户端
机票预留成功,则确认并订票
接受阶段
Digest-1
领导者选举的核心实现流程
2.failure
5.提交日志记录
8.当节点提议的领导者赢得大多数选票时,变更节点状态,退出选举
X<-4
领导者创建新的任期编号和事务标识符
2PC
节点A任期编号:1选票:3
成员发现的实现流程
上海
节点A、B、C组成的3节点集群
苏秦、齐、燕分别作为指挥官转发接收到的作战消息
提议者A
hash(key-01)%3=1
叛将楚、燕一个选择发送消息,一个选择默不作声
操作段对端完成的时间。从客户端发起请求开始,到完整收到结果为止
Raft
出现了新旧配置的两个领导者
节点C任期编号:0超时时间:300ms
完成W个副本更新
2.xa_open()
节点1执行写操作并同时将节点1和节点2的X值更新为2
撤退:楚、齐、苏秦
主节点接收到写请求后创建提案
进攻:楚、苏秦、燕
Hash()
Node-A-02
Node-A-01
领导者周期性地发送心跳信息
日志复制
提交请求阶段
苏秦、齐、燕分别作为指挥官转发接收到的作战信息
赵发送新视图消息
1.根据跟随者的事务标识符最大值选择数据同步方式,并将相关数据缓存在发送队列中
2.领导者创建NEWLEADER消息,并缓存在发送队列中
6.领导者等待来自大多数节点NEWLEADER消息的响应
X<5
机票预留失败,则撤销订票请求
P2
ToBeAppliedRequestProcessor
节点B重新推荐节点C作为领导者
需要同时执行操作1、2、3
向深圳航空、上海航空申请机票预留
赵明天带兵攻打秦国
确认
节点A是集群的领导者
LeaderRequestProcessor
Node-C-01
XA规范
读请求2
3.3 Yes
提议者/接受者
节点B返回NEWLEADER消息的确认响应给领导者
数字签名
1.增加1个新节点到3集群
新配置的大多数,3个节点
响应
节点A、D的数据副本不一致
E
有效投票信息2,1,101,B3,1,102,C
公钥解密
读请求1
进攻:苏秦、楚、齐
2.1 明天攻打秦国
节点B、C接收并保存选票
SET X=3
PreRequestProcessor
抗秦队伍中出现了1个叛徒楚
1.读请求
满足分区容错性的两个节点
节点B任期编号:3
服务器响应
节点A、B、C处理再次接收到的准备请求
Client
撤退:楚
1.运算
操作在服务器生效的时刻
7.xa_commit()/xa_rollback()
节点B任期编号:1超时时间:200ms
节点C任期编号:0
节点A、B、C组成的分布式集群
撤退:楚、燕、齐
苏秦向赵发送作战指令\"进攻\"
预留阶段
6.领导者PK
1.客户端请求
跟随者、候选人、领导者对应的图形
3.发送
4.跟随者修复不一致数据
8.跟随者设置ZAB状态为广播状态
节点先接收到自己发送给自己的选票
101:[尚无提案]
FollowerReqeuestProcessor
4.如果领导者合法,响应ACKEPOCH消息给领导者
节点A、B、C处理接收到的准备请求
1.发起全局事务
2.2 评估明天是否方便,预留时间,锁定
UPTODATE
节点B任期编号:0
新增节点D
FOLLOWINFO:1
北京
客户端访问任何节点都能读取到最新数据
请求方
1.接收到读请求
时间轴
对key-01、key-02、key-03进行一致哈希运算
节点A任期编号:4
工作量证明过程
实现虚拟节点
ACKEPOCH
进攻:苏秦、齐、楚
节点C按照\"先来先服务\"的原则进行投票
将节点D加入集群中
A、B、C3节点组成的KV服务
主节点作为提议者接受写请求并执行Basic Paxos实例
5.读取接收到的投票信息
准备阶段,叛徒楚企图通过不发送消息来干扰共识协商
6.领导者等待来自大多数节点的响应ACKEPOCH消息
7.领导者设置ZAB状态为数据同步状态
节点C设置ZAB状态为数据同步状态
4.核验
赵将作战指令广播给魏、韩、楚
节点A采用推方式修复节点D中的数据副本的熵
4.对比和修复节点B中Shard1、Shard2缺失的数据
各将军执行作战指令,并返回执行结果给苏秦
Node-B-02
3种角色
哈希寻址
上一个区块的哈希值区块体的哈希值随机数...
3.2 执行事务
节点C任期编号:1
1.SET X=2
WRITE
6.xa_prepare()
领导者C提议指令Z、Y且指令最终被接受
节点C任期编号:3
2.查询本地数据
提议者C
节点A、B、C组成的Raft集群
3.xa_start()
7.领导者设置ZAB状态为广播状态,并发送UPTODATE消息给所有跟随者
提交阶段,叛徒楚企图通过不发送消息来干扰共识协商
节点B任期编号:0超时时间:200ms
处理写请求的核心流程
没有选票了
区块头相连并最终形成一条区块链
确认阶段
进攻:楚、燕
新增一个节点,寻址发生了变化
主节点接收并处理读请求
节点A将更新数据发送给节点B、D
6.当领导者接收到大多数节点的确认响应后,广播COMMIT消息给跟随者
1.统计投票结果
3.1 执行事务
XA START 'xid'UPDATE executed_table SET status = true WHERE id = 100XA END 'xid'
指令执行系统
节点A赢得大多数选票,成为领导者
2.3 评估明天是否方便,预留时间,锁定
叛将楚向齐和燕发送不同的作战指令
写操作在服务器端生效的时刻。该时刻之前,所有读看到的x的值都为0,该时刻之后,所有读看到的x的值为1
ProposalRequestProcessor
不会同时存在旧配置和新配置两个\"大多数\"
主节点和备份节点提交提案
3.对比和修复节点A中Shard1、Shard2缺失的数据
节点B任期编号:4
3节点2副本的DATA集群
5.通过日志复制RPC持续修复不一致日志
READ
将节点E加入集群中
客户端2访问3节点执行写操作
0 条评论
下一页