使用mongoDB是因为用到了graylog,部署运行2-3个月之后,发现mongoDB占用物理内存巨大,50G+,公司的数据架构居然质问我为什么不设置-Xmx堆内存大小,我尼玛只能呵呵醉了!
简单说mongoDB似乎没有配置项可以限制使用物理内存,粗略理解mongoDB本身不管理内存块,而是全部交给操作系统,如何限制mongoDB内存呢?
网上有说使用ulimit等,但是事实证明无效。
应对的办法就是使用cgroup,cgconfig是什么东西我就不说了,可以看我另一篇博客。
这里介绍下具体实施步骤。我们的复制集一共有3个节点,部署在三台机器上面,首先通过mongo ip:27017这种方式登录,查看每个几点的角色
rs0:SECONDARY>这种就是secondary了,rs0:PRIMARY>这种就是primary。
1、逐个处理secondary
第一步:
db.adminCommand({"replSetMaintenance":true})
保险起见,执行这个命令,让secondary进入维护模式,这时流量就会切走。
第二步:
kill mongoDB的进程号,等待mongo进程退出。
第三步:
准备好cgconfig配置。在/etc/cgconfig.conf文件追加
在/etc/cgrules.conf追加:
重启cgconfig服务,service cgconfig restart
在/cgroup/memory目录中可以看到DBLimitedGroup目录,说明生效了
第四步,重启secondary,不过前面要加上
cgexec -g memory:DBLimitedGroup bin/mongod -dbpath=./data/ -logpath=./logs/mongod.log --fork --replSet rs0 -bind_ip=192.168.32.189
2、primary切换,然后处理之前的primary
mongo登陆primary,然后执行rs.stepDown(15)这时候,执行rs.status观测新的primary有没有选举出来
一般来说都会正常选举,这时候,执行上面的步骤,限制老primary的内存。
说明,可以通过rs.status()查看primary和secondary的状态,同时可以使用下面的命令查看同步进度,这样就可以保证服务整体可用。