ETCD节点故障的容错方案
本文主要探讨etcd集群的高可用容错方案和容错能力的探讨。在出现单机故障时相关的容错方案,如果故障的节点是Leader,重新选择Leader的选主逻辑,以及集群的恢复方案。由于单节点已经保存保存了所有数据,因此集群出现节点异常时,只需要重新选举出Leader即可,不需要进行数据迁移、副本备份等操作。
更多关于分布式系统的架构思考请参考文档关于常见分布式组件高可用设计原理的理解和思考
1. 选主逻辑
etcd通过Raft协议通过Quorum机制进行集群的高可用和保证数据一致性,在节点故障场景下,能够通过选主逻辑,选择新的Leader,重新提供服务。集群最大能够容忍的故障节点数量为 (n -1) / 2
,n表示集群的节点数量(通常要求部署n为单数,如3,5,7)。
选主的目标,是希望选择一个Leader以继续提供服务,分为初始运行选择Leader和运行中Leader出现异常重新触发选主。
1.1 什么样的节点应该成为Leader?
在讨论选主逻辑之前,应该思考一下,什么样的节点应该成为Leader? 因为投票过程需要比较,比较的依据就是按照成为Leader的标准进行参照!
按照etcd的设计,成为Leader的节点应该满足如下条件,在同一个选主周期过程中
- lastIndex(本地数据索引)越大,越容易成为Leader(通常写入的数据越多)
- lastTerm(选票纪元)大的选票有效,代表当前投票的有效性越高
- 获取超过集群半数节点的选票的节点,成为Leader
因此整理出,在投票选主过程中,有效相关因素
属性 | 作用 | 说明 |
---|---|---|
lastIndex | 日志记录单调递增 | 节点lastIndex越大(数据最新),该节点越容易成为Leader |
lastTerm | 选举纪元,单调递增 | 原则上选举纪元大的更有效,如果多个Leader相遇,纪元大有效(规避脑裂情况) |
可以总结出,成为Leader的原则是,在相同选票周期内,选择数据最新的节点成为Leader。
1.2 选主的4个阶段
在同一投票纪元内,只有Follower才能参与投票成为Leader,默认启动时节点的角色都是Follower
1,阶段1: