我正在尝试设置 Munin 来收集装有 postgresql 9.1 和 9.2 的服务器上的统计信息(该服务器当前运行的是 9.1 版本,已经在装有 9.2 版本的新 VM 上进行了测试,以排除正在运行的服务器上的一些奇怪问题。由于列重命名(例如将 procpid 改为 pid),我不得不修补 9.2 版的一些插件,但这没问题)。
Munin 从 EPEL 仓库安装,postgres 从官方仓库安装。两者都是最新版本。
当我尝试运行 munin-node-configure --suggest 时,我得到以下输出:
# The following plugins caused errors:
# postgres_bgwriter:
# Junk printed to stderr
# postgres_cache_:
# Junk printed to stderr
# postgres_checkpoints:
# Junk printed to stderr
# postgres_connections_:
# Junk printed to stderr
# postgres_connections_db:
# Junk printed to stderr
# postgres_locks_:
# Junk printed to stderr
# postgres_querylength_:
# Junk printed to stderr
# postgres_scans_:
# Junk printed to stderr
# postgres_size_:
# Junk printed to stderr
# postgres_transactions_:
# Junk printed to stderr
# postgres_tuples_:
# Junk printed to stderr
# postgres_users:
# Junk printed to stderr
# postgres_xlog:
# Junk printed to stderr
经过大量搜索后,我编辑了 /etc/munin/plugin-conf.d/munin-node 并添加了以下内容:
[postgres*]
user postgres
这可以停止 munin-node-configure 对 stderr 的抱怨,并允许我添加插件,但是当我通过 telnet 连接到 4949 上的服务器并尝试获取统计数据时,我只得到“Bad exit”。当我通过 munin-run 单独运行插件时(例如 munin-run postgres_size_ALL ),它完全正常工作。查看 /var/log/munin/munin-node.log,这是输出:
Error output from postgres_size_ALL:
DBI connect('dbname=template1','',...)failed: could not connect to server: Permission denied
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"? at /usr/share/perl5/vendor_perl/Munin/Plugin/Pgsql.pm line 377
Service 'postgres_size_ALL exited with status 1/0.
我现在没有主意了...套接字肯定存在,并且 pg_hba.conf 设置为允许所有来自本地主机的受信任用户/数据库。
答案1
事实证明 SELinux 阻止了对套接字的访问。
setsebool -P allow_user_postgresql_connect on
答案2
我也遇到过这个问题,但我没有使用 SELinux。在我的系统 (Gentoo Linux) 上,PostgreSQL UNIX 套接字受组权限保护,所有想要访问该套接字的用户都必须属于组postgres
。我的用户munin
已经是成员postgres
(因此从 shell 中一切都运行良好),但事实证明,Munin 是那些不隐式应用用户组的程序之一。在插件配置文件中设置user munin
和group postgres
解决了我的问题。