1、问题描述

这是一套运行在腾讯云上的MongoDB 3.6版本集群,共5个分片,每片规格是6核16GB。

在压测的过程中,发现第3个分片的CPU使用率长时间高达96%,其它4个分片的CPU使用率都没有超过10%。

2、思考及分析

首先,我查看慢日志,发现大量与postbox相关的query,半个小时内出现9000多次,每次请求平均耗时200ms左右,planSummary为IXSCAN,每次扫描和返回的文档数都很少,锁也很少。

  planSummary: IXSCAN { serviceUserId: 1, updatedDate: -1, messageType: 1 } keysExamined:0 docsExamined:0 cursorExhausted:1 numYields:0 nreturned:0 reslen:340 locks:{ Global: { acquireCount: { r: 2 } }, Database: { acquireCount: { r: 1 } }, Collection: { acquireCount: { r: 1 } } }

到此,还不能说明问题,但是既然慢日志里面都是与postbox有关的,那么我就去检查一下这个collection

以下是db.getCollection('postbox').stats()的输出:

{
"sharded" : true,
"capped" : false,
"ns" : "postbox.postbox",
"count" : 1020.0,
"size" : 301694.0,
"storageSize" : 163840.0,
"totalIndexSize" : 184320.0,
"indexSizes" : {
"_id_" : 69632.0,
"expireAtTtlIndex" : 53248.0,
"serviceUserIdMsgTypeSearchIdx" : 61440.0
},
"avgObjSize" : 295.0,
"nindexes" : 3.0,
"nchunks" : 1.0,
"shards" : {
"cmgo-280eoxk3_2" : {
……
省略 }

可以看出,整个文档只有294KB,包含一个chunk,只分布在"cmgo-280eoxk3_2"这一个节点。这就可以说明为什么这一个节点的负载高,而其它节点负载很低了。

通过执行sh.status(),可以看到该collection的分片方式为range:

                postbox.postbox
shard key: { "serviceUserId" : 1 }
unique: false
balancing: true
chunks:
cmgo-280eoxk3_2 1
{ "serviceUserId" : { "$minKey" : 1 } } -->> { "serviceUserId" : { "$maxKey" : 1 } } on : cmgo-280eoxk3_2 Timestamp(1, 0)

所以,这个问题的根本原因是:该collection目前数据非常少,只有一个chunk,只分布在一个节点中,所以压测就导致该节点的负载非常高。

3、解决方法

查阅官方文档,其中有如下说明:

If you shard an empty collection using a hashed shard key, MongoDB automatically creates two empty chunks per shard, to cover the entire range of the hashed shard key value across the cluster. 
You can control how many chunks MongoDB creates with the numInitialChunks parameter to shardCollection or by manually creating chunks on the empty collection using the split command.

意思是使用hashed分片方式,MongoDB会自动为每个片创建2个空的chunks,你也可以在设置该集合的分片时,使用numInitialChunks参数来指定空chunks的数量。

通过与研发沟通,结合我们的实际情况评估,认为该collection可以使用hashed分片方式。

所以,备份该集合的数据,然后使用如下方重新指定分片方式,最后导入数据。

db.runCommand( { shardCollection: "postbox.userPostIndex", key: {serviceUserId:"hashed"}, numInitialChunks: 3 } )

MongoDB集群负载不均衡问题定位及解决的更多相关文章

  1. Graylog+elasticsearch+mongodb集群+nginx负载均衡前端

    网上有张图画的很好,搜索有关它的配置文章,google里有几篇英文的,都是依靠haproxy等或别的什么实现,没有纯粹的Graylog+elasticsearch+mongodb集群,项目需要,只有自 ...

  2. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  3. 转】Nginx+tomcat配置集群负载均衡

    原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299         感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...

  4. Apache+Tomcat +mod_proxy集群负载均衡及session

      序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...

  5. ngnix apache tomcat集群负载均衡配置

    http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...

  6. lunix 集群,负载均衡,location

       nginx location语法: location支持的语法优先级: 复制代码location匹配顺序 #  www.s14hanju.com/1.location = / {  我是代码1} ...

  7. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  8. 运维小知识之nginx---nginx配置Jboss集群负载均衡

      codyl 2016-01-26 00:53:00 浏览385 评论0 负载均衡 转自 运维小知识之nginx---nginx配置Jboss集群负载均衡-博客-云栖社区-阿里云https://yq ...

  9. Apache + Tomcat集群 + 负载均衡

    Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html  http://blog ...

随机推荐

  1. java面试| 线程面试题集合

    集合的面试题就不罗列了,基本上在深入理解集合系列已覆盖 「 深入浅出 」java集合Collection和Map 「 深入浅出 」集合List 「 深入浅出 」集合Set 这里搜罗网上常用线程面试题, ...

  2. C++中虚析构的作用

    为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用. 基本概念: 析构函数是用来回收对象的: 虚析构函数是析构函数的一种: 基类是一类对象共有属性的抽象.比如,猫和狗都是动物,都会 ...

  3. Mabitis

    Mybatis 一.框架概念: Java框架,一个软件半成品,简单来说就是一个别人搭好的舞台,你来做表演,说白了Java框架就是封装好方便程序员操作的类,使项目的开发更简单,维护起来也更容易. 而My ...

  4. 分层有限状态机的C++实现

    为了方便我的游戏开发,写了这么一个通用的分层有限状态机.希望在其稳定以后,可以作为一个组件加入到我的游戏引擎当中. 目前使用了std::function来调用回调函数,在未来可能会用委托机制代替. 第 ...

  5. jsp路径

    访问静态资源的时候${pageContext.request.Context}没有作用,在浏览器F12调试的时候发现,路径并没有被解释为项目的根路径,而是没有解释出来,还是${pageContext. ...

  6. springIOC源码接口分析(九):Environment

    先贴一下接口继承关系图,spring容器启动的时候会初始化环境,所以此接口相关接口非常有必要进行了解: 一 PropertyResolver接口 Environment继承了该接口,PropertyR ...

  7. C# 解析JSON遇到以错误提示:应为状态“Element”。。遇到名称为“”、命名空间为“”的“Text”。

    话不多说:仔细看代码: ①json格式错误导致报错 {"TeachIQ":"  语言  0小时0分钟  未完成","Temperature" ...

  8. Topics类型配置

    配置项 备注 segment.bytes 分段文件大小,最大2GB segment.ms 强制新建段文件间隔阀值时间 segment.jitter.ms 段文件抖动时间 segment.index.b ...

  9. Sea.js 手册与文档

    Sea.js 手册与文档 首页 | 索引 目录 何为 CommonJS 何为 CommonJS 模块 为何封装模块 何为 CommonJS? CommonJS 是一个有志于构建 JavaScript ...

  10. centos6.8安装lnmp

    一.配置CentOS 第三方yum源(CentOS默认的标准源里没有nginx软件包) [root@localhost ~]# yum install wget #安装下载工具wget[root@lo ...