MongoDB副本集只读节点(Read-Only)怎么配置_仅用于报表的专用节点策略
MongoDB副本集只读节点需组合配置hiddenpriority:0slaveDelay并强制客户端直连单节点directConnectiontrue禁用自动发现否则仍可能被误写。如何让 MongoDB 副本集节点真正只读不接受写入副本集里的 secondary 节点默认就是只读的但「只读」只是指它不参与写入主流程一旦被手动设为 priority: 0 hidden: true slaveDelay还要防住应用层误连、驱动自动重选、以及 readPreference 配置不当带来的写穿透风险。关键不是「能不能读」而是「会不会被当成可写节点用」。真实踩坑点是报表服务连上了这个节点但驱动在连接字符串里写了 readPreferenceprimary结果所有查询还是打到 primary —— 白配了。rs.add({ host: report-node:27017, priority: 0, hidden: true, slaveDelay: 3600 })必须同时设 hidden: true否则 mongos 或客户端仍可能把它列入可用节点列表节点启动时加 --setParameter enableLocalhostAuthBypass0 并确保没开 bind_ip: 0.0.0.0避免运维直连绕过权限控制在该节点的 mongod.conf 里显式写 setParameter: { enableLocalhostAuthBypass: false }有些版本默认开启会导致本地 root 仍能写报表应用连接时如何强制走只读节点靠节点配置不够客户端必须配合。MongoDB 不会因为节点 hidden 就自动把读请求路由过去你得告诉驱动“就在这台机器上读别挑”。常见错误是以为加了 readPreferencesecondary 就万事大吉——其实它只会从所有 secondary 中选一个而你的报表节点是 hidden 的根本不会被选中。Java 驱动要用 directConnectiontrue readPreferenceprimaryPreferred或 secondaryPreferred都不行必须用 connectWithNoPrimaryfalse 配合单节点 URImongodb://report-node:27017/db?directConnectiontruereadPreferenceprimaryNode.js 驱动同理new MongoClient(mongodb://report-node:27017, { directConnection: true })然后所有操作都走这个 client别混用 replicaSet 连接串Python PyMongo 同样禁用 replica set discoveryMongoClient(mongodb://report-node:27017, directConnectionTrue)否则它会尝试拉取 replica set 配置发现节点 hidden 就跳过为什么不能只靠 db.fsyncLock() 或 readOnly: truefsyncLock() 是全局阻塞写入会影响整个实例包括后台复制线程而且 4.2 已废弃readOnly: true 是 mongod 启动参数但它只限制本机 socket 连接对远程连接无效也不影响复制协议本身。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器