知识卡片

引入递增Election ID:用显式编号替代保守等待,缩短故障恢复时间

普通读书笔记卡

内容

MongoDB复制集早期的选举协议存在一个明显的效率问题:同一轮选举中一个节点无法给两个候选人投票(这本是必要的正确性约束),但每投出一票后,系统需要等待固定的30秒才能进入下一轮选举,这个固定等待时间在选举失败需要重试时会直接拖长故障恢复的时间(MTTR,平均恢复时间)。3.2版本之后的改进是引入一个”election ID”——每发起一轮新的”election attempt”就递增一次这个ID,用它来精确标识和区分每一轮选举,系统由此可以更快地判断出当前是哪一轮选举、是否可以立即进入下一轮,不再需要依赖一个保守的固定等待时间来规避混淆。这类”用一个单调递增的轮次标识区分不同尝试”的手段,是分布式共识协议中常见的通用技巧(类似Raft的term编号),核心作用是把原本靠”保守等待”来避免歧义的机制,替换成靠”显式编号”来快速、准确地判断状态,从而缩短故障恢复时间。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.11 MongoDB2015回顾:全新里程碑式的WiredTiger存储引擎"节,"6.11.2 复制集改进"(源文件:_epub-src/OEBPS/Text/Chapter6_11_3.xhtml) - 结论依据:原文说明"引入election ID来加速election progress,在这之前每轮选举无法给2个节点投票,并且每投票一次需要等待30秒才能进行下一轮,而引入election ID后可以加速这个进程,从而降低MTTR……简单来说election ID在每次'election attempt'的时候递增,用来区分每一轮的选举",直接支撑本卡片结论。 - 原始内容:引入election ID来加速election progress,在这之前每轮选举无法给2个节点投票,并且每投票一次需要等待30秒才能进行下一轮……election ID在每次"election attempt"的时候递增,用来区分每一轮的选举。