MONGODB 监控 那些基本 “点” 到东拉西扯 (一)

2020-03-31 14:17:13 浏览数 (1)

最近老有一些文字,写 MONGODB 不安全,漏洞,损失之类的文章,点进去看,原来就是没有设置 MONGODB 最基本的 安全验证,俗称用户名密码,你放那个数据库,都不安全,这样博人眼球的文字,我比较“反感”,因为有些 “高层人士”,会一遍遍的问,这个MONGODB 安全吗,最近看经常有说MONGODB 不安全,有漏洞的,所以,请写这样文字的人,有点公德心,好好的一个MongoDB 要上线被高层叫停,你是何等心情。

话归正题,MOGNODB 的确是很“皮实”的一个数据库,(要不都是雷神做封面)。但MONGODB 在“耐X”你也得监控他不是,要不你使用过度出了差错那就很难搞了。

其实从监控数据库的角度来看大体的监控点都是趋于一致的,然后就是根据每种数据库的细枝末节来进行,区别化对待。

一般那MONGODB 怎么来从里到外的监控,下面就来 TALK 一下

1 使用mongodb 很少有单机来搞,复制集是标配,所以复制集的滞后就是一个点,复制延迟是指将数据从主节点复制到辅助节点的延迟。这当然的被监控。

2 复制状态,mongodb的主副本是随时因为某些因素切换的,所以副本状态跟踪辅助节点是否死亡以及是否有新主节点的选择的方法。

3 锁定状态的统计,锁定状态显示设置了哪些数据锁,以及它们的存在时间长度。

4 内存使用情况,相对于其他的数据库mongodbd的内存使用量更值得关注。

5 数据库的连接数

6 数据库的磁盘的使用率与程度。

7 语句慢查询

以上的内容不少,所以mongodb的监控应该是一个连续剧,今天就用 replication slave lag 来开刀

要看复制延迟那一定都要使用,rs.printSlaveReplicationInfo(), 这个命令,这个命令本身是可以在复制集中任何的节点中运行的,这个地球人都知道。

但这里有一个问题,就是在主节点一段时间没有任何操作的过程中,再次操作,此时如果执行了 rs.printSlaveReplicationinfo 会显示负值,主要的原因他会接受来自primary节点之前的心跳来对比现在的optime 则会在很短的时间又显示负数的可能,负数的大小与主库有多长时间不活动有关。

所以这里建议的是,在主库运行rs.printSlaveReplicationinfo命令。

以上的建议在最新的mongodb 的版本依然有效。

而rs.printReplicationInfo(), 是另一个针对复制有关的命令,这个命令可以观察你本地的oplog的size以及你的oplog 还可以接受多长时间的数据,first 和 last event 的时间是多少等等,信息。

需要提到的MONGODB 3.4 以及以前的版本,是不能随便改动 oplog的,这其实不是好事,就如同 MYSQL 不能随便变动 innodb_buffer_pool_size 在MYSQL 运行的时候,并且改动很麻烦。

所以如果还在使用MONGODB 3.4 之前的版本,还是很有必要升级到更新的版本。

至于其他的点,后面会继续,下面是一些常用,或可能你不知道的MONGODB 的简单的监控工具。

1 最常用的监控程序就是MOGNODB 自提供的 mongostat 通过 mongostat 可以查看 insert query update delete 等操作的类型并且mongostat 是可以对 mongod 和 mongos 提取监控的数据的。

同时为了保证数据的安装 mongostat 也是需要输入用户名和密码的并且你提供的用户需要 clusterMonitor 的权限。

通过这个基本的监控,我们可以掌握,例如某些故障时刻或数据库不正常时刻的 insert query,update delete 的数据量,看看有什么异常,同时也可以看到 dirty 看看脏页是否过多,系统的资源是否有异常。

insert:每秒插入数

query:每秒查询数

update:每秒更新数

delete:每秒删除数

getmore:每秒返回的游标数

command:每秒的命令数(其中从库用管道符|将本地数据和复制数据隔开)

dirty: wiredtiger特有的参数,记录wiredtiger缓存中脏数据的比例。

used: wiredtiger特有的参数,记录wiredtiger缓存使用百分比。

flusher: 每个查询间隔之间的checkpoint触发次数。

Vsize:虚拟内存使用量。

res:物理内存使用量。

qrw: 客户端等待从MongoDB实例读写数据的队列长度

arw:执行读写操作的活跃客户端数量

netIn:MongoDB实例的网络进流量。

netOut:MongoDB实例的网络出流量。

conn: 连接数。

set:复制集名称。

repl:复制集中的状态

当然如果你觉得这个命令在查看一些对比上一条数据之间有多少差异的数据时比较麻烦,你可以使用 MONGOSTAT 提供的 diff 命令来满足你的需求-o 'host,mem.bits,metrics.document.inserted.diff()=inserted diff,metrics.document.inserted=inserted'

他会给出你,当前插入的行数与对比上一次插入的相减后的差额,好进一步查看当前的数据库的任务是递增还是递减的状态。

那如何通过命令行的方式,一次性的监控复制集中所有机器,并且是交换的方式 mongostat 也提供了相关的方式

当然如果你在初接手mongodb 或集合的情况下,你也可以使用 pt-mongodb-summary (需要安装 PT 工具),来对你当前的服务器或者复制集进行一个扫描,获得一些基本的信息。

0 人点赞