MongoDB优化之二:常见优化方法
四个方面进行 cpu/io 方面的优化处理:
1.集群架构上进行读写分离。所有查询优先考虑在从库上读取,写操作在主库上执行。避免主库混合读写压力过大,也减少主库上读写记录的锁冲突。
connection string中readPreference 设置成secondarypreferred,C++ 驱动版本升级为3.1.3 mongo-cxx-driver(驱动升级,读写分离才生效) 。
2.热表msg_traces 索引优化
针对该慢查询创建联合索引 {"_id": 1, "account": 1, "app_key": 1, "s_pc": 1}。
3.mongodb 历史数据归档和删除
和开发同事沟通,根据实际业务需求,保留msgs、msg_traces 集合中一年左右的文档。在timestamp 字段上创建TTL索引。设置文档的过期时间为 3153600秒(365*24*3600)。
db.msgs.createIndex( { "timestamp ": 1 }, { expireAfterSeconds: 3153600 },{background: true} )
db.msg_traces.createIndex( { "timestamp ": 1 }, { expireAfterSeconds: 3153600 },{background: true} )
mongodb TTL索引将每隔60秒对过期数据执行一次删除操作。删除操作的持续实际取决于mongod 实例的负载。
4 .journal 日志的 commitIntervalMs 参数调整。
从默认的100ms调大到500ms。
目前通过读写分离和索引优化之后,原来分片1在业务高峰期间的cpu load 值由最高值250降低到5以内,优化效果非常明显。
mongodb 分片集群优化思路总结:
分片集群中出现某个分片负载特别高的情况。(往往是某个分片负载高,如果是多个分片节点负载都高,则需要逐个进行分析)
第一步:
首先通过top、iostat、vmstat、mongostat 等工具了解系统大致并发负载和读写比例,观察系统具体瓶颈所在。
第二步:
如果负载只是集中出现在某一个节点上,则通过 mongotop 工具先分析该mongodb实例的热点表是哪些并记录下来。
第三步:
通过 mlogfilter / mloginfo 工具分析业务高峰期间出现的TOP10 慢查询。
第四步:
定位需要优化的目标表,并进行查询优化。
通常第二步和第三步会出现很多相同的表。因为热点数据表和慢查询表往往存在相同的一些表。这些表就是我们需要优化的目标。
mongodb 分片表的优化大致从以下几方面着手:
1.查看表分片键、数据分布、数据总量、数据占用空间等信息。着重看数据分片键设置是否合理、数据分布是否均匀;
2.mloginfo 工具打印出来的慢查询信息中有每个慢查询的查询条件。确认慢查询表上是否有合适的索引满足查询条件执行。需要结合explain() 分析慢查询的具体执行计划。
3.选取业务高峰阶段的mongodb实例原始日志,搜索慢查询表相关的原始查询语句。记录这些原始查询语句,方便后续与开发同事沟通,看能否从业务场景上进行相应的优化。
4.对于日志、事件、会话信息等日志类型的表,可以按照业务需求,根据事件字段,只保留一定时间内的有效数据。通常这要与开发业务
沟通清楚。确认保留时间后,可以利用mongodb TTL索引特性,在特定时间字段上创建索引,设置记录过期时限。
第五步:
架构上做读写分离优化
如果在第三步找出来的 TOP10 慢查询不少是能有效利用索引的简单查询,正常情况下,执行应该很快(200ms之内)。
则需要考虑在架构上做读写分离的优化。因为热点表高并发的读写会让cpu 忙不过来,导致原本正常的查询都出现阻塞。
总之,mongodb 优化关键之处是找出系统瓶颈和问题根源。定位出需要优化的目标表后,简单地加个索引或者做个读写分离,性能问题往往就迎刃而解。
这个和医生看病颇为相似,通过望闻问切和各种医疗检验设备所反馈的数据和报告,再依据丰富的临床经验诊断出病因所在。找出病因后,开什么方子用什么药就是水到渠成的事了。当然,医生看病比给数据库做性能诊断复杂多了,误诊几率也不小。而且,数据库性能优化没找准原因还有不少试错的机会,但是医生试错成本就比较高了。所以当个好医生貌似比做个好DBA更难!
以上插了些题外话。优化上过程中,也需要和开发同事保持有效沟通。当我们理解慢查询产生的业务场景后,有时让开发同事配合做个简单的功能优化,头痛的性能问题也能随之解决。
MongoDB优化之二:常见优化方法的更多相关文章
- MongoDB优化之一:常见优化方法
常用性能优化方案 创建索引 限定返回结果数 只查询使用到的字段 采用capped collection 采用Server Side Code Execution 使用Hint,强制使用索引 Hint ...
- WEB前端性能优化之二——css优化
1.把样式表置于顶部 现把样式表放到文档的< head />内部似乎会加快页面的下载速度.这是因为把样式表放到< head />内会使页面有步骤的加载显示.HTML规范清 楚指 ...
- MySQL优化(二) 优化诀窍
一.索引的使用 (1)查询要使用索引最重要的条件是查询条件中的字段建立了索引: (2)下列几种情况可能使用到索引: <1> 对于创建的多列索引,只要查询条件使用了最坐边的列,索引一般就会被 ...
- 【Go】使用压缩文件优化io (二)
原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...
- MS数据库优化查询最常见的几种方法
1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...
- 数据库sql常见优化方法
以前刚开始做项目的时候,开发经验尚浅,每次遇到查询比较慢时,项目经理就会问:是不是又用select * 了?查询条件有没有加索引?一语惊醒梦中人,赶紧检查..果然如此! 有时我们写sql语句时,没有考 ...
- dp常见优化方法
noip范围内的dp优化方法: 加速状态转移 1.前缀和优化 2.单调队列优化 3.线段树或树状数组优化 精简状态 3:精简状态往往是通过对题目本身性质的分析,去省掉一些冗余的状态.相对以上三条套路性 ...
- SQL常见优化Sql查询性能的方法有哪些?
常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...
- MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术
逻辑查询优化包括的技术 1)子查询优化 2)视图重写 3)等价谓词重写 4)条件简化 5)外连接消除 6)嵌套连接消除 7)连接消除 8)语义优化 9)非SPJ优化 一.子查询优化 1. ...
- 常见优化算法统一框架下的实现:最速下降法,partan加速的最速下降法,共轭梯度法,牛顿法,拟牛顿法,黄金分割法,二次插值法
常见优化算法实现 这里实现的主要算法有: 一维搜索方法: 黄金分割法 二次差值法 多维搜索算法 最速下降法 partan加速的最速下降法 共轭梯度法 牛顿法 拟牛顿法 使用函数表示一个用于优化的目标, ...
随机推荐
- unity里standard pbr(一)
关注forwardbase下的 standard.shader #pragma vertex vertBase #pragma fragment fragBase #include "Uni ...
- spring bean实例化的三种方式
一.使用类的无参构造创建 配置文件 java代码 注意若类里面没有无参的构造,则会出现异常 二.使用静态工厂创建 配置文件 java代码 Factory类 测试类 结果 三.使用实例工厂 配置文件 1 ...
- STM32L0 HAL库 IO读写功能
开发环境使用 MDK5.16a + CUBEMX生成代码 开发板使用:NUCLEO-L053R8 核心芯片:STM32L053R8 今天主要学习了下最基础的IO的读写,IO使用 PA5 LED输出 ...
- shell 比较运算符
运算符 描述 示例 文件比较运算符 -e filename 如果 filename 存在,则为真(不管文件或目录) [ -e /var/log/syslog ] -d filename 如果 fi ...
- Spring Cloud之统一fallback接口
每个方法都配备一个fallback方法 不利于开发的 用类的方式 并且整个方法都是在同一个线程池里面的 主要对于client的修改: pom: <project xmlns="http ...
- 2.HelloWorld程序
1.流程图 2./itcast0711/src/main/java/cn/itcast/a_helloworld/HelloWorld.java package cn.itcast.a_hellowo ...
- spring boot项目多环境配置文件设置
具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...
- springmvc接受表单多条数据的值
点击下面链接查看具体内容: http://blog.csdn.net/lutinghuan/article/details/46820023
- 英语发音规则---L字母
英语发音规则---L字母 一.总结 一句话总结:[l]音在词首和词尾的发音不同,/l/+其它音节./l/+元音./l/+/j/称它为清晰/l/,发清晰/l/音时,在下一个音即将出出时舌头离开上齿龈,迅 ...
- 分享知识-快乐自己:Nginx概述及如何使用
概述: 什么是 Nginx? Nginx (engine x) 是一款轻量级的 Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse ...