0

0

怎么防止MongoDB中的慢查询导致备库同步延迟_备库回放Oplog的并发机制

P粉602998670

P粉602998670

发布时间:2026-03-15 10:03:31

|

300人浏览过

|

来源于php中文网

原创

慢查询本身不进Oplog,真正拖慢备库的是主库长锁操作(如无索引批量写、长事务),导致Oplog生成延迟或打包成大条目,而备库回放受单集合串行、线程数限制等约束,无法并行消化,故需从主库源头优化Oplog“轻量化”。

怎么防止mongodb中的慢查询导致备库同步延迟_备库回放oplog的并发机制

为什么慢查询会让备库同步延迟

备库回放 Oplog 本质是串行重放主库的写操作日志,但「慢查询」本身不直接进 Oplog——真正拖慢备库的是主库上那些持有写锁(或文档/集合级锁)时间过长的操作,比如未加索引的 updateManydeleteMany,或者带复杂聚合管道的 find 配合 $out。这类操作在主库执行时阻塞了 Oplog 写入节奏,导致备库能拿到的 Oplog 条目变少、间隔拉长;更关键的是,一旦主库出现长事务(MongoDB 4.0+ 支持多文档事务),整个事务的 Oplog 会打包成一条 applyOps,备库必须等整条执行完才算回放成功,中间无法拆解。

如何识别正在拖慢 Oplog 回放的查询

别只盯着 db.currentOp() 看「运行时间长」的查询——重点查那些正在修改数据、且尚未提交的活跃操作:

  • 在主库运行 db.currentOp({ "secs_running": { "$gt": 5 }, "secs_running": { "$exists": true } }),过滤出运行超 5 秒且非空闲的 op
  • 重点关注 secs_running 高 + ns 是业务集合 + secs_running 持续增长的 updatecommand 类型操作
  • 检查备库的 rs.printSecondaryReplicationInfo() 输出中 syncSourceHostoplogWindowSecs 差值是否持续扩大——差值 > 300 秒就说明回放已明显滞后
  • mongostat --host <secondary_host> -u <user> -p <pwd></pwd></user></secondary_host> 观察 netInnetOut 均低,但 repl 列长期为 0,大概率是备库卡在某条 Oplog 上

备库 Oplog 回放并发机制的真实限制

MongoDB 的备库默认**不是按 Oplog 时间戳并行回放**,而是按「逻辑时间线分组」:同一事务内的操作必须串行;不同事务间,只要不涉及相同 namespace(数据库.集合),才可能并发。但这个并发粒度受两个硬约束:

  • replWriterThreadCount 默认仅 16(4.4+ 可调,但上限建议 ≤ CPU 核数 × 2),超过该数的 namespace 并发写入会被排队
  • 所有对同一个 ns 的写操作强制串行,哪怕它们属于不同事务——这是为了保证单集合内操作顺序与主库一致
  • 如果主库有大量针对同一集合的短更新(如 inc 计数器),备库反而比主库更容易因锁竞争卡住,因为回放线程要争抢该集合的写锁

所以「增加并发线程数」对缓解慢查询导致的延迟基本无效,真正有效的是减少主库端产生长锁的操作密度。

小微助手
小微助手

微信推出的一款专注于提升桌面效率的助手型AI工具

下载

最有效的预防手段:从主库源头控制 Oplog 负载

与其在备库调参数,不如让主库产生的 Oplog 更「轻」、更「碎」、更「可预测」:

  • 禁用 updateMany / deleteMany 在无索引字段上的批量操作;改用带 _id 或索引字段的循环单条更新,每条生成独立 Oplog 条目,避免单条 Oplog 占用数秒
  • 对大集合做迁移或清理,用 mongodump + mongorestore 替代在线 aggregate + $out,后者会在主库生成巨量 Oplog 并阻塞其他写入
  • 开启 slowOpThresholdMs(如设为 100),配合 db.setProfilingLevel(1) 抓出所有 ≥100ms 的写操作,定期分析 system.profilemillis 高且 ns 集中的条目
  • 在应用层控制写入节奏:比如把每秒 500 次小更新,匀到 50 批 × 每批 10 条,中间加 sleep(10),比一股脑发过去更利于备库消化

Oplog 不是日志文件,它是备库同步的唯一事实来源;主库上任何让写入「变重」的动作,都会在备库被放大成同步延迟——这个因果链藏得深,但压根绕不开。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mongodb启动命令
mongodb启动命令

MongoDB 是一种开源的、基于文档的 NoSQL 数据库管理系统。本专题提供mongodb启动命令的文章,希望可以帮到大家。

267

2023.08.08

MongoDB删除数据的方法
MongoDB删除数据的方法

MongoDB删除数据的方法有删除集合中的文档、删除整个集合、删除数据库和删除指定字段等。本专题为大家提供MongoDB相关的文章、下载、课程内容,供大家免费下载体验。

161

2023.09.19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1007

2023.11.02

mongodb有哪些应用领域
mongodb有哪些应用领域

mongodb 的应用领域涵盖广泛,包括内容管理系统、社交媒体、分析、移动应用、物联网、金融科技、医疗保健和广告技术等领域,因其灵活性、可扩展性和易用性而广受欢迎。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

345

2024.04.02

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

501

2024.04.02

mongodb安装失败如何彻底删除
mongodb安装失败如何彻底删除

彻底删除 mongodb 安装失败的步骤:1、停止和禁用 mongodb 服务;2、删除配置文件、数据目录和日志文件;3、删除 mongodb 二进制文件;4、卸载 mongodb 套件(如果通过软件包管理器安装);5、删除 mongodb 用户、组和目录;6、重启系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

381

2024.04.02

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号