文章摘要:mongodb如何应对高并发 mongodb 高并发
mongodb应对高并发的方法:1、采用批量数据方式操作MongoDB,定时定量获取查询结果;2、在mongo […]
mongodb应对高并发的方法:1、采用批量数据方式操作MongoDB,定时定量获取查询结果;2、在mongodb中设置一个库一个文件;3、mongodb存储引擎选择WiredTiger;4、增加mongodb最大连接数;5、优化mongodb中的写策略;6、优化mongodb中的慢查询语句。
具体内容如下
一、代码层级优化
采用批量数据方式操作MongoDB。将数据信息存放在消息队列中进行缓存,然后定时定量的去获取队列消息,触发连接MongoDB获取查询结果。
所谓定时定量是指每一段时间或消息队列达到某一数值。示例:每10秒或队列消息数达到200时提交一次统计事件。
优点:减少网络传输的IO,同时减少SQL语句解析的次数。降低MongoDB日志刷盘的数据量和频率,从而提高效率。
缺点:有一定的消息延时(具体延时时间可调整队列消息提交频率和消息数大小来控制)。
二、MongoDB优化
1、MongoDB设置一个库一个文件,即设置directoryPerDB为true;将索引也按数据库名单独存储,即directoryForIndexes: true。
2,MongoDB存储引擎选择WiredTiger。
目前MongoDB的存储引擎主要有MMAPV1、WiredTiger。在3.2版本之前MMAPV1是默认的存储引擎,其采用linux操作系统内存映射技术,但一直饱受诟病;3.4以上版本默认的存储引擎是wiredTiger,相对于MMAPV1其有如下优势:
-
读写操作性能更好,WiredTiger能更好的发挥多核系统的处理能力;
-
MMAPV1引擎使用表级锁,当某个单表上有并发的操作,吞吐将受到限制。WiredTiger使用文档级锁,由此带来并发及吞吐的提高
-
相比MMAPV1存储索引时WiredTiger使用前缀压缩,更节省对内存空间的损耗;
-
提供压缩算法,可以大大降低对硬盘资源的消耗,节省约60%以上的硬盘资源;
3、增加MongoDB最大连接数(connectionsPerHost),有效利用CPU资源。
4、MongoDB写策略配置优化:{ w: , j: , wtimeout: }
-
w: 数据写入到number个节点才向用客户端确认
{w: 0} 对客户端的写入不需要发送任何确认,适用于性能要求高,但不关注正确性的场景
{w: 1} 默认的writeConcern,数据写入到Primary就向客户端发送确认
{w: “majority”} 数据写入到副本集大多数成员后向客户端发送确认,适用于对数据安全性要求比较高的场景,该选项会降低写入性能
-
j: 写入操作的journal持久化后才向客户端确认,默认为{j: false},如果要求写入持久化了才向客户端确认,则指定该选项为true
-
wtimeout: 写入超时时间,仅w的值大于1时有效
当指定{w: }时,数据需要成功写入number个节点才算成功,如果写入过程中有节点故障,可能导致这个条件一直不能满足,从而一直不能向客户端发送确认结果,针对这种情况,客户端可设置wtimeout选项来指定超时时间,当写入过程持续超过该时间仍未结束,则认为写入失败。
5,MongoDB查询优化(大概分三步)
-
开启内置的查询分析器,找出慢查询语句
-
分析慢查询语句。
-
解读explain结果。
关于索引的建议:
1.索引很有用,但是它也是有成本的——它占内存,让写入变慢;
2.mongoDB通常在一次查询里使用一个索引,所以多个字段的查询或者排序需要复合索引才能更加高效;
3.在生成环境构建索引往往开销很大,时间也不可以接受,在数据量庞大之前尽量进行查询优化和构建索引;
4.避免昂贵的查询,使用查询分析器记录那些开销很大的查询便于问题排查;
5.通过减少扫描文档数量来优化查询,使用explain对开销大的查询进行分析并优化;
6.索引是用来查询小范围数据的,不适合使用索引的情况:
1)每次查询都需要返回大部分数据的文档,避免使用索引
2)写比读多