在 Apache Kudu 的架构中,Raft 分布式一致性协议是如何具体作用于数据写入和读取流程,从而确保副本间一致性的?请说明其核心机制。
考察说明
考查对 Kudu 基于 Raft 协议实现一致性的机制理解。
回答思路
- 【回答框架 1】Kudu 使用 Raft 协议在 tablet 副本间同步日志。写入请求先提交到 leader,通过日志复制到多数派 follower,提交后返回成功,从而保证已提交数据不会丢失,读取可基于已提交日志。
- 【回答框架 2】读取一致性通过 leader 提供线性一致性读实现。每个 tablet 有 leader 和 follower,读取路由到 leader,leader 确保读到最新已提交数据;follower 只用于容错,不直接提供强一致读。
- 【回答框架 3】Raft 的选主机制保证任何时刻只有一个 leader,新 leader 拥有完整已提交日志,避免脑裂。日志条目带任期和索引,多数派投票后才算提交,保证日志一致性。
- 【回答框架 4】写入路径为客户端到 leader,leader 追加日志并并行复制到多数派,收到多数派确认后应用状态机并响应。读取路径为客户端到 leader,直接读取状态机,确保线性一致性。
- 【回答框架 5】Kudu 还支持快照读和可调一致性级别,弱一致性读可路由到 follower,但牺牲实时性;默认强一致读由 leader 处理,确保数据一致。
- 【关键点 1】写入需 leader 将日志复制到多数派并提交后返回成功。
- 【关键点 2】读取默认由 leader 处理,保证线性一致性。
- 【关键点 3】Raft 选主和多数派提交机制避免脑裂,确保唯一 leader。
- 【关键点 4】follower 读取仅用于弱一致性场景,不保证最新数据。
- 【易错点 1】不能将读取一致性泛化为所有场景强一致,存在弱读选项。
- 【易错点 2】Raft 只保证多数派共识,极端网络分区下可能短暂不可用。
- 【易错点 3】不要将日志复制与业务幂等直接挂钩,重试写入仍可能重复。