温馨提示×

mongodb如何应对高并发

小晨
974
2021-07-12 16:35:52
栏目: 云计算

mongodb应对高并发的方法:1、采用批量数据方式操作MongoDB,定时定量获取查询结果;2、在mongodb中设置一个库一个文件;3、mongodb存储引擎选择WiredTiger;4、增加mongodb最大连接数;5、优化mongodb中的写策略;6、优化mongodb中的慢查询语句。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)写比读多  

0