前言
自己有一个测试用的服务器,配置很低。年前出现几次问题,重启后就好了也就没注意。后来越来越频繁就调查了一下,发现重启后内存就一直增长直到接近100%。使用ps aux
查看cpu和内存使用情况,发现mongo占用了大部分的内存,这是什么情况?
版本差异
3.2版本
因为服务器搭建有些年头了,mongo的版本一致没升级,停留在3.2版本上。查阅相关资料发现是默认设置导致的,mongo3.2有一段官方描述如下:
简单来说就是内存占用在下面两种情况中取最大值:
-
RAM的60%,并且这个60%要大于1GB
-
1GB
因为我的服务器是测试用,所以配置很低内存只有1GB,也就是说mongo默认就要全占了,怪不得内存一直100%。
但是mongo配置是可以改动的,有两种方式。
一种是修改mongod.conf文件,设置cacheSizeGB参数:
...
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: xx
...
另外一种就是如果使用命令启动,那么启动时可以添加参数:
–wiredTigerCacheSizeGB=xx
但是!
mongo的3.2版本这个cacheSizeGB参数是int类型,如果使用小数就会报错
Error parsing option “wiredTigerCacheSizeGB” as int: Bad digit “.” while parsing 0.3
所以最低只能是1GB!这样我这种低配服务器就没戏了。。。
3.4版本
应该是官方也意思到这个问题了,所以在mongo的3.4版本做了改变,官方描述如下:
可以看到,在这个版本中cacheSizeGB类型变成float了,也就是说可以用小数了。
而且默认配置也发生了改变:
-
50%的RAM,同样要求这50%大于1GB
-
256M
简单来说就是如果RAM大于2GB,就取50%。否则就直接使用256M,而且我们自定义的时候可以使用小数,这样就非常合理了。
升级版本
所以要解决这个问题,需要先将mongo升级到3.4及以上版本。mongo不能跨版本升级,所以只能3.2先升级到3.4,再往上升级。
目前3.4足够我使用,所以升级到3.4就可以了。但是网上升级都比较复杂,因为都是大系统,而我只是一个小系统,单一的服务和数据库。所以网上的文章基本没有,我参考了一些和官网的一些,总结了简单的升级过程。
文章中的系统环境是CentOS
停止服务
通过命令mongo进入数据库,然后
use admin; --使用管理员数据库
db.shutdownServer();
下载安装
因为是在CentOS上,所以参考官网redhat的安装教程
需要先创建一个/etc/yum.repos.d/mongodb-org-3.4.repo文件,内容如下:
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
然后用命令安装即可
sudo yum install -y mongodb-org
安装完执行命令mongo --version
发现mongo对应的bin文件都自动变成3.4版本的了,很简单
重新启动
通过conf文件或命令直接重启即可,因为bin文件自动换了,所以没有任何改变
我一般用命令进行启动:
/usr/bin/mongod -dbpath=/mnt/mongo -logpath=/mnt/mongodb/mongodb.log -logappend -port=27017 -fork --maxConns=20000 --bind_ip=127.0.0.1 --wiredTigerCacheSizeGB=0.2
向后不兼容
启动这个功能后如果需要降级会麻烦一些,但是我们基本上不可能再降级回去了,所以直接启动即可
首先通过mongo进入数据库中,然后查看当前的featureCompatibilityVersion
db.adminCommand({getParameter:1,featureCompatibilityVersion:1})
可以看到版本是3.2,我们需要改成3.4即可,执行命令
db.adminCommand ({setFeatureCompatibilityVersion:“3.4”})
执行成功后可以再查一次,修改成功即可
通过上面简单的几个步骤,我们就将3.2成功升级到3.4了
总结
首先,上面提到的版本升级方法只适用单一服务的简单数据库,像那种集群中使用的数据库就不要参考了。
当版本在3.4以上就可以通过上面提到的两种方式修改内存配置即可:
-
修改mongod.conf文件,重启mongo
-
使用命令启动mongo的同时添加wiredTigerCacheSizeGB参数
这样在低配置的机器上也不会占用全部内存了。
至于如何安装配置mongo,可以参考:
《Mac和Linux安装Mongodb教程》
《windows下安装配置mongodb》