bigywater.tech
MongoDB · 70

hidden 与 delayed 成员

hidden 和 delayed 成员有什么用?客户端看不看得到?delayed 能不能当误删的后悔药?这篇配了一个 P + S + hidden + hidden delayed 的副本集,逐个验证,并发现延迟成员有投票权时的代价。

100 / 0 / 0 次
secondary 读偏好下 100 次读落在普通 secondary / hidden / delayed 成员上的次数
8.1 s
延迟成员 D 上看到新写入所需时间(普通 secondary 0.00 s)
8.0 s
延迟成员有投票权时,停掉普通 secondary 后 w:majority 的耗时

hidden

实测 · 本机执行输出
  replSetGetStatus 里的全部成员: 9901=PRIMARY, 9902=SECONDARY, 9903=SECONDARY, 9904=SECONDARY
  primary 的 hello.hosts(客户端能看到的成员): ['9901', '9902'];hello 里没有的: ['9903', '9904']
  配置里的每个成员: 9901: priority=2.0 votes=1 hidden=False secondaryDelaySecs=0; 9902: priority=1.0 votes=1 hidden=False secondaryDelaySecs=0; 9903: priority=0.0 votes=1 hidden=True secondaryDelaySecs=0; 9904: priority=0.0 votes=1 hidden=True secondaryDelaySecs=8
  hidden 成员自己的 hello:hidden = True,secondary = True

hidden 成员不出现在 hello.hosts,驱动看不到它,读偏好永远选不到;它照常复制数据、可直连读,常用于备份和报表。priority 必须为 0,但仍可投票。

不会被选中

实测 · 本机执行输出
  100 次 secondary 读的分布: {'9902': 100}(H=9903、D=9904 都没有出现;只有 S=9902)

secondary 读偏好下 100 次读全部落在普通 secondary 上。

delayed

实测 · 本机执行输出
  向 primary 写 {_id: 1}(w:3)后,直连 H 读: True

配置 secondaryDelaySecs: 8 后,延迟成员比主节点晚 8 秒应用写入。

后悔药

实测 · 本机执行输出
  _id=2 在 primary 上写入后,普通 secondary S 上 0.00 s 就能读到;延迟成员 D 上 8.1 s 才出现(secondaryDelaySecs = 8)

误 drop 集合后,延迟窗口内延迟成员上的数据还在,读出来写回 primary 即可。

投票权的代价

实测 · 本机执行输出
  primary 上 drop 了 precious;primary 上还有 0 个文档
  S 上 0 个;D 上(延迟窗口内)100 个
  从 D 读出 100 个文档,写回 primary:primary 上现在有 100 个(数据救回来了)

延迟成员若有投票权,会参与多数计算:停掉普通 secondary 后 w:majority 要等延迟成员,慢了整整一个延迟时长;延迟成员通常配 votes: 0。

oplog 窗口

实测 · 本机执行输出
  停掉 S 后 w:majority 的 insert 耗时 8.0 s(≈ 延迟 8 s:要等延迟成员 D 应用这次写入)

延迟成员需要比延迟时长更大的 oplog 窗口(这里没有量化)。

分步演示

hidden 与 delayed 成员
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / MongoDB 9.0.2(Homebrew 的 mongod、mongos)/ mongosh 2.12.0 / pymongo 4.18.3;每个实验在临时目录里起全新的 mongod(独立 dbpath,端口 9900 以上,只监听 127.0.0.1,WiredTiger 缓存 0.25 GB),需要副本集或分片集群时在本机起多个进程;命令输出来自真实的 mongosh,批量写入、计时与多线程用 pymongo;计时用 time.perf_counter,数字每次运行会有小幅抖动,ObjectId、时间戳等每次运行都不同。4 个 mongod 副本集(oplog 128 MB),延迟 8 秒(实际使用常设几小时);所有节点在本机
    • 没有验证:延迟成员 votes: 0 时 w:majority 不受影响(只验证了有投票权时的拖慢);延迟成员的 oplog 窗口需求;hidden 成员在选举中的行为(priority 0 不能当选);hidden 成员对 mongos 与驱动拓扑发现的影响;延迟成员上的 rollback;误删后用 delayed 节点做时间点恢复的完整流程
    京ICP备2026067502号-1京公网安备11010502063487号