很早就听说过PMM,Percona开发的一套对MongoDB, MySQL, Postgres建立监控系统的套件。曾经也抽空想试用下,但由于使用上的各种毛病,以及文档欠缺,没成过。最近在Mongo中文社区里听群友谈到已经有PMM2了,迫不及待地搭建一把,看看什么样子,毕竟网络上详细谈PMM搭建的貌似不多,此文抛砖引玉。
PMM
PMM是什么呢?简单说这是Percona开发的用来监控mysql, postgres,mongodb的一揽子方案,即它把该用的组件全部包在一起了,只向外暴露一个pmm-client, 一个pmm-server;里面囊括了cloud-native氛围下大为流行的prometheus, grafana监控工具。
其pmm-client 主要包括各种 exporters(exporter是prometheus中的概念,是一种将服务metrics抓取的第三方工具,供prometheus来scrape),如node_exporter抓取主机metrics信息, mongodb_exporter抓取mongod, mongos metrics信息。
pmm-server内将prometheus,grafana, consul等工具一起打包,以整体方式提供服务;其中prometheus是时序数据库,grafana是监控面板系统,其可配置prometheus为它的一个数据源, consul作为服务发现组件,便于屏蔽后端的节点变更。
且它们都是开源的,见
https://github.com/percona
安装
客户端pmm-client
很多文档说用yum安装,但我没成过,估计是添加yum源的问题。干脆直接rpm安装,下载地址:
https://repo.percona.com/yum/release/7/RPMS/x86_64/pmm2-client-2.5.0-6.el7.x86_64.rpm
(不一定得是2.5,有更高版本也可用)
服务端pmm-server 2
v2版本,而不是v1,貌似很不兼容,曾经搭v1没搭成
此次为方便起见,采用了多数文章建议的方式,docker 容器运行,步骤:
- 创建容器及其volume
dockercreate -v /srv --name pmm-data percona/pmm-server:2 /bin/true
- 启动pmm-server 2
dockerrun -d -p 8080:80 -p 443:443 --volumes-from pmm-data --name pmm-server--restart always percona/pmm-server:2
如果主机不允许docker运行,恐怕得需自行编译了。官方文档似乎并未说清楚该如何自行编译打包安装,有朋友探索过不妨分享下。
注册节点
这里注册节点的意思就是指把各个mongos, mongod节点加入到监控中。这是通过pmm-client来做的。
首先,pmm-client要感知到pmm-server:
# pmm-admin config --server-insecure-tls--server-url=https://admin:admin@<ip>
- admin,admin是默认的用户、密码,<ip> 是pmm-server 的ip地址
- 如果下次想重置,可以用 --force
此命令的输出其实是每台 pmm-client机器上启动了 pmm-agent进程,用以采集各service的数据
然后,加入mongod 节点,
# pmm-admin add mongodb --cluster"cluster1" --replication-set "cluster1_0" --username xxx--password xxx <ip>:<port> <ip>:<port>
命令格式我们可以随时用pmm-admin addmongodb -h 来查看。有些选项含义是显而易见的,可以知道第一个ip:port指 service name, 第二个是service address。我习惯让service name取值为service address,好处是在grafana的 Service Name下拉框里会显示 ip:port,这样我们更易区分同一机器上的不同节点(默认时取为主机名,非常不适合标识同一机器上的不同节点!)。如下图所示:
另外,我并未按照官方文档
https://www.percona.com/doc/percona-monitoring-and-management/conf-mongodb.html
中说的先创建 mongodb_exporter,分配clusterMonitor权限来做,直接用一个有足够权限的用户也可以;当然单独分配一个用户应该更安全;
如果是添加mongos节点,和mongod差不多,不过需移除 --replica-set 选项
将mongod, mongos加入后,我们可通过 pmm-admin list发现,服务节点已经注册了:
如果进入到pmm-server容器中去看, 会发现,在 /etc/prometheus.yml中已经加入了多个targets,
然后去<host>/prometheus/targets,我们会发现,所有的targets都UP状态,如果有不是UP状态的,看看是否是网络故障或配置问题:
效果图
下面以我的本地一主二从的副本集集群 1p2s 举例,YCSB以insert ops=100 load
集群指标
框住部分表明是在做 insert ops=100
副本集指标
实例指标
WiredTiger指标
主机指标
可见指标是多么地集中、丰富!对于分析定位问题,抓住因果关系,是非常有利的。
结语
相信看到这里,大家能明白,PMM其实是一套可以快速建立mongo监控系统的工具,非常适合于迭代开发、测试过程。当然由于其各个组件被bundle在一起,可能存在以下的缺陷:
1. 无法灵活扩展,节点多了后,一个pmm server能撑住吗?
2. 如果是云服务,可能需要重新考虑架构,负载均衡,自动化配置等
3. 不容易定制。pmm-client, pmm-server是不是暴露了足够多的功能供调用呢?特别是如果我们想定制grafana 的template 变量,label不满足需求怎么办?
4. 面板中的metrics计算是否都准确?很多指标需要熟悉
当然我们也可以选择单独部署各个组件,毕竟PMM证明了可行性。比如我们考虑把无状态的服务如exporter, grafana 放到k8s集群里,其管理由k8s负责;甚至prometheus带有 data目录的组件也可放进去,毕竟是时序数据库,可以允许一定时间的rotation。这样好处就是灵活,管理也不复杂,交给k8s,但配置会略微麻烦,得很懂 prometheus.yml的语法。最终可怎么用,看我们的需求了。
作者:陈仕
一名热衷和专职于数据库、分布式、存储技术的技术人,对linux内核、微处理器架构也颇有兴趣。工作初接触redis/couchbase/scylladb等NoSQL数据库,现在腾讯做mongo云数据库开发。业余时间喜欢爬山,研究论文,学习人文。
References
[1]https://www.percona.com/blog/2019/07/23/pmm-for-mongodb-start-guide/
[2]https://www.percona.com/blog/2019/09/19/installing-percona-monitoring-and-management-pmm-2-for-the-first-time/
[3]https://www.jianshu.com/p/ed2bf649a43f
[4]https://www.jianshu.com/p/dffe5b2d29c2
[5]https://jira.percona.com/browse/PMM-3980
[6]https://www.percona.com/doc/percona-monitoring-and-management/2.x/manage/client-config.html
[7]https://forums.percona.com/discussion/47945
[8]https://www.percona.com/doc/percona-monitoring-and-management/2.x/conf-mongodb.html
[9]https://www.percona.com/doc/percona-monitoring-and-management/pmm-admin.html
[10]https://www.percona.com/blog/2018/01/17/troubleshooting-percona-monitoring-and-management-pmm-metrics/
[11]https://www.percona.com/blog/2018/07/05/configuring-pmm-monitoring-mongodb-cluster/