6.824 分布式系统 Chain Replication && CRAQ
2023-10-30 18:00:00
# Papers
朴素 Chain Replication
背景
在诸如 Primary/Backup
, Raft
, Paxos
这类的备份模型中, Leader
这类的节点需要向所有节点进行广播从而实现同步, 但是在服务器不断增加的情况下主节点承受的压力越来越大, 所以就出现了性能瓶颈
链式复制 (Chain Replication
) 被提出
主要思路是每个节点只向一个节点发送同步请求
架构
以 Fail-Stop
为基础
- 服务器失效了就停止服务
- 环境有能力知道哪个服务器故障了
永不失败的 Master
假设有一个永不失败的 Master
(可以理解为 Paxos/Raft/Zab
集群)
- 实现心跳
- 通知链上服务器它的前后节点
- 通知客户端链的头尾节点
实现
每个节点:
维护 Pending
表示未处理完成的请求
维护 Hist
存储 Tail
已经 update
完成的请求
写请求从 Master
到 Head
, 之后依次传递到每个节点
读请求访问 Tail
节点, 返回 Tail
节点本地的数据
容错
头节点故障
头节点存储的 Pending
请求全部丢失
尾节点故障
倒数第二个节点的 Pending
全变成 Hist
, 它成为新的尾节点
中间节点故障
每个服务器存储一个 send
, 表示往后续节点发送了请求, 但是尾节点没有处理过的请求
尾节点处理之后, 向前置节点发送 ACK
让其删除 send
Master
通知它的前置后继节点让其更新
CRAQ
主要思想
主要思想是均摊 Tail
节点处理读请求的压力
- 每个节点存储多个版本
- 当节点接收到新版本时附加到版本库中
- 如果该节点不是
Tail
节点, 那么设置为dirty
状态 - 如果该节点是
Tail
, 那么标记为clean
, 向回传ACK
- 当节点收到后继节点传来的
ACK
消息时, 删除版本库中所有的内容, 然后标记为clean
处理读请求
- 如果
object
的最新版本状态为clean
, 那么直接返回 - 如果
object
的最新版本状态为dirty
, 向Tail
请求最新版本号, 并返回该版本的值
隐式 clean/dirty
如果只有一个版本, 那么就是 clean
, 否则就是 dirty
一致性模型
CRAQ
提供三种强一致性模型
- 强一致性模型: 从任意节点读取到最新版本的数据
- 最终一致性模型: 返回节点已知的最新版本数据(
clean
) - 具有最大不一致边界的最终一致性: 返回最新版本数据 (
dirty
)