当前位置:首页 > AI技术 > 正文内容

开发如何强制MongoDB刷新mongos的路由表缓存 flushRouterConfig命令与场景|Duuu笔记

admin7天前AI技术26

生产环境中的前端应用实践

flushRouterConfig 是唯一能强制 mongos 立即重载全部路由表的命令,需在每次分片增删、chunk 变更或 config server 异动后手动执行,否则路由错误导致查不到数据或写入失败。

mongos 路由表不更新?

flushRouterConfig

是唯一能立刻生效的命令

当分片集群新增或删除分片、修改 chunk 分布(比如手动迁移、split 或 merge)、或者 config server 配置变更后,

mongos

不会自动同步最新路由信息——它依赖缓存,且默认刷新间隔长(通常 30 秒以上),甚至可能卡住。此时查询会路由到错误分片,返回空结果或

NamespaceNotFound

,写入可能失败或写错地方。

flushRouterConfig

是唯一能强制它立即重载全部路由表的命令,不是“建议”,是必要操作。

常见错误现象:

sh.status()

显示 chunk 已迁移完成,但应用查不到数据;刚添加分片后

sh.addShard()

返回成功,但

db.collection.find()

ShardNotFound

;config server 重启后 mongos 仍用旧配置。

必须在

mongos

实例上执行,不能连 config server 或 shard 执行

命令格式极简:

db.runCommand({flushRouterConfig: 1})

,无参数、无返回值(成功时返回

{"ok": 1}

影响范围是当前连接的这个

mongos

进程,不是整个集群;多个 mongos 需各自调用

执行期间该 mongos 短暂阻塞新请求(毫秒级),但不会中断已有连接

哪些操作后必须手动刷?不是所有变更都触发自动刷新

自动刷新只响应部分 config server 的元数据变更事件,很多运维动作它根本收不到通知,尤其涉及底层状态不一致时。别信“等一会儿就好”。

执行过

sh.addShard()

sh.removeShard()

后——即使命令返回成功,mongos 缓存仍指向旧分片列表

手动调用

sh.splitAt()

sh.moveChunk()

或直接写 config 数据库改

chunks

集合后——自动刷新常延迟或失效

config server 发生主从切换、重启,或网络短暂中断恢复后——mongos 可能维持断连前的旧视图

升级 MongoDB 版本后首次启动 mongos——某些版本(如 4.2→4.4)会沿用旧缓存,导致路由混乱

flushRouterConfig

invalidateShardMetadata

别混用

后者是针对单个数据库/集合的元数据失效命令,作用域窄、开销小,但无法解决分片拓扑变更问题。它只清本地缓存的 collection-level 分片键、chunk 范围等,不碰分片列表、zone 配置、config server 地址这些全局路由信息。

白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

invalidateShardMetadata

的场景:某个集合的 chunk 分布被绕过 sharding 命令直接修改(如误删 config.chunks 文档),且只想让 mongos 忘掉这个集合的路由

flushRouterConfig

的场景:任何影响

mongos

对“哪个分片管哪段 key”的整体判断的操作

两者不互斥,但顺序重要:先

flushRouterConfig

拉全量路由,再按需

invalidateShardMetadata

清局部——反过来没用

注意:

invalidateShardMetadata

在 5.0+ 已废弃,替代方案是

refreshCollection

,但依然不解决路由表问题

生产环境调用前必须确认的三件事

这命令本身安全,但时机不对会放大问题。别在流量高峰或 config server 不稳定时乱刷。

确认目标

mongos

连接的是健康的 config server 主节点(查

db.isMaster()

输出里的

primary

字段)

检查 config server 的

config.version

config.shards

是否已同步完成(对比各 config server 上

db.version.findOne()

db.shards.find()

如果是滚动更新多个 mongos,避免所有实例同一秒刷——用秒级错峰(如 sleep 0.5s),否则瞬时大量 config 查询可能压垮 config server

最容易被忽略的是:刷完之后不验证。执行完立刻跑一句

sh.status()

db.getSiblingDB("config").chunks.findOne({ns: "db.coll"})

,确认输出和 config server 一致。缓存刷了,但 config 本身没更新,那还是白忙。

相关文章

【大数据分析 | 深度学习】在Hadoop上实现分布式深度学习

一、Submarine(Hadoop生态系统) (一)Submarine 介绍 (三)Submarine 属于 Hadoop 生态系统 (四)Submarine 官网版...

什么是LLM?看这一篇就够了!

一、全套AGI大模型学习路线 AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能! 二、640套AI大模型报告合集 这套包含640份报告的合集,涵盖了AI大...

【DL】2023年你应该知道的 10 大深度学习算法

3. 循环神经网络 (RNN) 4. 生成对抗网络 (GAN) 5. 径向基函数网络 (RBFN) 6. 多层感知器 (MLP) 7. 自组织图 (SOM)...

什么是人工智能 ?

您可以使用 ML 训练 AI,使其精确、快速地执行任务。这可以通过自动化员工感到吃力或厌烦的业务部分来提高运营效率。同样,您可以使用 AI 自动化来腾出员工资源,用于更复杂和更具创造性的工作。...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

前端开发实战详解:骡子快跑怎么注册账号 骡子快跑账号注册流程最佳实践|Duuu笔记

骡子快跑注册仅需1分钟,但激活码需从Discord指定频道获取,输错3次将锁账户24小时;积分与注册邮箱强绑定且不可更换;部分地区即使注册成功也无法运行Agent。 ☞☞☞AI 智能聊天, 问答助手...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。