分布式一致算法:Delta Lake, Hudi 与Iceberg | 青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第4天。
Raft 共识算法
Chobby:谷歌内部的zookeeper
Raft 算法
复制状态机
用户的状态机:可能是用户内存的B+树 状态机volatile:状态机挂了之后可能会清零,这时候raft会对一条条log进行恢复,恢复到raft认为正确的commit index
Raft 角色
Raft 日志复制
Raft 从节点失效,如何处理?
s3 确认的时候,会迭代地协商回退:
s2 : K前面是Q
s3:不行
s2:Q前面是T
s3:不行
s2:T前是X
s3:OK,我全补全了我缺失的log了
Raft Term
Raft 主节点失效:跨Term操作(新的leader会有新的term)
Raft Leader failure 例子
数字大的term永远是更加新的,约到新的term就会同意
冲突的log:因为raft强leader base,冲突之后leader会继续给后面的log,直到有一个match之后,会覆盖冲突的log
Raft 安全性-Raft为什么安全
同 term
至多只有一条log的原因:因为一个term只有一个leader
跨term
leader 永远有上一个term的commit log
Raft 安全性验证
会把整个运行过程抽象成状态集合,对所有状态进行穷举,从而验证了正确性
使用 Raft 算法重新打造KV数据库
方案选择
方案一基本没人使用,因为读log都写入磁盘
问题:
Raft 不保证一直有一个leader
读操作不能直接读,因为KV3挂掉之后不能和kv1和 kv2 通信
解决方法
操作跨Raft组
情况:qps特别高,leader忙不过来,或kv量溢出
只用一致性已经不够描述这种情况,会涉及事务
回到共识算法
snapshot:从0开始到这条snapshot的log都可以替换掉 configuration chage:一个时间可能选出多个leader
Raft 一定正确吗?
实践中的leader有可能会被candidate打扰,实际情况是很复杂的
共识算法的未来
- 高性能
- 多节点提交
- Raft Paxos 相互移植
- 共识算法作为一个系统