热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mongodb数据库问题三则

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它的特点是高性能、易部署、易使用,存储数据非常方

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它的特点是高性能、易部署、易使用,存储数据非常方

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它的特点是高性能、易部署、易使用,存储数据非常方便。公司在测试和生产环境使用了MONGODB数据库,日常在使用MONGODB数据库的过程中,遇到了一些问题,比较典型的三个问题现总结分享一下。


一、数据库最大连接数问题

当你在后台日志中,发现大量“connection refused because too many open connections: 819”信息时,一般跟你没有设置合适的最大连接数值有关。

默认情况下,在LINUX系统中,MONGODB默认连接数为819,你可以适当调大这个值,但注意这个值不是无限大,最多可设置成20000, 参见MONGODB的官方说明。

wKiom1MC0CyBqA6lAAJ3a73o9ms350.jpg


我们可以在数据库启动时加--maxConns 10000参数来指定最大连接数

也可以修改mongodb.conf配置文件,在其中加一句maxCOnns= 10000保存退出后再启动MONGODB就好了。

当然这个问题也跟ulimit限制有关, 可以手动修改ulimit -n 来改动open file 的数目.

如果想使open file的值永久生效的话,请在/etc/security/limits.conf中添加以下四行, 数目根据系统情况具体修改.

* soft nofile 102400 (*针对所有用户)

* hard nofile 102400

root soft nofile 102400 (针对ROOT用户)

root hard nofile 102400


然后在/etc/pam.d/login中添加

session required /lib64/security/pam_limits.so

....

reboot后即可永久生效.


二、虚拟内存限制问题

MongoDB主从配置后, 启动时报错“ERROR: mmap failed with out of memory”。 这是因为mongodb在设置为主从关系时,,会创建“creating replication oplog of size: 944MB”,这个OPLOG日志应该是放在内存中的.

解决方法:

(1)设置oplog的大小,用参数--oplogSize来指定,不默认创建944M

(2)放开虚拟内存的限制(虚拟机默认设定512M ),编辑/etc/profile文件加入ulimit -v unlimited,使用source /etc/profile让设置生效。

再执行主从的启动命令就ok了

mongodb比较吃内存,也可以限制mongodb的内存使用量,操作如下

vi mongodb.conf

增加 ulimit -m 2560000 (约2.5G 内存)


需要注意的几点:

1. MongoDB在32位操作系统出现“mmap failed with out of memory”错误,这是因为在32位平台中MongoDB不允许数据库文件(累计总和)超过2G,而64位平台没有这个限制。如果在64位平台中也报这个错,一般是虚拟内存不足所致。可以编辑/etc/profile文件加入ulimit -v unlimited,使用source /etc/profile让设置生效或重启生效。


2. oplog的大小和内存没有太大关系,oplogSize相当于mysql数据库的binlog,从库复制的数据都是从oplog也就是local这个库读取的。

--oplopgSize,指定了slave同步时,更新日志保存的最大大小,最新版本的mongodb如果不指定参数的话默认是硬盘空间的5%,如果设置太小,slave同步和主库相差远超过了oplog的大小的话,有可能会数据不一致。


参看官方文档说明:

+Oplog+Length


3、使用mongoDB建议使用高性能sas硬盘,追求性能可以考虑使用raid10硬盘。



三、mongodb占用空间过大的问题


1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。

2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用空间就小了,但这就要求在易读性与空间占用上作权衡了。建议把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长了。但这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。

3、删除记录不释放空间:这个很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。


可以定期运行db.repairDatabase()来整理记录释放空间,但这个过程会比较缓慢。


补充:

1、mongodb客户端连接服务端出现异常

一般是因为机器异常重启或硬关机造成的,解决方法为:

①删除mongod.lock文件后,重新启动MongoDB即可。

rm -rf /data/mongodb/mongod.lock (此为mongodb数据存放的路径)

②修复mongodb

mongod -repair -dbpath=/data/mongodb/data


2、mongodb的启停

/opt/mongodb/bin/mongod -f /opt/mongodb/mongodb.conf 启动


/opt/mongodb/bin/mongo 停止

use admin

db.shutdownServer()


/opt/mongodb/bin/mongo 查看数据库状态

db.serverStatus()


本文出自 “滴水穿石孙杰” 博客,请务必保留此出处

推荐阅读
  • 一、前言在数据库中,慢查询日志通常是用来进行优化数据库,MySQL中存在慢查询,Mongodb中也是如此。在Mongo中的慢查询属于Mon ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
author-avatar
baiyanan862273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有