监控 MongoDB 与其他数据库相比的性能
Mongodb 是一个单进程且灵活的非关系数据库。然而,由于其软件紧凑以及单进程和多线程的特点,它不具有完整的系统动态性能视图。和mysql类似,但是个人认为即使和mysql相比,缺点还是很明显的。另外,对于运维人员来说,大多数人都习惯使用令牌终端来解决问题。由于mongodb是基于json的,所以输出是json格式。相比关系型数据库输出的行列格式,我个人感觉还是比较可读的。贫穷的。因此,根据使用和维护需求升级MongDB的监控能力是运维的重要工作之一。无论是脚本还是工具平台的形式,都可以基于现有的IT能力,有计划、有步骤地实施。毕竟,不管白猫黑猫,能抓到老鼠的就是好猫。
收集和诊断数据库性能数据的方法比较:
数据库 | 流程结构 | 如何获取和诊断性能问题1. v$session、v$latch等动态性能视图可以关联反馈当前数据库实例的会话等待、会话CPU、IO等资源消耗查询 2。历史视图有很多或者AWR、ASH等。该工具可以分析历史性能问题 3. 可以进行各种级别的进程、会话、SQL语句或SSD监控以进行诊断 4. 由于多进程结构,大多数异常进程都会生成跟踪文件来辅助诊断诊断。问题 | |
mysql | 一个进程多线程 | 1.查询 2 具有少量的多个性能视图。有独立的慢日志来检索执行慢或者开销大的SQL语句 | |
mongodb | 一个进程多线程 | 1. 使用mongotop和mongostat工具进行诊断 2. 动态性能很少池或数据库命令日常运维中,数据库性能监控是主要任务之一。使用mongodb,由于历史性能信息不存储在数据库中,因此我们可以使用集中监控软件或自己编写脚本来收集和存储本地性能数据。本文仅介绍使用Mongodb自带的工具或命令来捕获性能。数据。 1。操作系统资源使用监控 操作系统资源使用监控(CPU、内存、IO 等资源)是各个数据库产品必须实现的,本文不做介绍。 2。 mongotop&&mongostat mongotop和mongostat是mongodb官方提供的两个工具,用于监控数据库各个层面的性能。他们可以检索实例全局和表级性能数据。运行这两个命令,实现操作系统的预定动作,并保存结果的输出,可用于历史性能分析。 1),mongotop 返回数据库池级别的读写时间消耗。输出结果按照读写时间降序排列。排序越高,总访问的并发性或执行的 MQL 量就越大。应用程序执行计划不是最优的。输出示例为: 2)、mongostat mongostat 类似于操作系统命令 vmstat,每秒全局返回实例的整体性能,包括读写次数、内存使用情况、锁队列、网络、连接数和其他信息。如果是集群,建议使用-discover参数来获取集群的全局信息。 Oracle 有一个强大的监控工具,称为 Oswatcher。对于合理的脚本编写,使用 mongostat&&&mongotop 来实现与 oswatcher 类似的功能,使用 crontab 定期调用它,这可以用作历史性能数据分析。 3。慢查询分析 Mongodb慢查询可以从system.profile集合中获取,也可以在设置profile后从数据库日志中获取。将命令设置为db.setProfilingLevel(level, options),例如db.setProfilingLevel(1,{slowms: 200}),表示级别为1,捕获超过200ms的操作。设置级别为0表示不捕获,级别为2表示捕获所有操作。可以通过 db.getProfilingStatus() 命令查询当前的配置文件设置级别。 1)、system.profile system.profile 是一个固定大小的 1 MB 集合,在使用 db.setProfilingLevel(level, options) 命令设置后在每个库中创建。该集合基于指定的配置文件级别。保存超过指定时间的全部或多个操作命令信息。如果存储的数据量超过1MB,历史数据将被自动删除。 保存信息示例:
{ "op": "query", --操作类型为查询 "ns"###od: "opt.#em ", - 操作的库名称。全名 "command": { "find": "optNu###tem", --全名 "filter": { --过滤条件 "_id": { “res##id”:“10000000000000003733049”, “res##etype”:“3002” } } } } }♿} ,},限制项目数量 "singleBatch": true, "$db":"opnu###od" --库名称 }, "已探索的键": 0, ❓docs : 0, "光标耗尽": true, "numYield": 0, "locks": { ---此操作的锁定信息 "全局":"全局":" { "r": numberlong(2)}}, "数据库": { "帐户" r": NumberLong(1) } } }, ": { "acquireCount": { "r": NumberLong(1) } } }, }, } , },:0 sponseLength" : 237, "protocol": "op_query", "millis": 77432, --操作耗时,单位为毫秒 "planSummary": " IDHACK ", ---执行计划类型 "execStats": { "stage": "IDHACK", "nReturned": 0, "executionTimeMillisEstimate": ❀1,♿s: ♹ "改进": 0, "needTime": 0, "needYield": 0, "保存状态": 0, "恢复状态": 0,"恢复状态": 0,"恢复状态": 0, ❀ates," 0, "已检查密钥": 0, "已检查文档": 0 }, "ts": ISODate("2019-11-14" timeZation) ,- "客户端": "10***227", ---客户端IP "所有用户": [ { "用户": "user_admin", dmin":"b:"管理员" } ], "user":"user_admin@admin" }
♓pe 浅query 同时将慢查询信息保存一份到mongodb后台日志中,相对于system.profile集合,优点是永久保存,缺点是必须过滤慢日志信息从海量的日志中,但是如果数据库性能比较差,并发量比较高的话,目前可以在日志中看到大量慢速搜索的日志,一般来说可以很快找到问题所在 内容输出日志的内容与system.profile文件中记录的基本相同,但可读性稍差,性能稍差,例如见上图。 4。获取当前会话操作 如果需要获取当前会话信息,可以使用mongodb中的db.currentOp()命令。该命令获取的信息,类似于Oracle中v$session和v$process联合查询得到的信息,包括客户端类型、IP、要执行的命令、要执行的对象、执行计划、锁等详细信息信息,包括活动会话和非活动会话信息。要获取您需要的信息,可以通过相关过滤条件进行过滤,如下例所示: - 获取活动会话信息 db.currentOp( { "active " : true } ) - 查询所有等待锁定的会话信息,操作命令为添加、删除、修改。 db.currentOp( { "waitingForLock": true, $或:[ {"op" : { "$inte", " "删除"] } }, {"query.findandmodify": { $exists: true } } ] } ) )) 自版本 1 以来。管道阶段获取以下信息的当前会话的操作。更加灵活,返回一个指针,避免 db.currentOp 的最大 16MB BSON 大小限制。 true ,idleConnections: true ,idleConnections ,client:1,op:1,ns:1,microsecs_running:1}} , {$match:{client:{$exists:true}}} ]); 对于异常会话或需要很长时间才能完成的会话,您可以通过数据库终止客户端会话.killOp()命令,关系型数据库,如果存在大量慢查询,可以检查执行计划如果执行计划是全表扫描(COLLSCAN)语句,可以通过创建索引来优化查询,选择性更强的过滤条件。 db.collection.createIndex({field:1},{background,true}); 注意。在生产系统中创建索引时,必须在后台创建索引,即设置{background,true },否则会出现库级锁 2。数据库阻塞处理 作为轻量级NoSQL数据库,mongodb在并发锁管理方面相对较弱。有些操作会在库级别添加锁,例如前台索引创建、碎片整理、修复等。库级锁会阻止当前数据库上的所有操作。最明显的表现就是导致数据库会话数逐渐增多,阻塞时间过长也会导致连接中断。号码已满。此类操作一般都会记录在后台日志中。您还可以通过 db.currentop() 获取会话信息,然后通过 db.killOp() 终止会话。笔记。 Kilop 只能终止客户端会话,而不能终止所有操作。 3。内存优化处理 3.2版本之后,默认使用wiredtiger存储引擎。您可以通过cacheSizeGB参数设置存储引擎的内存使用上限。默认为系统内存的 60%。您可以通过 mongostat 监控内存缓存使用情况。一般使用率低于80%。如果长时间90%使用率或者脏10%,你可能会考虑增加内存或者检查IO。 4。数据库写入性能较差 写入性能较差。需要确定是整体性能较差还是某个特定集合写得不好。如果整体性能较差,请检查IO并考虑更换性能更好的。存储或碎片来分解IO。如果某个集合写性能较差,需要检查该集合是否索引过多,或者是否是高并发或异常语句导致异常锁。
- 查询从未在给定库中使用过的注册表。如果索引长时间没有使用,建议删除 db.getCollectionNames().forEach(function(collection){ if( db[collection].getIndexes().length ! = 1){ print("索引 "+ 集合 + ":"); db[集合].aggregate([{ $indexStats:{ } },{ 项目:{ 主机:0 } }]).forEach( function(opDoc){ if(opDoc.access!= id_.0& ops=""){ printjson( opDoc); } }); } }); }); 查看更多 5. 便捷的数据生命周期管理 TTL 索引是一个特别的MongoDB的索引,可以支持文档在一定时间后自动过期和删除。可以为除_id之外的所有字段创建,但只有当字段值为时间或者数组包含时间时,TTL索引才会执行删除操作。如果数组包含多个时间,则计算数组中最小的时间。 。 示例:db.collection.createIndex({ "InsertTime": 1 }, { expireAfterSeconds: 2592000} ); 6.内存数据库引擎 Mongodb Enterprise Edition 有自己的内存数据库引擎,但需要 TOLL。在连接版本中,您可以将数据文件(dbpath)放在/de/shm中以隐蔽地使用内存引擎。 注意:由于内存一般不会太大,因此建议明智地选择公司并使用固定大小的集合。 |
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。