MongoDB 5.0至6.0社区版滚动升级服务受影响,咨询无停机方案
MongoDB 5.0→6.0滚动升级避免服务停机的解决方案
问题背景
在将MongoDB 5.0社区版分片集群滚动升级至6.0版本时,分片成员重启阶段出现服务异常,mongos日志中频繁出现以下错误:
{"t":{"$date":"2024-01-25T23:42:57.217+01:00"},"s":"I", "c":"QUERY", "id":4625501, "ctx":"conn573535","msg":"Unable to establish remote cursors","attr":{"error":{"code":40414,"codeName":"Location40414","errmsg":"BSON field 'DatabaseVersion.timestamp' is missing but a required field"},"nRemotes":0}} {"t":{"$date":"2024-01-25T23:42:57.383+01:00"},"s":"I", "c":"QUERY", "id":4625501, "ctx":"conn573498","msg":"Unable to establish remote cursors","attr":{"error":{"code":40414,"codeName":"Location40414","errmsg":"BSON field 'DatabaseVersion.timestamp' is missing but a required field"},"nRemotes":0}} {"t":{"$date":"2024-01-25T23:42:57.530+01:00"},"s":"I", "c":"QUERY", "id":4625501, "ctx":"conn573550","msg":"Unable to establish remote cursors","attr":{"error":{"code":40414,"codeName":"Location40414","errmsg":"BSON field 'DatabaseVersion.timestamp' is missing but a required field"},"nRemotes":0}}
重启mongos后服务恢复,但违反了滚动升级无停机的预期。
错误原因
该错误源于版本兼容性问题:5.0版本的mongos无法识别6.0分片节点返回的DatabaseVersion结构中的timestamp必填字段,导致无法建立远程游标,进而影响查询请求处理。
避免停机的升级步骤
1. 严格遵循正确的升级顺序
分片集群滚动升级必须按以下顺序执行,彻底避免跨版本交互的兼容性问题:
- 第一步:升级配置服务器集群:逐个停止配置服务器,升级至6.0版本后重启,等待集群同步完成,再处理下一个节点。
- 第二步:升级所有mongos实例:滚动升级每个mongos,一次只升级一个,确认该mongos重启后正常处理请求,再继续下一个。确保所有mongos都升级到6.0后,再开始升级分片节点。
- 第三步:升级分片节点:
- 先升级分片集群中的所有次级节点:停止次级节点,升级至6.0后重启,等待节点完成数据同步、状态变为
SECONDARY后,再处理下一个次级节点。 - 最后升级分片主节点:执行
rs.stepDown(600)将主节点降级为次级,等待集群选举出新的主节点,再停止原主节点进行升级,重启后加入集群。
- 先升级分片集群中的所有次级节点:停止次级节点,升级至6.0后重启,等待节点完成数据同步、状态变为
2. 升级前的关键准备
- 全量备份集群数据:使用
mongodump或其他备份工具备份所有数据库,确保升级失败时可快速恢复。 - 检查集群健康:确认所有节点状态正常,次级节点数据延迟在可接受范围内,配置服务器集群无异常。
- 测试环境验证:先在测试集群完成升级流程,验证应用与MongoDB 6.0的兼容性,提前发现潜在问题。
3. 升级中的监控
- 实时监控mongos和分片节点的日志,一旦出现异常及时处理。
- 监控应用的请求成功率和延迟,确保滚动升级过程中服务可用性符合预期。
内容的提问来源于stack exchange,提问作者R2D2
相关产品推荐
相关产品推荐

