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加速的最速下降法 共轭梯度法 牛顿法 拟牛顿法 使用函数表示一个用于优化的目标, ...
随机推荐
- php在不同平台下路径分隔符不同的解决办法
在看phpamf时看到一个常量“DIRECTORY_SEPARATOR”,最后发现是一个全局的常量,用来定义路径分隔符的 主要解决在windows和linux下路径分隔符不同的造成代码不通用的问题,在 ...
- java上传文件,下载文件
1.上传文件 1 protected int doTask(BaseForm form) throws AppException, FatalException, NoExistsException, ...
- iOS 图文混排 链接 可点击
对于这个话题 我想到 1 第一个解决方法就是使用 webView 比较经典 把所有复杂工作都交给控件本身去处理了, 但是好像好多需要自定义的地方 没法从 webView获得响应回调 :(估计也可以实 ...
- 每天一个Linux命令(32)date命令
date命令是显示或设置系统时间与日期. (1)用法: 用法: date [选项] [参数] (2)功能: 功能: 根据指定格式显示 ...
- 【Flask模板】宏的概念和基本使用
# 宏:模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量.使用宏的时候,参数可以为默认值.相关示例代 ...
- 常用阻止ajax缓存方法集锦
HTML 通过添加meta标签 <meta http-equiv= "pragma" content= "no-cache"/> (pragma: ...
- 通过代码设置资源名字,为打包AssetBundle做准备,以及新打包系统
核心代码就是 importer.assetBundleName = name; 但是在这之前,我们需要超找到具体的资源,我们当然是不希望一个一个手动去查找.如果我选择一个文件夹,就可以查找到里边所 ...
- Map集合按照value和key进行排序
最近由于特殊的业务需求,需要做相关数据排序,下面就贴出其中的将map集合中按照value或者key进行排序的代码,后面再具体详说. /** * map 集合排序 * @param map * @ret ...
- 使用vsftp搭建ftp服务
第一步:安装vsftp pam db4 yum install vsftpd pam* db4*-y ================================================= ...
- Java 面试题问与答:编译时与运行时
Java 面试题问与答:编译时与运行时 2012/12/17 | 分类: 基础技术, 职业生涯 | 5 条评论 | 标签: RUNTIME, 面试 分享到:58 本文作者: ImportNew - 朱 ...