MongoDB4.4之后不再自带mongostat命令,需要手动安装下载MongoDB Database Tools
然而网络上好多过时的资料不会给你强调这一点
... # 登录至mongo所在服务器
cd $存放路径
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel70-x86_64-100.5.2.rpm
yum install -y cyrus-sasl-gssapi cyrus-sasl-plain
yum install -y cyrus-sasl
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.5.2.rpm
(base) [root@s mongo_tool]# mongostat --host localhost:27017
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 0|0 0.0% 63.2% 0 4.57G 2.94G 0|0 1|0 111b 43.6k 20 Jan 4 14:58:36.840
*0 *0 *0 *0 0 1|0 0.0% 63.2% 0 4.57G 2.94G 0|0 1|0 112b 44.3k 20 Jan 4 14:58:37.833
命令默认host为localhost:27017, 如果不是需要修改
mongostat --host localhost:27017
开启认证则需要填写mongoDB用户名,密码以及认证库(一般是admin)
用户需要有测试数据库clusterMonitor角色权限
如何给账户赋予权限?
参照:Manage Users and Roles — MongoDB Manual
如何在mongostat中填写认证信息?
mongostat -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin
--noheaders
去除header,
-n 60 60
代表每60s查询一次状态, 查询60次(60min), 可以根据压测时间灵活配置
mongostat --noheaders -n 60 60>> test.log
其他命令参数可参照Reference官网文档及简书文章
代码逻辑:
最终会生成一个html图表, 可以作为mongo测试报告使用
import os
import re
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
from pyecharts.charts import Bar, Page
from pyecharts import options as opts
from pyecharts.globals import ThemeType
def text2list(text: str):
temp = text.replace("|", " ").replace("*", " ").replace("G", " ").replace("M", " ").replace("b", " ").replace("k", " ")
return re.split("\s+", temp)
def data_clean(attrs_origin: str, filename: str):
"""获取数据并进行清洗"""
data = pd.read_table(filename)
# list = []
list = []
for i in data.values:
# 删除* , 将|转换为空格
li = text2list(i[0])
# 删除无用参数, 和attr对齐
temp = li[1:20]
temp.append(li[-1])
list.append(temp)
data = pd.DataFrame(list, columns=text2list(attrs_origin))
return data
def series2list(data: pd.DataFrame ,column: str):
# 获取1列数据
data_str = list(data[column])
return list(map(eval, data_str))
if __name__ == '__main__':
# 数据清洗 : attrs_origin一般不需要动, 指定filename
attrs_origin = "insert query update delete getmore command|command2 dirty used flushes vsize res qr|qw ar|aw net_in net_out conn time"
filename = "test_s10.log"
data = data_clean(attrs_origin, filename)
# 图表生成
time_data = list(map(lambda x:x[0:5] ,data['time']))
# 将文本转化为数字
insert = series2list(data, "insert")
query = series2list(data, "query")
update = series2list(data, "update")
delete = series2list(data, "delete")
flushes = series2list(data, "flushes")
res = series2list(data, "res")
ar = series2list(data, "ar")
aw = series2list(data, "aw")
qr = series2list(data, "qr")
qw = series2list(data, "qw")
conn = series2list(data, "conn")
# 使用pyecharts形成图表
page = Page(layout=Page.DraggablePageLayout)
bar1 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("insert", insert)
.add_yaxis("query", query)
.add_yaxis("update", query)
.add_yaxis("delete", query)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo增删改查监控图", subtitle="此曲线图反映了Mongo执行增删改查命令的次数变化"))
)
bar2 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("flushes", flushes)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo flushes监控图", subtitle="此曲线图反映了Mongo缓存数据的频率, 长期为1则可能存在性能问题"))
)
bar3 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("account read", ar)
.add_yaxis("account write", aw)
.add_yaxis("queue read,", qr)
.add_yaxis("queue write", qw)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo读写队列监控图", subtitle="此曲线图反映了Mongo执行读写操作和等待读写操作的客户端数量, 一直在累计增大则可能存在性能问题"))
)
bar4 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_data)
.add_yaxis("conn", conn)
.set_global_opts(title_opts=opts.TitleOpts(title="Mongo conn连接监控图", subtitle="此曲线图反映了qr,qw,ar,aw连接总数,建议在5000以下"))
)
page.add(bar1, bar2, bar3, bar4)
page.render("test.html")
os.system("test.html")
pyecharts效果示例
指标 | 异常情况 | |
---|---|---|
flush | 把缓存数据强行输入,1则为进行了flush操作 | 频繁为1则为异常 |
res | 物理内容使用量 | 突然下降则为异常 |
ar | account read,执行读操作的活跃客户端数量 | 数值很大则为异常 |
aw | account write,执行写操作的活跃客户端数量 | 数值很大则为异常 |
qr | queue read,读操作的队列长度 | 一直在累计增大 |
qw | queue write,写操作的队列长度 | 一直在累计增大 |
conn | 连接总数,qr,qw,ar,aw综合 | 建议在5000以下 |
其他打印参数可参照Reference
clusterMonitor
角色的账户,并且在mongo命令中指定账号密码很多中文二手资料失真严重, 有条件多看看官方文档