MongoDB超大块数据问题解决

目录
  • 引言
  • 一、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命令,直到其块数量与目标分片块数量大致相同;
  • 将块大小设置为其最初值;
  • 开启均衡器

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、输出内容详解:

  • 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超大块数据的资料请关注我们其它相关文章!

(0)

相关推荐

  • MongoDB  数据模型的设计模式及优缺点

    目录 简介 近似值模式 属性模式 桶模式 计算模式 文档版本控制模式 扩展引用模式 异常值模式 预分配模式 模式版本控制模式 子集模式 树形模式 在实际开发中,大多数性能问题都可以追溯到糟糕的模型设计.官方也提供分享过文档模型设计的进阶技巧,这里简单翻译记录一下. 简介 官方文章的地址是 Building with Patterns: A Summary,其中汇总了 12 种设计模式及使用场景. 上述的图表列举了 12 种设计模式及应用场景,主要是以下这些: 近似值模式(Approximatio

  • MongoDB Shell常用基本操作命令详解

    目录 MongoDB Shell 连接数据库 库(database)的操作 查看所有数据库 test 库 查看当前数据库 删除数据库 集合的基本操作 创建集合 查看集合 删除集合 其他 Shell 命令 清屏 退出 shell 小结 MongoDB Shell MongoDB Shell 是一个功能齐全的 JS 和 Node.js 的REPL环境,用于与 MongoDB 服务器进行交互,是一个 shell 环境的客户端工具. 本文介绍一些 MongoDB Shell 的常用操作. 连接数据库 使

  • MongoDB 聚合查询详解

    目录 聚合管道 管道阶段 常见操作 更多操作 - 投影 更多操作 - 展开 更多操作 - 分组 更多操作 - 入库 条件组累加器 算术运算 最值运算 数组提取 其他运算 聚合管道 聚合框架是 MongoDB 中的一组分析工具,可以对一个或多个集合中的文档进行分析. MongoDB 的聚合框架基于管道的概念:首先从集合中获取到输入,然后将输入的文档传递到一个或多个阶段,每个阶段都将之前阶段输出的内容作为输入,最终得到一个聚合结果作为输出. 上面的图是一个比较宽泛的管道流程图.这里展示一个 Mong

  • Mongodb 用户权限管理及配置详解

    一.Mongodb命令 理解 admin 数据库 安装 MongoDB 时,会自动创建 admin 数据库,这是一个特殊数据库,提供了普通数据库没有的功能. 有些用户角色赋予用户操作多个数据库的权限,而这些角色只能在 admin 数据库中创建,要创建有权操作所有数据库的超级用户,必须将该用户加入到 admin 数据库中.检查凭证时,MongoDB 将在指定数据库和 admin 数据库中检查用户账户. 内建的角色 数据库用户角色:read.readWrite;数据库管理角色:dbAdmin.dbO

  • MongoDB中aggregate()方法实例详解

    目录 前言 1,了解aggergate()方法 2,实现聚合表达式运算符 总结 前言 MongoDB的一个很大的好处是能够使用MapReduce来吧数据库查询的结果简化成一个与原来的集合完全不同的结构.MapReduce把一个数据库查询的值映射为一个完全不同的形式,然后简化结果,使它们的可用性更好. MongoDB有一个MapReduce框架,它也允许你使用聚合来简化吧一个MapReduce操作传输到另一个MapReduce操作的一系列过程.有了MapReduce和聚合,可以用数据生成一些不平凡

  • MongoDB超大块数据问题解决

    目录 引言 一.MongoDB服务器管理 1.添加服务器 2.修改分片中的服务器 3.删除分片 二.均衡器 三.修改块的大小 四.超大块 1.分发超大块 2.分发超大块步骤: 3.避免出现超大块 4.输出内容详解: 五.系统分析器 六.一些常见的辅助命令 引言 最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦? 让我们一起,一探究竟,继续学习解决MongoDB超大块数据问题,实现快速入门,丰富个人简历,提高面试level,给自

  • Linux安装MongoDB启动及常见问题解决

    MongoDB安装过程以及问题记录 一.MongoDB安装 下载MongoDB 官方地址:https://www.mongodb.com/download-center/community 可能需要注册一下我这里是Centos7系统所以选择的是RHEL7.0的TGZ,其他系统自行选择 如果不想注册在这里下载也可以:https://www.mongodb.org/dl/linux 下载步骤: [root@localhost ~]# curl -O https://fastdl.mongodb.or

  • db.serverStatus()命名执行时报无权限问题的解决方法

    1.问题描述 今天在执行db.serverStatus()命令时给出了" "errmsg" : "not authorized on admin to execute command { serverStatus: 1.0 }","的错误提示. 通过查询admin的权限已经是dbOwner的权限了,然后又陆续赋予了dbadmin等权限,问题仍旧存在. 最后找到了Mongodb的权限列表,赋予了root权限终于可以把问题给解决了,然后又测试了其他几

  • Android中超大图片无法显示的问题解决

    发现问题 最近在做图片浏览功能时遇到了一个很蛋疼的问题,在开启硬件加速情况下,超大图无法正常显示(图的长宽有一个大于9000),而且程序不会crash,只是图片加载不出来,View显示为黑色.通过查看日志,发现系统打印出了下面的内容: W OpenGLRenderer( 4014): Bitmap too large to be uploaded into a texture (600x9518, max=8192x8192) 从日志内容可以看出,这是由OpenGL打印出来的日志,是由于图片的尺

  • Linux系统安装NoSQL(MongoDB和Redis)步骤及问题解决办法(总结篇)

    如下是我工作中的记录,介绍的是linux系统下NoSQL:MongoDB和Redis的安装过程和遇到的问题以及解决办法: 需要的朋友可以按照如下步骤进行安装,可以快速安装MongoDB和Redis,希望可以帮助大家:)! 一.MongoDB 1.MongoDB安装 (1)将安装包mongodb-linux-i686-3.0.2.tgz拷贝到要安装的服务器中 这里我用的rz命令,如果不支持需要安装yum -y install lrzsz (2)解压安装程序 tar xzvf mongodb-lin

  • Asp.Net超大文件上传问题解决

    最近涉及到用asp.net做上传功能的一个问题,因为asp.net有fileupload的上传控件,但是这个控件上传的文件大小有限,所以根本满足不了需求百度了下,很多人遇到asp.net上传超大文件的困惑,偶尔搜索发现csdn有个哥们提到这个超大文件如何实现,RadUpload.Net2.dll并且提供了这个动态库进行处理超大文件的上传处理过程.于是就下载下来看了看,果然效果不错,不但支持吵过700M的文件上传快速,更重要的是支持多线程的上传文件.查看源代码发现利用的控件也是fileupload

  • MySQL limit使用方法以及超大分页问题解决

    前言 日常开发中,我们使用mysql来实现分页功能的时候,总是会用到mysql的limit语法.而怎么使用却很有讲究的,今天来总结一下. limit语法 limit语法支持两个参数,offset和limit,前者表示偏移量,后者表示取前limit条数据. 例如: ## 返回符合条件的前10条语句 select * from user limit 10 ## 返回符合条件的第11-20条数据 select * from user limit 10,20 从上面也可以看出来,limit n 等价于l

  • MongoDB中的一些坑(最好不要用)

    MongoDB 是目前炙手可热的 NoSQL 文档型数据库,它提供的一些特性很棒:如自动 failover 机制,自动 sharding,无模式 schemaless,大部分情况下性能也很棒.但是薄荷在深入使用 MongoDB 过程中,遇到了不少问题,下面总结几个我们遇到的坑.特别申明:我们目前用的 MongoDB 版本是 2.4.10,曾经升级到 MongoDB 2.6.0 版本,问题依然存在,又回退到 2.4.10 版本. MongoDB 数据库级锁 坑爹指数:5星(最高5星) MongoD

  • mongodb 常见问题处理方法收集

    1 非正常关闭服务或关机后 mongod服务无法正常启动 在使用中发现mongodb 的服务很容易因为非正常关闭而启动不了,不过解决也很容易 删除data目录下的 *.lock文件,再运行下 /mongodb_binpath/mongod -repair -f config文件路径 再启动即可 也可以在/etc/init.d/mongod 服务启动的文件中加入 启动前删除该文件 如下: start() { rm -f /usr/mongodb/data/master/mongod.lock /u

  • Ubuntu系统中安装MongoDB及其启动命令mongod的教程

    UBuntu上安装MongoDB server 获取最新版本 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz 解压缩即可执行 tar zxvf mongodb-linux-x86_64-2.0.2.tgz cd /usr/mongodb-linux-x86_64-2.0.2/bin 但是在运行前,需要创建mongodb需要的存放数据和日志的目录: sudo mkdir -p /data/db/journal

随机推荐