首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB 插入更新数据慢,开发问哪的问题? 附带解决方案和脚本

MongoDB 插入更新数据慢,开发问哪的问题? 附带解决方案和脚本

作者头像
AustinDatabases
发布2024-11-25 10:52:55
发布2024-11-25 10:52:55
27500
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

上一篇关于MongoDB的8个脚本的帖子火了,好多人入群差不多一上午20个吓了我一跳,看来MongoDB的号召力还是比较大,很多人还是有一些MongoDB的困扰和问题的,今天咱们就来一个疑难杂症的解决方案,并且给大家一个解决的脚本。

瞬间成为MongoDB专家,8个脚本都写好了,一用一个不吱声

(顺便说一句,认为脚本有问题的,进群问,不是脚本的问题,是有的脚本为了安全,有的地方你的自己稍微改几个字)

今天的问题是,如果有开发问你,MongoDB插入速度慢,你怎么解决??

说到这个问题,可能很多人都会有疑问,MongoDB插入慢,不会呀MongoDB插入数据很快呀,怎么会慢,是的MongoDB插入(更新)数据在普通情况上是很快的,不会有什么问题,但你是否留意过以下集中情况。

1 数据库在频繁的进行大量数据的插入,而你的数据插入就会被影响,在同一个collecion。

2 数据库在进行查询(慢查询),而你要进行数据的更新,这二者如果是同一条数据,就有产生锁

3 副本集中插入数据或更新数据采用了多节点确认的情况或本身副本集中的节点较多,比如5个7个等,而且你选择了write concern,或者确认多个节点写成功后,才能commit的情况下,那必然是慢。

通用的方案中,我们一般采用Mongotop, 来观察MongoDB的总的读取和写入的时间

代码语言:javascript
代码运行次数:0
运行
复制
ns                         total    read    write
application.phonenumber     100ms    60ms    40ms

但是这样的方案并不解决问题,主要是开发会问到底因为什么慢??你凭上面的东西能说清楚吗?还是你要看慢查询,慢查询解决的了问题吗???

当然这里有人说,我们用mnogostat 里面有locked 的这个百分比,说明在监控中这个数据库有多长时间在锁定的状态,当然这是一个方案,但参见我们上面的问题,开发问到底是什么锁,锁定的,怎么锁定的。

你这时就傻眼了,不知道怎么办了,这个帖子的就在这里等你呢, 通过下面的脚本,实时监控你的数据库到底是哪个操作在被锁定,锁定了什么,怎么锁定的,什么锁锁定的。

下图是脚本执行时的打印,一秒打印一次,如果在一秒中有任何的写入,查询被锁,都会打印出来。脚本是通过Node.js 撰写的,如果对这个部分敢兴趣,Node,js 如何安装等,可以参考,下面文章,里面有一部分关于如何安装Node.JS 和如何运行,当然PG 运行Node.js比MongoDB 要麻烦一些,终究MongoDB 原生支持Node.js.

PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜

代码语言:javascript
代码运行次数:0
运行
复制
[mongo@mongo4 ~]$ mongosh mongodb://root:1234.Com@192.168.198.100:27027/admin --file checklock.js 
[2021-12-14T21:54:10.374Z] No operations waiting for lock.
[2021-12-14T21:54:11.381Z] No operations waiting for lock.
[2021-12-14T21:54:12.410Z] No operations waiting for lock.
[2021-12-14T21:54:13.426Z] No operations waiting for lock.
[2021-12-14T21:54:14.441Z] No operations waiting for lock.
[2021-12-14T21:54:15.464Z] No operations waiting for lock.
[2021-12-14T21:54:16.481Z] No operations waiting for lock.
[2021-12-14T21:54:17.498Z] No operations waiting for lock.
[2021-12-14T21:54:18.517Z] No operations waiting for lock.
[2021-12-14T21:54:19.530Z] No operations waiting for lock.
[2021-12-14T21:54:20.552Z] No operations waiting for lock.
[2021-12-14T21:54:21.569Z] No operations waiting for lock.
[2021-12-14T21:54:22.613Z] No operations waiting for lock.
[2021-12-14T21:54:23.635Z] No operations waiting for lock.
[2021-12-14T21:54:24.653Z] No operations waiting for lock.
[2021-12-14T21:54:25.665Z] No operations waiting for lock.
[2021-12-14T21:54:26.677Z] No operations waiting for lock.
^CStopping execution...MongoshInterruptedError: execution was interrupted、
代码语言:javascript
代码运行次数:0
运行
复制

var db = connect('mongodb://root:1234.Com@192.168.198.100:27027/admin');


function captureWaitingForLockOperations() {
    while (true) {  
       
        var ops = db.adminCommand({ currentOp: 1, "waitingForLock": true });
        
     
        var timestamp = new Date().toISOString();
        
        if (ops.inprog.length > 0) {
            print("[" + timestamp + "] Waiting for Lock Operations Detected:");
            
        
            ops.inprog.forEach(function(op) {
                printjson({
                    opid: op.opid,
                    ns: op.ns,
                    query: op.query,
                    client: op.client,
                    lockType: op.lockType,
                    secs_running: op.secs_running,
                    waitingForLock: op.waitingForLock
                });
            });
        } else {
            print("[" + timestamp + "] No operations waiting for lock.");
        }
        
     
        sleep(1000);
    }
}


captureWaitingForLockOperations();

这个脚本可以马上投入使用,且来探测你系统中是否有锁频繁的发生,且哪个语句被影响了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档