前言
mtools是什么
可以做什么
1. 简易集群管理
2. 日志统计
3. 日志过滤
4. 图表呈现
如何安装
参考文档
前言
接触 mongodb 已经有一段时间了,从一开始的不了解,到现在已慢慢适应这个nosql领域的佼佼者,还是经历了不少波折。
众所周知的是,mongodb不是关系型数据库,不遵循经典的"三个范式",也没有表关联、事务(直到最新的4.0版本才实现)等传统数据库的特性。
然而mongodb自带的无schema、副本集、自动分片等能力获得了大量的青睐,而更值得一提的是数据库本身提供了大量的监控、分析工具命令,对运维管理提供了很大的便利性。
既然谈到了工具,本文要介绍的是一款叫mtools的工具。在此段期间,笔者一直在组织线上数据库日志的收集分析,由于没有较好的工具支撑,每次的分析工作总需要投入大量的人力。
在这种情况下,mtools 便可以帮助于大幅度提升效率,下面的篇幅开始介绍这个工具。
mtools是什么
mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析、统计功能,此外还支持本地集群部署管理,非常便于新手学习。
github地址,该套工具非官方公司维护,仅由作者做开源维护,目前项目的更新频度并不高,但已经有大量的使用者。
mtools使用python编写完成,可通过pipy网站 获取;
该工具包含了以下几个关键组件
mlaunch
支持快速搭建本地测试环境,可以是单机、副本集、分片集群。
mlogfilter
日志过滤组件,支持按时间检索慢查询、全表扫描操作,支持通过多个属性进行信息过滤,支持输出为JSON格式。
mplotqueries
支持将日志分析结果转换为图表形式,依赖于tkinter(python图形模块)、和matplotlib模块。
mlogvis
支持将日志分析结果转换为一个独立的HTML页面,实现与mplotqueries同样的功能。
网上关于mtools的资料已经不少,包括其官方文档的说明都比较详细,这里仅对工具的使用场景做简单介绍
可以做什么
1. 简易集群管理
执行以下命令,可以启动一个单节点的mongod进程。
# mlaunch init --single
launching: "mongod" on port 27017
可对比单节点手工搭建
再执行另外一个稍复杂点的命令:
# mlaunch init --sharded 2 --replicaset --nodes 3 --config 3 --csrs --mongos 3 --port 27050 --auth --username admin --password admin@2016 --auth-db admin
launching: "mongod" on port 27053
launching: "mongod" on port 27054
launching: "mongod" on port 27055
launching: "mongod" on port 27056
launching: "mongod" on port 27057
launching: "mongod" on port 27058
launching: config server on port 27059
launching: config server on port 27060
launching: config server on port 27061
replica set 'configRepl' initialized.
replica set 'shard01' initialized.
replica set 'shard02' initialized.
launching: mongos on port 27050
launching: mongos on port 27051
launching: mongos on port 27052
adding shards. can take up to 30 seconds...
Username "admin", password "admin@2016"
什么?已经完成了一个双副本集分片集群的搭建!27050是起始端口,--sharded 2 表示有两个分片,--replicaset 表示启用副本集,
--config 3 --csrs 表示config 使用CSRS结构的3节点副本集,--auth 表示启用鉴权, --username --password 为初始化的用户,默认该用户将拥有所有库的管理权限。
整个集群的架构如下图所示:
![](http://upload-images.jianshu.io/upload_images/8586523-074a1311d7f23753.png?imageMogr2/auto-orient/strip|imageView2/2/w/662)
可以通过以下命令进行管理
]# mlaunch list
PROCESS PORT STATUS PID
()
mongos 27050 running 13017
mongos 27051 running 13059
mongos 27052 running 13093
()
config server 27059 running 12134
config server 27060 running 12217
config server 27061 running 12261
()
shard01
primary 27053 running 12404
secondary 27055 running 12559
mongod 27054 running 12509
()
shard02
secondary 27057 running 12793
secondary 27058 running 12845
mongod 27056 running 12697
()
()
auth: "admin:admin@2016"
启动停止
# mlaunch stop
sent signal 15 to 12 processes.
# mlaunch start
launching: config server on port 27059
...
这是相当方便的,可以对比分布式集群搭建手记 这篇文章所描述的流程,相比手工搭建,该工具可缩减几十倍时间。
2. 日志统计
mloginfo 是一个用于做日志信息统计的工具,输入以下命令:
# mloginfo mongo.log
source: mongo.log
host: MongoDB_1:10001
start: 2018 May 18 16:33:11.692
end: 2018 May 19 01:13:08.290
date format: iso8601-local
length: 144480
binary: mongod
version: 3.4.10
storage: wiredTiger
可以看到日志的起止时间范围、主机端口、版本、数据库引擎等概要信息。
连接数
当我们希望检查客户端的连接数情况时,可以执行以下命令:
# mloginfo mongo.log --connections
CONNECTIONS
total opened: 14282
total closed: 14358
no unique IPs: 4
socket exceptions: 0
127.0.0.1 opened: 12886 closed: 12889
172.21.0.29 opened: 658 closed: 716
172.21.0.28 opened: 461 closed: 490
172.21.0.27 opened: 277 closed: 263
通过这样的信息,进一步判断是否存在连接过载等异常情况。
事件统计
又或者,你希望统计出当前某些事件的发生频次。
# mloginfo mongo.log --distinct
DISTINCT
14358 end connection ... ( ... now open)
14281 connection accepted from ... # ... ( ... now open)
13075 received client metadata from ... :
5340 Successfully authenticated as principal ... on
1194 Use of the aggregate command without the 'cursor'
338 build index on: ... properties:
244 building index using bulk method; build may temporarily use up to ... megabytes of RAM
234 ns: ... key: ... name:
219 Refreshing chunks for collection ... based on version
218 Refresh for collection ... took ... ms and found version
179 Index ... :
慢查询
在业务问题分析中,慢查询是最常见的问题。
# mloginfo mongo.log --queries --sort count
QUERIES
namespace operation pattern count min (ms) max (ms) mean (ms) 95%-ile (ms) sum (ms)
nsspace.StatisticsHour find {"$and": [{"recordTime": 1}]..} 22331 276 747 345 414.0 7720736
nsspace.StatisticsHour getmore {"aggregate": 1, "cursor": ...}]} 231 200 304 227 272.0 52587
dmspace.DeviceInfo remove {"_id": 1} 109 205 1786 420 771.0 45860
cmspace.DeviceData update {"appId": 1, "deviceId": 1} 95 201 1802 431 824.5 40966
dmspace.TaskHistory update {"_id": 1} 54 268 2643 692 2019.0 37413
nsspace.StatisticsDay find {"$and": [{"recordTime": 1}], ..} 31 201 348 241 345.0 7472
如上面的命令,将显示所有慢查询,并按出现次数排序。
重启信息
# mloginfo mongo.log --restart
RESTARTS
May 18 21:37:51 version 3.4.10
May 18 21:48:33 version 3.4.10
通过检测重启信息,对系统潜在的故障进行评估分析。
副本集切换
同样,主备切换可能导致一定的业务失败,需要定期监测。
# mloginfo mongo.log --rsstate
RSSTATE
date host state/message
()
May 18 21:48:53 172.21.0.29:10001 ARBITER
May 18 21:49:26 172.21.0.28:10001 SECONDARY
3. 日志过滤
mlogfilter是一个强大的日志过滤模块,相比linux 的grep/egrep的文本过滤,该组件可以对日志内容进行解析,并按我们想要的结果进行过滤。
查看超过10s的慢操作
# mlogfilter mongo.log --slow 10000 --shorten 200
2018-05-18T21:49:04.069+0800 I REPL [ReplicationExecutor] Starting an election, since we've seen no PRIMARY in the past 10000ms
2018-05-18T21:50:22.988+0800 I COMMAND [conn31] command dmspace.fs.chunks appName: "Mong...quireCount: { w: 46 } }, oplog: { acquireCount: { w: 46 } } } protocol:op_command 10804ms
2018-05-18T21:50:22.988+0800 I COMMAND [conn44] command dmspace.DeviceInfo command: inse...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10931ms
2018-05-18T21:50:22.988+0800 I COMMAND [conn157] command dmspace.Lwm2mDevice command...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10762ms
2018-05-18T21:50:22.988+0800 I COMMAND [conn156] command dmspace.TaskHistory command: in...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10927ms
2018-05-18T21:50:50.104+0800 I COMMAND [conn31] command dmspace.DeviceInfo appName: "Mon...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10020ms
2018-05-18T21:50:51.203+0800 I COMMAND [conn156] command dmspace.fs.chunks command: inse...quireCount: { w: 51 } }, oplog: { acquireCount: { w: 51 }