Percona Monitoring and Management (PMM) 安装与配置

发布于 2024-04-15
PMM 全称是 Percona Monitoring and Management,是一个开源的数据库监控工具,支持 MySQL、MariaDB、MongoDB、PostgreSQL 等数据库,提供了丰富的监控指标、图表、报警等功能。

PMM 全称是 Percona Monitoring and Management,是一个开源的数据库监控工具,支持 MySQL、MariaDB、MongoDB、PostgreSQL 等数据库,提供了丰富的监控指标、图表、报警等功能。

官方文档:https://docs.percona.com/percona-monitoring-and-management/index.html

PMM 中分为 PMM Server 和 PMM Client 两部分,PMM Server 用于存储监控数据并提供页面展示,PMM Client 用于采集监控数据。

1. 安装 pmm-server

version: '3'
services:
  pmm-server:
    image: percona/pmm-server:2
    container_name: pmm-server
    hostname: pmm-server
    restart: always
    volumes:
      - ./srv:/srv
    environment:
      - GF_SMTP_ENABLED=true
      - GF_SMTP_HOST=smtp.qq.com:465
      - GF_SMTP_USER=example@qq.com
      - GF_SMTP_PASSWORD=password
      - GF_SMTP_SKIP_VERIFY=false
      - GF_SMTP_FROM_ADDRESS=example@qq.com
      - GF_SMTP_FROM_NAME=Percona Alerting
    ports:
      - 80:80
      - 443:443

安装完成后,访问 https://<pmm_server_ip>/,输入用户名 admin 和密码 admin 登录。登录后会提示修改密码,修改完成后即可进入监控页面。如果你想使用脚本自动修改密码,可以使用以下命令:

docker exec -t pmm-server change-admin-password <new_password>

其中 <new_password> 为你要修改的新密码,pmm-server 为你的容器名称。

安装时还可配置是否禁止自动检测更新,数据保留时间,日志级别,Grafana 参数等,详细可参考 https://docs.percona.com/percona-monitoring-and-management/setting-up/server/docker.html#environment-variables

2. 创建 API 密钥

访问后点击左侧导航 -> Configuration -> API Keys 或直接访问 https://<pmm_server_ip>/graph/org/apikeys 可进入 API 密钥配置页面,这样可以使你修改 PMM Server 登录账号密码时无需再去修改 PMM Client 上的配置。

创建一个 Admin 权限的密钥,名称和过期时间自己根据情况填写,然后复制生成的 Key

详细可参考:https://docs.percona.com/percona-monitoring-and-management/details/api.html#authenticate

注意,目前 PMM 不支持 Service Account 认证方式,注意不要将 API Keys 迁移到 Service Account.

3. 安装 pmm-client

version: '3'
services:
  pmm-client:
    image: percona/pmm-client:2
    container_name: pmm-client
    hostname: pmm-client                                  # 如果你需要部署多个 pmm-client,推荐这里修改为更具辨识度的名字
    restart: always
    environment:
      - PMM_AGENT_SERVER_ADDRESS={{pmm_server_ip:port}}   # 注意这里要替换为 pmm_server 的地址
      - PMM_AGENT_SERVER_USERNAME=api_key                 # 如果使用 api key 则这里写 api_key, 如果使用 service account 则这里写 account name
      - PMM_AGENT_SERVER_PASSWORD=eyJrIjoiaEo4VklQR01qNFIxOTJnRkhkMHZFZjhIVE42Sm1lYjkiLCJuIjoidG9rZW4iLCJpZCI6MX0=  # 这里写生成的 key
      - PMM_AGENT_SERVER_INSECURE_TLS=1                   # 跳过 PMM 服务器 TLS 证书验证。
      - PMM_AGENT_SETUP=1
      - PMM_AGENT_CONFIG_FILE=config/pmm-agent.yaml
    volumes:
      - ./srv:/srv
    networks:
      pxc_net_overlay:                                    # 这里推荐先将 pmm-client 加入到 mysql 容器所在网络, 方便一会使用
        
networks:
  pxc_net_overlay:
    name: pxc_net_overlay
    external: true
    driver: overlay

文档中有许多 pmm-admin 开头的命令,由于我们的 pmm-client 是安装在 docker 容器中的所以需要加个前缀 docker exec pmm-client

如查看 pmm-client 运行状态:docker exec pmm-client pmm-admin status

4. pmm-server 验证 pmm-client 添加是否成功

添加 pmm-client 后可以在页面上点击左侧导航 -> Configuration -> Inventory -> Nodes 或直接访问 https://<pmm_server_ip>/graph/inventory/nodes 可以看到添加的 pmm-client

5. 向 pmm-client 注册 MySQL 服务

添加专有用户

在你要被监控的 MySQL 服务上创建一个专用的用户:

CREATE USER 'pmm'@'127.0.0.1' IDENTIFIED BY 'pass' WITH MAX_USER_CONNECTIONS 10;
GRANT SELECT, PROCESS, REPLICATION CLIENT, RELOAD, BACKUP_ADMIN ON *.* TO 'pmm'@'127.0.0.1';

上面的命令是创建一个名为 pmm 的用户,密码为 pass,授予允许 127.0.0.1 这个 ip 访问。不过由于我们使用 docker,需要将允许访问的 ip 修改为 pmm-client 容器访问 MySQL 时 pmm-client 的 ip,如果确认网络环境安全,也可使用 % 授予所有 ip。

向 PMM 服务端注册 MySQL 服务

使用 perfschema 监控模式,在 pmm-client 上执行:

docker exec pmm-client pmm-admin add mysql --username=pmm --password='pass' --query-source=perfschema <mysql_server_name> <mysql_ip:mysql_port>

使用 slowlog 监控模式,在 pmm-client 上执行:

docker exec pmm-client pmm-admin add mysql --username=pmm --password='pass' --query-source=slowlog --size-slow-logs=-1GiB <mysql_server_name> <mysql_ip:mysql_port>

关于两种模式的区别和更详细的参数可参考:https://docs.percona.com/percona-monitoring-and-management/setting-up/client/mysql.html

添加成功后会提示:

MySQL Service added.
Service ID  : /service_id/89eb3bb2-5d06-44ac-b404-dee9054a47d6
Service name: mysql_server_name

Table statistics collection enabled (the limit is 1000, the actual table count is 349).

然后就能在 pmm-server 仪表盘中点击左侧 MySQL 的 logo 看到监控的数据了,或者直接访问 https://<pmm_server_ip>/graph/d/mysql-instance-overview/mysql-instances-overview

6. 其他相关命令

6.1 查看 pmm-client 版本

docker exec pmm-client pmm-admin version

6.2 查看 pmm-client 状态

docker exec pmm-client pmm-admin status

6.3 查看当前 pmm-client 监控的服务

docker exec pmm-client pmm-admin inventory list services

6.4 查看当前 pmm-client 监控的 MySQL 服务

docker exec pmm-client pmm-admin inventory list services --service-type=mysql

6.5 从 pmm-client 中删除服务

docker exec pmm-client pmm-admin remove <service-type> <service-name>

6.6 从 pmm-server 中删除当前 pmm-client

docker exec pmm-client pmm-admin unregister

这需要确保没有任何服务在监控中,或者增加 --force 参数强制删除所有服务。

7. pmm-server 报警

这里介绍下如何配置 SMTP 来发送 Email 邮件,发件配置需要在 pmm-server 启动时增加环境变量来配置发信源,如:

version: '3'
services:
  pmm-server:
    image: percona/pmm-server:2
    container_name: pmm-server
    hostname: pmm-server
    restart: always
    volumes:
      - ./srv:/srv
    environment:
      - GF_SMTP_ENABLED=true
      - GF_SMTP_HOST=smtp.qq.com:465
      - GF_SMTP_USER=example@qq.com
      - GF_SMTP_PASSWORD=password
      - GF_SMTP_SKIP_VERIFY=false
      - GF_SMTP_FROM_ADDRESS=example@qq.com
      - GF_SMTP_FROM_NAME=Percona Alerting
    ports:
      - 80:80
      - 443:443

以下是上述每个环境变量的描述:

  • GF_SMTP_ENABLED:是否启用 Grafana 的 SMTP 电子邮件通知。
  • GF_SMTP_HOST:SMTP 服务器的主机地址和端口。
  • GF_SMTP_USER:SMTP 用户名。
  • GF_SMTP_PASSWORD: SMTP 密码
  • GF_SMTP_SKIP_VERIFY:如果为 true,则验证 SMTP 服务器的 SSL。
  • GF_SMTP_FROM_ADDRESS:发送电子邮件时使用的电子邮件地址。
  • GF_SMTP_FROM_NAME:发送电子邮件时使用的名称。

邮件接收人可以在左侧导航 -> Alerting -> Contact points 中使用 grafana-default-email 或新建一个 Email 类型的 contact point

更多的报警配置详见:https://docs.percona.com/percona-monitoring-and-management/get-started/alerting.html#configure-email-smtp-server-settings

8. pmm-server 备份

pmm-server 还可以在页面上使用手动或计划任务的方式将数据库备份到 S3/本地存储,不过可惜的是需要 MySQL Server 和 PMM-Client 直接运行在宿主机上,不能是 Docker 容器中(因为备份使用的是 Xtrabackup,它需要直接读取 MySQL 数据目录,即 /var/lib/mysql)。 详细先决条件见:https://docs.percona.com/percona-monitoring-and-management/get-started/backup/mysql_prerequisites.html