必须先将所有节点的featureCompatibilityVersion设为"7.0",再升级至8.0;否则启动失败或集群拒绝升级。需逐个检查并设置FCV,然后滚动升级mongos和分片副本集,严禁跨分片并行升级主节点。

必须先确保所有节点都运行 7.0,且 featureCompatibilityVersion 已设为 "7.0",否则 mongod 启动会失败或集群拒绝升级。
检查并确认 featureCompatibilityVersion 为 "7.0"
这是最容易被跳过的前置动作,但跳过会导致升级后节点无法加入集群、日志报 FCV mismatch 或直接崩溃。不是“升级完再改”,而是“改完才能升级”。
- 连接到每个配置服务器副本集的每个成员(包括主从),执行:
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 }) - 连接到每个分片副本集的每个成员(含独立分片),同样执行该命令
- 所有返回结果中必须包含:
"featureCompatibilityVersion" : { "version" : "7.0" } - 若发现某节点仍是
"6.0"或"5.0",需先在该节点上运行:db.adminCommand({ setFeatureCompatibilityVersion: "7.0" }),再重启 mongod
滚动升级 mongos 和分片节点顺序不能错
mongos 是无状态代理,可最先升级;分片节点有数据和复制状态,必须按副本集粒度滚动操作,且禁止跨分片并行升级主节点。
- 先升级全部
mongos实例:替换二进制 → 重启 → 验证mongos --version输出为 8.0 - 对每个分片副本集,单独操作:
- 逐个关闭从节点(
secondary)→ 替换mongod二进制 → 启动 → 等待rs.status()显示stateStr: "SECONDARY"且同步延迟 - 所有从节点升级完成后,对主节点执行
rs.stepDown(),触发选举,让一个已升级的从节点成为新主 - 原主节点降级为从后,再升级它的二进制并重启
- 逐个关闭从节点(
- 配置服务器副本集(CSRS)按相同滚动方式升级,但注意:它必须使用
WiredTiger引擎,且不能含仲裁节点(arbiterOnly: true)
升级后立即验证 balancer 和分片元数据一致性
8.0 对分片路由表缓存和块迁移逻辑有调整,升级后若不检查,可能持续数小时出现查询路由错误或写入被拒绝。
- 连接任意
mongos,确认负载均衡器已启用:sh.getBalancerState()应返回true;若为false,运行sh.startBalancer() - 检查是否有未完成迁移:
sh.status()中查看balancer段是否显示Currently enabled: true,且migrationInProgress为false - 抽查一个分片,确认其本地数据库能正常读写:
use test; db.foo.insertOne({x:1}); db.foo.findOne() - 运行
db.runCommand({ listShards: 1 }),确认所有分片host字段中的端口和地址仍可达,版本号显示为 8.0
最易忽略的是配置服务器的 buildIndexes: false 要求和 CSRS 成员不能含延迟节点——这两项在 7.0 时可能被忽略,但在 8.0 启动校验更严格,会导致配置服务器无法启动。


















