公司数字化部门为工厂产线采购了某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权限问题,解决方式如下。
-
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 -
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 FROMschema_migrationsORDER 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监控。
-
注册agent
pmm-admin config --server-insecure-tls --server-url=https://admin:admin@10.XX.XX.XX:443 --force -
在postgresql数据库上,创建高权限监控账号
CREATE USER pmm WITH SUPERUSER ENCRYPTED PASSWORD 'XXX'; -
注册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版本兼容问题吧,故将其禁用掉。
-
启动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



近期评论