对 MongoDB 内存占用进行限制以及从 3.2 升级到 4.0
前几天往 MongoDB 中写入了几个 G 的数据,发现 MongoDB 内存占用太 TMD 高了。不使用的时候也不释放,搞得交换空间都整了好几 G,其他进程的服务访问起来也慢得要死。没办法啊,人穷,能省就省。今天本来只是准备想办法限制一下 MongoDB 的内存占用的,可惜很多事情不折腾不行啊。
系统中安装的是 apt 源提供的 MongoDB 包,3.2 的。在配置文件中设置 wiredTigeredCacheSizeGB = 0.5 后,终端输入
service mongodb restart service mongodb status
服务无法启动,显示状态是 dead,启动日志提示 wiredTigeredCacheSizeGB 是整数。
查官方和乡下资料,折腾了半天没有解决,想着升级一下得了。apt 源中提供的最新版本只到 3.2.10,没法再升了,只能找找官方的看看。
卸载原有版本
apt purge mongodb apt autoremove
在官方网站查到的最新版本安装方法如下
curl https://www.mongodb.org/static/pgp/server-4.0.asc | apt-key add - echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.0 main" | tee /etc/apt/sources.list.d/mongodb-org-4.0.list apt update apt install mongodb-org
可惜,直接安装 4.0 不兼容啊。指定数据目录为原来的数据目录后,启动不起来,试了 3.6 也不行。
看网上有人说需要先升 3.4,再升 3.6,最后才能升到 4.0。到官网找到 3.4 的安装说明,只有针对 Debian 8 的包,试试
curl https://www.mongodb.org/static/pgp/server-3.4.asc | apt-key add - echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list apt update apt install mongodb-org=3.4.20 mongodb-org-server=3.4.20 mongodb-org-shell=3.4.20 mongodb-org-mongos=3.4.20 mongodb-org-tools=3.4.20
安装不上,错误信息显示找不到 libssl1.0.1,系统安装的 libssl 版本太高了,1.1 的。这东西也不好卸载重装啊,依赖它的软件太多了。想想算了,还是按最终方案,先把数据导出,升级后再导入吧。
装回原来版本
apt install mongodb service mongodb start service mongodb status
网上找到的 MongoDB 导入导出以及数据库备份的文章
-------------------MongoDB数据导入与导出------------------- 1、导出工具:mongoexport 1、概念: mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。 2、语法: mongoexport -d dbname -c collectionname -o file --type json/csv -f field 参数说明: -d :数据库名 -c :collection名 -o :输出的文件名 --type : 输出的格式,默认为json -f :输出的字段,如果-type为csv,则需要加上-f "字段名" 3、示例: sudo mongoexport -d mongotest -c users -o /home/python/Desktop/mongoDB/users.json --type json -f "_id,user_id,user_name,age,status" 2、数据导入:mongoimport 1、语法: mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field 参数说明: -d :数据库名 -c :collection名 --type :导入的格式默认json -f :导入的字段名 --headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段 --file :要导入的文件 2、示例: sudo mongoimport -d mongotest -c users --file /home/mongodump/articles.json --type json -------------------MongoDB备份与恢复------------------- 1、MongoDB数据库备份 1、语法: mongodump -h dbhost -d dbname -o dbdirectory 参数说明: -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017 -d: 需要备份的数据库实例,例如:test -o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。 2、实例: sudo rm -rf /home/momgodump/ sudo mkdir -p /home/momgodump sudo mongodump -h 192.168.17.129:27017 -d itcast -o /home/mongodump/ 2、MongoDB数据库恢复 1、语法: mongorestore -h dbhost -d dbname --dir dbdirectory 参数说明: -h: MongoDB所在服务器地址 -d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2 --dir: 备份数据所在位置,例如:/home/mongodump/itcast/ --drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用! 2、实例: mongorestore -h 192.168.17.129:27017 -d itcast_restore --dir /home/mongodump/itcast/
在配置文件中禁用基于角色的访问控制并重启后,在终端执行
mongodump -d dbname -o bkpdirectory
很好,成功备份到其他目录了。
忽然想起,既然是导出数据再升级,何必非要先安装 3.6,直接装 4.0 试试再说不是更好?咱的数据结构不复杂,说不定会兼容。
安装完成后,重新在配置文件中指定数据目录。为防意外,先移动原来的数据文件,创建一个新文件夹,然后再启动
mv /opt/data/mongodb /opt/data/mongodb1 mkdir /opt/data/mongodb service mongod start service mongod status
启动不了,看来文件夹不是 MongoDB 用户组还不行。换个方式
rm -R /opt/data/mongodb mv /opt/data/mongodb1 /opt/data/mongodb mkdir /opt/data/bkp mv /opt/data/mongodb/* /opt/data/bkp service mongod start service mongod status
OK,启动起来了。
然后就是还原备份了。
mongorestore -d dbname --dir bkpdirectory
数据量比较大,备份的时候还算快,可还原起来就慢了。特别是大的集合,1 M 要六七秒钟,有的数据项数量多但单个比较小,更慢。总共花了大概两个半小时。还好,没出什么问题。
删除原来的数据文件
rm -R /opt/data/bkp
然后回到正题,在配置文件中添加内存限制。在 storage 下面
wiredTiger: engineConfig: cacheSizeGB: 0.5
最后,重新添加用户。在 admin 集合创建超级用户
db.createUser({user:'name',pwd:'pwd',roles:['userAdminAnyDatabase']})
在数据集合创建一般用户
db.createUser({user:'name',pwd:'pwd',roles:['dbAdmin', 'readWrite']})
在配置文件中启用基于角色的访问控制
security: authorization: enabled
重启,完成。
其他在网络上查到的:
MongoDB 3.6 的安装
curl https://www.mongodb.org/static/pgp/server-3.6.asc | apt-key add - echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/3.6 main" | tee /etc/apt/sources.list.d/mongodb-org-3.6.list apt install mongodb-org=3.6.12 mongodb-org-server=3.6.12 mongodb-org-shell=3.6.12 mongodb-org-mongos=3.6.12 mongodb-org-tools=3.6.12
导入数据的时候如果不兼容,可以指定 --noIndexRestore 参数不导入索引
mongorestore -h host --port port -u username -p password --noIndexRestore

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS面向切面的TableView-AOPTableView
iOS面向切面的TableView-AOPTableView 这个是公司很久之前的开源项目,一个大牛写的,在项目中一直有在用,今天有空发了点时间看下如何实现,看了之后感觉挺有收获,故撰此文,分享给需要的同学。 该库的开源库地址:MeetYouDevs/IMYAOPTableView 概览 WHY AOP TableView 关于为何使用AOP,在MeetYouDevs/IMYAOPTableView这个库的简介中已经有提及到了,主要是针对在我们数据流中接入广告的这种场景,最原始的方法就是分别请求数据以及广告,根据规则合并数据,分别处理业务数据和广告数据的展示这个流程如下图所示。这种方案的弊端就是有很明显的耦合,广告和正常的业务耦合在一起了,同时也违反了设计原则中的单一职责原则,所以这种方式是做的不够优雅的,后期的维护成本也是比较大的。   那么如何解决这个问题呢?如何使用一种不侵入业务的方式优雅的去解决这个问题呢?答案就是使用AOP,让正常的业务和广告并行独立滴处理,下图就是使用AOP方式处理数据流中接入广告流程图  HOW DESIGN AOP TableView 该如何设计...
- 下一篇
死磕 java集合之SynchronousQueue源码分析
问题 (1)SynchronousQueue的实现方式? (2)SynchronousQueue真的是无缓冲的吗? (3)SynchronousQueue在高并发情景下会有什么问题? 简介 SynchronousQueue是java并发包下无缓冲阻塞队列,它用来在两个线程之间移交元素,但是它有个很大的问题,你知道是什么吗?请看下面的分析。 源码分析 主要属性 // CPU的数量 static final int NCPUS = Runtime.getRuntime().availableProcessors(); // 有超时的情况自旋多少次,当CPU数量小于2的时候不自旋 static final int maxTimedSpins = (NCPUS < 2) ? 0 : 32; // 没有超时的情况自旋多少次 static final int maxUntimedSpins = maxTimedSpins * 16; // 针对有超时的情况,自旋了多少次后,如果剩余时间大于1000纳秒就使用带时间的LockSupport.parkNanos()这个方法 static fina...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题