etcd 使用的 Raft 算法和 Zookeeper 使用的 ZAB 算法都是使用复制日志来更新状态机。
我想知道是否可以通过简单地使用领导者选举和版本化值来设计一个类似的系统。以及为什么这些系统决定使用复制日志。
如果我们有以下设置,我就是我的例子
- 机器 A(Leader),包含版本 1
- 机器 B(跟随者),包含版本 1
- 机器 C(跟随者),包含版本 1
写入将是这样的:
- 机器 A 接收写入请求并存储待处理的写入 V2
- 机器 A 向机器 B 和机器 C 发送准备请求
- 追随者(机器 B 和机器 C)向领导者(机器 A)发送确认
- 领导者(机器 A)从机器的 quorum 收到确认后,它知道 V2 现在已提交,并向客户端发送成功响应
- Leader(机器 a)向 Follower(机器 A 和机器 B)发送 finalize 请求,通知他们 V2 已提交,V1 可以被丢弃。
为了使该系统正常工作,在获得领导者租赁后领导者发生变化时,领导者机器必须通过在接受请求之前从节点的法定人数中读取来获取最新的数据版本。