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

如何进行mongodb数据库的问题分析

如何进行mongodb数据库的问题分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。&

如何进行mongodb数据库的问题分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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

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

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

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

如何进行mongodb数据库的问题分析

我们可以在数据库启动时加--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后即可永久生效.

环境变量

[root@localhost ~]# echo "PATH=$PATH:/app/mongodb/bin" >> /etc/profile

[root@localhost ~]# source /etc/profile

mongodb配置文件附例:

port=27017

dbpath=/backup/mongodbData

logpath=/app/mongodb/log/mongodb.log

logappend=true

directoryperdb=true

journal=true

fork=true

maxCOnns= 10000

二、虚拟内存限制问题

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的大小的话,有可能会数据不一致。

参看官方文档说明:

http://www.mongodb.org/display/DOCS/Replication+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()

操作补充:

  • 以下是mongodb启动时的常用参数说明:

--bind_ip 绑定IP,绑定后只能绑定的IP访问服务
--dbpath 指定数据库目录
--port 指定数据库端口,默认是27107
--logpath 指定日志存放目录
--logappend 使用追加的方式写日志
--pidfilepath 指定进程文件,不指定则不产生进程文件
--journal 启用日志
--maxConns 最大的并发连接数,默认2000
--fork 将服务放到后台运行
--notablescan 不允许表扫描

--syncdelay 数据写入硬盘的时间(秒),0是不等待,直接写入

  • shell操作数据库:


    • 1.  超级用户相关:
              1. #进入数据库admin
               use admin
              2. #增加或修改用户密码
               db.addUser('name','pwd')
              3. #查看用户列表
               db.system.users.find()
              4. #用户认证
               db.auth('name','pwd')
              5. #删除用户
               db.removeUser('name')
              6. #查看所有用户
               show users
              7. #查看所有数据库
               show dbs
              8. #查看所有的collection
               show collections
              9. #查看各collection的状态
               db.printCollectionStats()
             10. #查看主从复制状态
               db.printReplicationInfo()
             11. #修复数据库
               db.repairDatabase()
             12. #设置记录profiling,0=off 1=slow 2=all
               db.setProfilingLevel(1)
             13. #查看profiling
               show profile
             14. #拷贝数据库
               db.copyDatabase('mail_addr','mail_addr_tmp')
             15. #删除collection
               db.mail_addr.drop()
             16. #删除当前的数据库
               db.dropDatabase()

  • 2. 增删改 (其中下面的foo与user_addr为collection)
            1. #存储嵌套的对象
               db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})
            2. #存储数组对象
               db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})
            3. #根据query条件修改,如果不存在则插入,允许修改多条记录
               db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)
            4. #删除yy=5的记录
               db.foo.remove({'yy':5})
            5. #删除所有的记录
               db.foo.remove()

  •   3. 索引 (其中下面的foo与user_addr为collection)
            1. #增加索引:1(ascending),-1(descending)
            2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
            3. #索引子对象
            4. db.user_addr.ensureIndex({'Al.Em': 1})
            5. #查看索引信息
            6. db.foo.getIndexes()
            7. db.foo.getIndexKeys()
            8. #根据索引名删除索引
            9. db.user_addr.dropIndex('Al.Em_1')

  • 4. 查询 (其中下面的foo与user_addr为collection)
            1. #查找所有
           2. db.foo.find()
           3. #查找一条记录
           4. db.foo.findOne()
           5. #根据条件检索10条记录
           6. db.foo.find({'msg':'Hello 1'}).limit(10)
           7. #sort排序
           8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})
            9. db.deliver_status.find().sort({'Ct':-1}).limit(1)
           10. #count操作
           11. db.user_addr.count()
           12. #distinct操作,查询指定列,去重复
           13. db.foo.distinct('msg')
           14. #”>=”操作
           15. db.foo.find({"timestamp": {"$gte" : 2}})
           16. #子对象的查找
           17. db.foo.find({'address.city':'beijing'})

  •   5. 管理  (其中下面的deliver_status为collection)
            1. #查看collection数据的大小
            2. db.deliver_status.dataSize()
            3. #查看colleciont状态
            4. db.deliver_status.stats()
            5. #查询所有索引的大小
            6. db.deliver_status.totalIndexSize()

看完上述内容,你们掌握如何进行mongodb数据库的问题分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程笔记行业资讯频道,感谢各位的阅读!


推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • SSAS入门指南:基础知识与核心概念解析
    ### SSAS入门指南:基础知识与核心概念解析Analysis Services 是一种专为决策支持和商业智能(BI)解决方案设计的数据引擎。该引擎能够为报告和客户端应用提供高效的分析数据,并支持在多维数据模型中构建高性能的分析应用。通过其强大的数据处理能力和灵活的数据建模功能,Analysis Services 成为了现代 BI 系统的重要组成部分。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
author-avatar
夜夜0603
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有