MongoDB接入PMM监控之初探

2020-06-24 15:33:39 浏览数 (1)

很早就听说过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/

0 人点赞