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更难!
以上插了些题外话。优化上过程中,也需要和开发同事保持有效沟通。当我们理解慢查询产生的业务场景后,有时让开发同事配合做个简单的功能优化,头痛的性能问题也能随之解决。
转载于:https://www.cnblogs.com/duanxz/p/3621155.html
MongoDB优化之二:常见优化方法相关推荐
- SQL性能优化技巧,常见优化10经验,数据库查询好慢,还能怎么办
我熟练应用ctrl c和ctrl v 开发curd代码好多年了. mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那 ...
- mysql 极限优化配置_MySQL优化(二) 优化诀窍
一.索引的使用 (1)查询要使用索引最重要的条件是查询条件中的字段建立了索引: (2)下列几种情况可能使用到索引: <1> 对于创建的多列索引,只要查询条件使用了最坐边的列,索引一般就会被 ...
- 关于SQL优化的二十个小方法
一.查询SQL尽量不要使用select *,而是具体字段 1.反例 SELECT * FROM user 2.正例 SELECT id,username,tel FROM user 3.理由 节省资源 ...
- 在机器学习中,怎么对超参数Hyper parameter优化?我总结了以下常见的方法
@Author:Runsen 机器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数( ...
- Android性能优化(2):常见内存泄漏与优化(二)
文章目录 1. Android虚拟机:Dalvik和ART 1.1 JVM与Dalvik区别 1.2 Dalvik与ART区别 1.3 Dalvik/ART的启动流程 2. 常见内存分析工具 2.1 ...
- 性能优化指南:性能优化的一般性原则与方法
作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应用还是分布式系统.本文从以下几个方面来思考这个问题:性能优化的一般性原则,性能优化的层次,性能优化的 ...
- MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)
mongodb索引详解(Indexes) 索引介绍 索引在mongodb中被支持,如果没有索引,mongodb必须扫描每一个文档集合选择匹配的查询记录.这样扫描集合效率并不高,因为它需要mongod进 ...
- MySQL性能优化(二)
1.MySQL基础操作一:MySQL基础操作1:MySQL表复制复制表结构 + 复制表数据create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样)ins ...
- CSDN问答标签技能树(二) —— 效果优化
目录 系列文章 1. 问题背景 2. 技能树优化 2.1 技能树结构优化 2.1.1 知识覆盖率 2.1.2 等级体系 2.2 匹配算法效果优化 2.2.1 匹配算法的优化 2.2.2 预处理优化 2 ...
- 【学习笔记】产品经理必备技能之数据分析(二)常见数据分析方法(上)
内容来自小破站<黑马程序员-产品经理必备技能之数据分析>复习自用 [学习笔记]产品经理必备技能之数据分析(二)常见数据分析方法(上) 3 常见数据分析方法 3.1 基础数据分析(日常工作) ...
最新文章
- Cucumber 入门一
- github创建一个新的tag
- php接收文件,如何通过php 发送与接收流文件
- springboot指定注解扫描范围
- 不服OceanBase跑分?今天起可到阿里云上一战
- WOOTConf 2017:Lockpicking,Willie Nelson开发人员等等
- 前端综合性文档和教程总结(持续更新)
- Ubuntu下映射串口设备到docker
- 【火炉炼AI】深度学习006-移花接木-用Keras迁移学习提升性能
- 机器学习初学者入门实践:怎样轻松创造高精度分类网络
- 机器学习python_深入浅出Python机器学习[PDF][176.39MB]
- OI造数据以及Lemon评测教程
- 基于PDF和JSPDF实现调整pdf文件大小功能
- 基金常用的分析指标:跟踪误差率、信息比率、夏普比率到底是什么意思?
- 电脑桌面上文件夹图标右上角有双箭头
- 华为服务器cpu位置,服务器cpu参数详解
- 概括TTL、RS32、RS485特点及区别
- Robot Toolbox (一):Puma机器人仿真
- Delphi XE5教程9:基本语法元素
- 英语美文阅读:当爱向你们挥手
热门文章
- 网站打开速度多少毫秒为正常_个人做shopify-怎么测试和优化网站打开速度
- 挑战程序设计竞赛_实力爆棚!2019年,华中科技大学拿下亚洲区竞赛金牌4枚!...
- html纵向的跑马灯效果,HTML+CSS入门 如何实现跑马灯/走马灯效果
- jekenis父子结构项目打包_maven 父子工程打包 并且上传linux服务器
- 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
- 升级 ubuntu_重要:Canonical 安全更新,请相关 Ubuntu 版本赶紧升级
- golang语言变量定义、打印、占位符
- eclipse配置本地连接 hadoop
- ios mysql 创建不同的用户表_iOS中数据库-创建表-增删改查数据-基础语法
- mysql id会用完吗_数据库自增ID用完了会怎样?