mongodb

mongodb如何应对高并发

小晨
969
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其有如下优势:

3、增加MongoDB最大连接数(connectionsPerHost),有效利用CPU资源。

4、MongoDB写策略配置优化:{ w: , j: , wtimeout: }

        {w: 0} 对客户端的写入不需要发送任何确认,适用于性能要求高,但不关注正确性的场景

        {w: 1} 默认的writeConcern,数据写入到Primary就向客户端发送确认

        {w: “majority”} 数据写入到副本集大多数成员后向客户端发送确认,适用于对数据安全性要求比较高的场景,该选项会降低写入性能

当指定{w: }时,数据需要成功写入number个节点才算成功,如果写入过程中有节点故障,可能导致这个条件一直不能满足,从而一直不能向客户端发送确认结果,针对这种情况,客户端可设置wtimeout选项来指定超时时间,当写入过程持续超过该时间仍未结束,则认为写入失败。

5,MongoDB查询优化(大概分三步)

关于索引的建议:

1.索引很有用,但是它也是有成本的——它占内存,让写入变慢;

2.mongoDB通常在一次查询里使用一个索引,所以多个字段的查询或者排序需要复合索引才能更加高效;

3.在生成环境构建索引往往开销很大,时间也不可以接受,在数据量庞大之前尽量进行查询优化和构建索引;

4.避免昂贵的查询,使用查询分析器记录那些开销很大的查询便于问题排查;

5.通过减少扫描文档数量来优化查询,使用explain对开销大的查询进行分析并优化;

6.索引是用来查询小范围数据的,不适合使用索引的情况:

   1)每次查询都需要返回大部分数据的文档,避免使用索引

   2)写比读多  

0
看了该问题的人还看了