我有一台Dockerized Zabbix服务器(3.4)连接到具有Mariadb的CentOS 7主机。
这个很好用:
# zabbix_get -s <ipOfRemoteHost> -p 10050 -k mysql.version
mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1
这个没有:
# zabbix_get -s <ipOfRemoteHost> -p 10050 -k mysql.ping
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!
来自/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
:
UserParameter=mysql.version,mysql -V
UserParameter=mysql.ping,HOME=/etc/zabbix mysqladmin ping | grep -c alive
当我将host=localhost
更改为host=127.0.0.1
时,它会读取HOME目录中的.my.cnf:
# zabbix_get -s <ipOfRemoteHost> -p 10050 -k mysql.ping
mysqladmin: connect to server at '127.0.0.1' failed
error: 'Can't connect to MySQL server on '127.0.0.1' (13)'
Check that mysqld is running on 127.0.0.1 and that the port is 3306.
You can check this by doing 'telnet 127.0.0.1 3306'
还尝试直接在命令中添加用户名和密码,但结果相同:
UserParameter=mysql.ping,mysqladmin -uroot --password="mypassword" ping | grep -c alive
在主机上运行该命令可以正常工作:
mysqladmin -uroot --password="mypassword" ping | grep -c alive
1
代理本身似乎运行良好:
$ sudo -u zabbix zabbix_agentd -t mysql.ping
mysql.ping [t|1]
套接字可用:
# ls -l /var/lib/mysql/mysql.sock
srwxrwxrwx. 1 mysql mysql 0 Nov 5 18:01 /var/lib/mysql/mysql.sock
流程详情:
# ps -ef | grep mysqld
mysql 3218 1 0 18:01 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 3488 3218 99 18:01 ? 06:08:26 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
systemd+ 6547 6530 0 Oct31 ? 00:06:15 mysqld --character-set-server=utf8 --collation-server=utf8_bin
有什么建议吗?
注意:不要认为它是相关的,但为了以防万一,在主机上我还有一个在端口3307上运行的Dockerized mysql
答案 0 :(得分:0)
localhost
/ 127.0.0.1
与主机上的localhost
/ 127.0.0.1
不同。在.my.cnf
中使用适当的IP或在主机网络命名空间(docker run --net host ...
)中运行容器。
如果要从容器中使用套接字进行MySQL连接,则需要使用Docker卷。您可能遇到套接字权限,套接字所有者等问题...我建议使用IP连接方法。
答案 1 :(得分:0)
原因是selinux。 selinux禁止Zabbix代理访问mysql套接字文件以及可能的其他资源。
尝试tail -f /var/log/audit/audit.log
时运行zabbix_get
,您会实时看到拒绝。
然后,您需要设计一个selinux策略,以便根据需要进行访问。