iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MongoDB超大块数据问题解决
  • 388
分享到

MongoDB超大块数据问题解决

MongoDB超大块数据MongoDB大块数据 2023-02-09 10:02:28 388人浏览 八月长安
摘要

目录引言一、mongoDB服务器管理1、添加服务器2、修改分片中的服务器3、删除分片二、均衡器三、修改块的大小四、超大块1、分发超大块2、分发超大块步骤:3、避免出现超大块4、输出内容详解:五、系统分析器六、一些常见的辅

引言

最近项目在使用MonGoDB作为图片和文档的存储数据库,为啥不直接存Mysql里,还要搭个MongoDB集群,麻不麻烦?

让我们一起,一探究竟,继续学习解决MongoDB超大块数据问题,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

一、MongoDB服务器管理

1、添加服务器

可以在任何时间添加mongos进程,只要确保,它们的 --configdb选项指定了正确的配置服务器副本集,并且客户端可以立即与其建立连接。

2、修改分片中的服务器

要修改一个分片的成员,需要直接连接到该分片的主节点,并重新配置副本集。集群配置会检测到变更并自动更新 config.shards

3、删除分片

一般情况下,不应该从集群中删除分片,会给系统带来不必要的压力。

删除分片时,要确保均衡器的打开状态。

均衡器的作用是把要删除分片上的所有数据移动到其它分片,这个过程称为排空。可以通过 removeShard命令执行排空操作。

二、均衡器

可以通过 sh.setBalancerState(false)关闭均衡器。关闭均衡器不会将正在进行的过程停止,也就是说迁移过程不会立即停止。

通过db.locks.find({"_id","balancer"})["state"]查看均衡器是否关闭。0表示均衡器已关闭。

均衡过程会增加系统的负载,目标分片必须查询源分片的所有文档,并将文档插入目标分片的块中,然后源分片必须删除这些文档。

数据迁移是很消耗性能的,此时可以在config.settings集合中为均衡过程指定一个时间窗口。将其指定在一个闲暇时间执行。

如果设置了均衡窗口,应该对其进行监控,确保mongos能够在所分配的时间内保持集群的均衡。

均衡器使用块的数量而不是数据的大小作为度量。移动一个块被称为迁移,这是MongoDB平衡数据的方式。可能会存在一个大块的分片称为许多小分片迁移的目标。

三、修改块的大小

一个块可以存放数百万个文档,块越大,迁移到另一个分片所花费的时间就越长,默认情况下,块的大小为64MB。

但对于64MB的块,迁移时间太长了,为了加快迁移速度,可以减少块的大小。

比如将块的大小改为32MB。

db.settings.save({"_id","chunksize","value":32})

已经存在的块不会发生改变,自动拆分仅会在插入或更新时发生,拆分操作是无法恢复的,如果增加了块的大小,那么已经存在的块只会通过插入或更新来增长,直到它们达到新的大小。块大小的取值范围在1MB到1024MB。

这是一个集群范围的设置,会影响所有的集合和数据库。因此,如果一个集合需要较小的块,另一个集合需要较大的块,那么可能需要在这两个大小间取一个折中的值。

如果MongoDB的迁移过于频繁或者使用的文档太大,则可能需要增加块的大小。

四、超大块

一个块的所有数据都位于某个特定的分片上。如果最终这个分片拥有的块比其它分片多,那么MongoDB会将一些块移动到其它分片上。

当一个块大于 config.settings中所设置的最大块大小时,均衡器就不允许移动这个块了。这些不可拆分、不可移动的块被称为超大块

1、分发超大块

要解决超大块引起的集群不均衡问题,就必须将超大块均匀地分配到各个分片中。

2、分发超大块步骤:

  • 关闭均衡器 sh.setBalancerState(false)
  • 因为MongoDB不允许移动超过最大块大小的块,所以要暂时先增大块大小,使其超过现有的最大块块大小。记录下当时的块大小。db.settings.save({"_id","chunksize","value":maxInteger})
  • 使用moveChunk命令移动分片中的超大块;
  • 在源分片剩余的块上运行splitChunk命令,直到其块数量与目标分片块数量大致相同;
  • 将块大小设置为其最初值;
  • 开启均衡器

MongoDB超大块数据问题解决

3、避免出现超大块

更改片键,使其拥有更细粒度的分片。

通过db.currentOp()查看当前操作,``db.currentOp()```最常见的用途是查找慢操作。

MongoDB Enterprise > db.currentOp()
{
        "inprog" : [
                {
                        "type" : "op",
                        "host" : "LAPTOP-P6QEH9UD:27017",
                        "desc" : "conn1",
                        "connectionId" : 1,
                        "client" : "127.0.0.1:50481",
                        "appName" : "MongoDB shell",
                        "clientMetadata" : {
                                "application" : {
                                        "name" : "MongoDB Shell"
                                },
                                "driver" : {
                                        "name" : "MongoDB Internal Client",
                                        "version" : "5.0.14"
                                },
                                "os" : {
                                        "type" : "windows",
                                        "name" : "Microsoft Windows 10",
                                        "architecture" : "x86_64",
                                        "version" : "10.0 (build 19044)"
                                }
                        },
                        "active" : true,
                        "currentOpTime" : "2023-02-07T23:12:23.086+08:00",
                        "threaded" : true,
                        "opid" : 422,
                        "lsid" : {
                                "id" : UUID("f83e33D1-9966-44a4-87de-817de0d804a3"),
                                "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=")
                        },
                        "secs_running" : NumberLong(0),
                        "microsecs_running" : NumberLong(182),
                        "op" : "command",
                        "ns" : "admin.$cmd.aggregate",
                        "command" : {
                                "aggregate" : 1,
                                "pipeline" : [
                                        {
                                                "$currentOp" : {
                                                        "allUsers" : true,
                                                        "idleConnections" : false,
                                                        "truncateOps" : false
                                                }
                                        },
                                        {
                                                "$match" : {
                                                }
                                        }
                                ],
                                "cursor" : {
                                },
                                "lsid" : {
                                        "id" : UUID("f83e33d1-9966-44a4-87de-817de0d804a3")
                                },
                                "$readPreference" : {
                                        "mode" : "primaryPreferred"
                                },
                                "$db" : "admin"
                        },
                        "numYields" : 0,
                        "locks" : {
                        },
                        "waitingForLock" : false,
                        "lockStats" : {
                        },
                        "waitingForFlowControl" : false,
                        "flowControlStats" : {
                        }
                },
                {
                        "type" : "op",
                        "host" : "LAPTOP-P6QEH9UD:27017",
                        "desc" : "Checkpointer",
                        "active" : true,
                        "currentOpTime" : "2023-02-07T23:12:23.086+08:00",
                        "opid" : 3,
                        "op" : "none",
                        "ns" : "",
                        "command" : {
                        },
                        "numYields" : 0,
                        "locks" : {
                        },
                        "waitingForLock" : false,
                        "lockStats" : {
                        },
                        "waitingForFlowControl" : false,
                        "flowControlStats" : {
                        }
                },
                {
                        "type" : "op",
                        "host" : "LAPTOP-P6QEH9UD:27017",
                        "desc" : "JournalFlusher",
                        "active" : true,
                        "currentOpTime" : "2023-02-07T23:12:23.086+08:00",
                        "opid" : 419,
                        "op" : "none",
                        "ns" : "",
                        "command" : {
                        },
                        "numYields" : 0,
                        "locks" : {
                        },
                        "waitingForLock" : false,
                        "lockStats" : {
                        },
                        "waitingForFlowControl" : false,
                        "flowControlStats" : {
                        }
                }
        ],
        "ok" : 1
}

4、输出内容详解:

MongoDB超大块数据问题解决

  • opid,操作的唯一标识,可以使用这个字段来终止操作;
  • active,操作是否正在进行,如果为false,意味着此操作已经让出或者正在等待其它操作交出
  • secs_running,操作的持续时间,可以使用这个字段查询耗时过长的操作;
  • op,操作类型,通常为query、insert、update、remove;
  • desc,客户端的标识符,可以与日志中的消息相关联;
  • locks,描述操作所涉及的锁类型;
  • waitingForLock,当前操作是否处于阻塞中并等待获取锁;
  • numYields,操作释放锁以允许其它操作进行的次数。一个操作只有在其它操作进入队列并等待获取它的锁时才会让出自己的锁,如果没有操作处于waitingForLock状态,则当前操作不会让出锁;
  • lockStats.timeAcquiringMiros,操作为了获取锁所花费的时间;

通过``db.currentOp()找到慢查询后,可以通过db.killOp(opid)```的方式将其终止。

并不是所有操作都可以被终止,只有当操作让出时,才能终止,因此,更新、查找、删除操作都可以被终止,但持有或等待锁的操作不能被终止。

如果MongoDB中的请求发生了堆积,那么这些写操作将堆积在操作系统的套接字缓冲区,当终止MongoDB正在运行的写操作时,MongoDB依旧会处理缓冲区的写操作。可以通过开启写入确认机制,保证每次写操作都要等前一个写操作完成后才能执行,而不是仅仅等到前一个写操作处于数据库服务器的缓冲区就开始下一次写入。

五、系统分析器

系统分析器可以提供大量关于耗时过长操作的信息,但系统分析器会严重的降低MongoDB的效率,因为每次写操作都会将其记录在system.profile中记录一下。每次读操作都必须等待system.profile写入完毕才行。

开启分析器:

MongoDB Enterprise > db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }

slowms决定了在日志中打印慢速操作的阈值。比如slowms设置为100,那么每个耗时超过100毫秒的操作都会被记录在日志中,即使分析器是关闭的。

查询分析级别:

MongoDB Enterprise > db.getProfilingLevel()
2

重新启动MongoDB数据库会重置分析级别。

六、一些常见的辅助命令

通过Object.bsonsize函数获取其在磁盘中存储大小,单位是字节。

> Object.bsonsize(db.worker.find())
65194

使用mongotop统计哪些集合最繁忙。

使用mongotop --locks统计每个数据库的锁信息。

mongostat提供了整个服务器范围的信息。

以上就是MongoDB超大块数据问题解决的详细内容,更多关于MongoDB超大块数据的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MongoDB超大块数据问题解决

本文链接: https://www.lsjlt.com/news/195283.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MongoDB超大块数据问题解决
    目录引言一、MongoDB服务器管理1、添加服务器2、修改分片中的服务器3、删除分片二、均衡器三、修改块的大小四、超大块1、分发超大块2、分发超大块步骤:3、避免出现超大块4、输出内容详解:五、系统分析器六、一些常见的辅...
    99+
    2023-02-09
    MongoDB超大块数据 MongoDB大块数据
  • 如何解决MongoDB游标超时问题
    这篇文章给大家分享的是有关如何解决MongoDB游标超时问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。当我们使用Python从MongoDB里面读取数据时,可能会这样写代码:...
    99+
    2024-04-02
  • 超出MySQL最大连接数问题及解决
    目录超出mysql最大连接数问题查看最大连接数修改最大连接数MySQL最大连接数,TimeOut配置MySQL连接数配置Mysql的连接线程池Mysql TimeOut配置总结超出MySQL最大连接数问题 如果遇到MyS...
    99+
    2023-05-15
    MySQL最大连接数 MySQL连接数 超出MySQL最大连接数
  • mongodb集群数据冗余问题怎么解决
    在MongoDB集群中,可以采取以下几种方式解决数据冗余问题:1. 副本集(Replica Set):副本集是MongoDB的一种高...
    99+
    2023-09-05
    mongodb
  • 解决MongoDB 排序超过内存限制的问题
    对集合执行一个大排序操作(如聚合),出现以下错误:(测试版本:MongoDB 3.0.6) > db.bigdata.aggregate( {$group : {_id : "$range", ...
    99+
    2024-04-02
  • java web开发中大量数据导出Excel超时(504)问题解决
    import java.io.IOException;import java.io.OutputStream;import java.lang.reflect.Field;import java.text.SimpleDateFormat;...
    99+
    2023-05-31
    java excel 数据导出
  • 超出MySQL最大连接数的问题怎么解决
    今天小编给大家分享的是超出MySQL最大连接数的问题怎么解决,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。超出MySQL最大连接数问题如果遇到MySQ连接数超出最大限制了,不要慌,往...
    99+
    2023-07-06
  • 怎么解决mysql5数据库连接超时问题
    本篇内容主要讲解“怎么解决mysql5数据库连接超时问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决mysql5数据库连接超时问题”吧! ...
    99+
    2024-04-02
  • 如何解决mongoDB数据库添加账号的问题
    这篇文章主要介绍了如何解决mongoDB数据库添加账号的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 以管理员运行powershell2. mongo 连接服务器 ...
    99+
    2023-06-29
  • AndroidIntent传递大量数据出现问题解决
    目录正文异常TransactionTooLargeExceptionIntent携带信息的大小受Binder限制为什么Binder要限制传输数据的大小替代方案正文 官方文档 ...
    99+
    2024-04-02
  • MyBatisPlus 大数据量查询慢的问题解决
    目录常规查询流式查询MyBatis 流式查询接口游标查询大数据量操作的场景大致如下: 数据迁移数据导出批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一...
    99+
    2023-02-05
    MyBatis Plus 查询慢 MyBatisPlus 大数据量查询
  • PHP超出整型数据相加问题怎么解决
    这篇“PHP超出整型数据相加问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP超出整型数据相加问题怎么解决”文...
    99+
    2023-07-06
  • mysql自增id超大问题的排查与解决
    引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败...
    99+
    2024-04-02
  • 如何解决C# Socket发送数据大小问题
    今天就跟大家聊聊有关如何解决C# Socket发送数据大小问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以...
    99+
    2023-06-17
  • 解决MySQL数据库链接超时报1129错误问题
    说明: mysql 为了数据库的安全性默认在链接中断或者错误时记录错误链接的ip 等信息(host_cache),有点像系统的错误日志的一种机制。当同一个ip 异常链接数到达某一阈值(max_connect_errors...
    99+
    2024-04-02
  • VUE 解决方案:解决大数据展示中的常见问题
    面临的挑战 处理和可视化大型数据集时,常见的挑战包括: 加载和渲染时间过长 数据处理和转换缓慢 用户交互延迟 内存使用量过高 Vue.js 解决方案 Vue.js 是一个渐进式 JavaScript 框架,提供了一个灵活且高效的解决...
    99+
    2024-03-05
    大数据可视化、Vue.js、Git 分支、性能优化、数据管理
  • 怎么解决PHP大整数问题
    这篇文章主要介绍“怎么解决PHP大整数问题”,在日常操作中,相信很多人在怎么解决PHP大整数问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决PHP大整数问题”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • 解决运行clickhouseSql超时问题
    表现 在平时工作中,会用到dolphinscheduler/datagrip/dbever等运行clickhouseSql,而clickhouse的jdbc在运行过程中给予我的痛苦可不是一星半点,常常运行一个sql会报错,没错,就是tim...
    99+
    2023-09-21
    数据库 mysql clickhouse 大数据
  • 大数据存储:Python是解决问题的关键吗?
    随着数据量的不断增长,大数据存储已经成为了现代社会的一个重要问题。对于大数据的存储,Python作为一门高效且易于学习的编程语言,能否成为解决问题的关键呢?本文将探讨Python在大数据存储中的应用,并通过演示代码来展示Python的优势...
    99+
    2023-11-04
    存储 面试 大数据
  • 4个大数据营销战略问题如何解决
    7这期内容当中小编将会给大家带来有关4个大数据营销战略问题如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  如今,人们生活在一个数据驱动的世界里,大数据几乎影响到数字营销的各个方面。事实证明,大数...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作