知识卡片

复用已有复制通道做心跳检测:避免探测机制随节点数增长产生风暴

普通读书笔记卡

内容

MongoDB复制集早期的心跳检测机制,是集群中每个节点默认每2秒就要向集群内所有其他节点各发一次心跳,这种”全节点两两互相探测”的设计,节点数一多,心跳消息的数量会随集群规模膨胀(俗称heartbeat storm),额外占用带宽和处理开销,让集群本身的可用性检测机制反而成了集群的负担。3.2版本之后的改进思路是不再单独开辟一条心跳专用通道,而是复用节点之间原本就存在的复制通道(oplog同步链路),把心跳所需的元数据附带写入oplog里,让上下游节点顺带完成心跳检测,检测速度反而更快。这是一个具有普遍参考价值的设计思路:当某种周期性探测机制(心跳、健康检查)本身会随节点数增长产生显著开销时,与其独立维护一套探测通道,不如让探测信息搭载在系统里本来就存在的常规通信链路上,用已有流量捎带传递状态信息,而不是另开一条专用链路。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.11 MongoDB2015回顾:全新里程碑式的WiredTiger存储引擎"节,"6.11.2 复制集改进"(源文件:_epub-src/OEBPS/Text/Chapter6_11_3.xhtml) - 结论依据:原文说明"在这之前复制集的每个节点默认每2秒会给集群中的每个节点发送心跳,这显然是不……因为这样会随着集群的增加导致'heartbeat Storm'增加集群的overhead。而采用新的算法后每个节点只需要和上下游节点通过在oplog中写入额外的元数据来进行心跳检测,从而提高检测速度",直接支撑本卡片结论。 - 原始内容:在这之前复制集的每个节点默认每2秒会给集群中的每个节点发送心跳……而采用新的算法后每个节点只需要和上下游节点通过在oplog中写入额外的元数据来进行心跳检测,从而提高检测速度。