postgresql监控pmm之部署问题解决

公司数字化部门为工厂产线采购了某MES生产系统,由公司IT提供硬件和基础操作系统,MES供应商负责系统建设和后续维护,但使用一段时间发现,无论是该MES系统自身的性能、还是供应商的运维能力,都有严重问题,导致公司的IT和运维一直在为其解决问题。
一个运行在K8S里中MES系统,从网络底层到服务上层完全没有监控,出问题全靠产线的工人喊。为解决此问题,决定该MES系统完善监控报警,这次加的postgresql的监控。

该MES系统后端采用的是postgresql数据库,一主一备,备库只用来备份数据,完全不参与业务。

打开postgresql自身的pg_stat_statements拓展

近期出现过一次postgresql机器被打满,导致部署在该机器上的haproxy网关受影响(服务部署架构不合理,这里不展开了)。postgresql被打满的原因,明显是慢sql导致,供应商的运维完全没头绪。
登上数据库服务器去帮他们定位下原因,发现其postgresql即没有记录慢sql机制,也没有打开自身的性能记录拓展。打开方式如下:
修改postgresql配置文件postgresql.conf
log_min_duration_statement参数为1000(毫秒),会将执行时间超过1秒的sql记录到文件中;
②打开pg_stat_statements拓展

    shared_preload_libraries = 'pg_stat_statements' # (change requires restart)
    pg_stat_statements.max = 10000
    pg_stat_statements.track = all

上面的调整需要重启postgresql生效;

拓展生效

重启数据库后,登录到数据库中执行CREATE EXTENSION pg_stat_statements;,postgresql会将sql的执行情况记录到这个表中,方便问题定位。可以select * from pg_stat_statements limit 10看看记录的内容。

安装PMM-Server

pmm是免费开源的一款postgresql监控工具,其集成了很多流行的开源组件,如Prometheus、grafana、qan-api等,开箱即用。 可以从其官网找到一键安装的命令,不过我在安装过程中遇到qan-api2进程异常退出问题,应该是docker权限问题,解决方式如下。

  1. docker logs docker_id看到qan-api2进程不断异常退出

    2025-08-11 07:17:50,925 INFO spawned: 'qan-api2' with pid 87 2025-08-11 07:17:51,130 INFO exited: qan-api2 (exit status 1; not expected) 2025-08-11 07:17:53,137 INFO spawned: 'qan-api2' with
  2. docker exec -it docker_id bash,去看具体的日志,具体日志在容器中/srv/logs/qan-api2.log文件中,看到是docker进程没有访问某路径的权限。

    stdlog: Migrations: code: 74, message: Cannot read from file 119, errno: 1, strerror: Operation not permitted: while reading column version at /srv/clickhouse/store/246/2460fff4-a704-472f-9f4b-0e9de16b8a5d/: While executing Log in line 0: SELECT version, dirty FROM schema_migrations ORDER BY sequence DESC LIMIT 1 stdlog: qan-api2 v3.3.1.  

按理说是使用pmm-server脚本一键安装,不应该出现此类问题,可能是对linux系统兼容不好吧,从其github主页上也看到有人提过次问题,在执行docker run时要使用--privileged参数,如下在其安装脚本的494行。

    486   if ! run_docker "volume inspect $volume_name 1> /dev/null 2> /dev/null"; then
    487     if ! run_docker "volume create $volume_name 1> /dev/null"; then
    488       die "${RED}ERROR: cannot create PMM Data Volume${NOFORMAT}"
    489     fi
    490     msg "Created PMM Data Volume: $volume_name"
    491   fi
    492   msg "Starting PMM Server..."
    493
    494   run_pmm="run --privileged -d -p $port:8443 --volume $volume_name:/srv --name $container_name --network $network_name $docker_env_flags --restart always $repo:$tag"
    495
    496   run_docker "$run_pmm 1> /dev/null"
    497   msg "Created PMM Server: $container_name"
    498   msg "\nUse the following command if you ever need to update your container manually:"
    499   msg "\tdocker pull $repo:$tag \n"
    500   msg "\tdocker $run_pmm \n"
    501 }

修改之后,再执行就正常了。

安装pmm-agent

同样使用官方提供的命令即可,需要先启动service,然后注册postgresql监控。

  1. 注册agent

    pmm-admin config --server-insecure-tls --server-url=https://admin:admin@10.XX.XX.XX:443 --force
  2. 在postgresql数据库上,创建高权限监控账号

    CREATE USER pmm WITH SUPERUSER ENCRYPTED PASSWORD 'XXX';
  3. 注册postgresql监控

    pmm-admin add postgresql \
    --username=pmm \
    --password=XXX \
    --host=127.0.0.1 \
    --port=5432 \
    --query-source=pgstatements \
    --disable-collectors=walreceiver \
    --service-name=XXX

    之所以要禁用walreceiver,是在实际启动后,发现pmm-agent在查询监控时老是在查一个不存在的字段,导致数据库频繁报错,可能是agent版本兼容问题吧,故将其禁用掉。

  4. 启动agent即可,启动之后如下:

    root@XXX:/var/log/postgresql# pmm-admin list
    Service type        Service name             Address and port        Service ID
    PostgreSQL          jintan-postgresql        127.0.0.1:5432          ba5c020f-8bfb-4c9e-b865-1b393264a32d
    
    Agent type                           Status           Metrics Mode        Agent ID                                    Service ID                                  Port
    pmm_agent                            Connected                            959ce03f-286d-48da-bb69-d4ec95d040a8                                                    0
    node_exporter                        Running          push                34a0ba12-09c7-4965-9102-e7ec0f461859                                                    42000
    postgres_exporter                    Running          push                8eec7ec6-b84d-4b67-a6ce-52a9abca98b1        ba5c020f-8bfb-4c9e-b865-1b393264a32d        42002
    postgresql_pgstatements_agent        Running                              b8d81b08-0ae7-49fa-bfa8-b25b630a2f1e        ba5c020f-8bfb-4c9e-b865-1b393264a32d        0
    vmagent                              Running          push                4717b18c-4239-4372-a21e-0b59c7239387                                                    42001

最终监控效果

版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=1700