【问题标题】:zabbix server connecting to mariadb host: can't connect to local MySQL server through socketzabbix server连接mariadb主机:无法通过socket连接到本地MySQL服务器
【发布时间】:2017-11-05 22:31:06
【问题描述】:

我有一个 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

有什么建议吗?

注意:不要认为它是相关的,但以防万一,在主机上我还有一个 Dockerized mysql 在端口 3307 上运行

【问题讨论】:

    标签: mariadb zabbix


    【解决方案1】:

    容器中的localhost/127.0.0.1与主机上的localhost/127.0.0.1不一样,因为cgroup网络命名空间。在 .my.cnf 中使用正确的 IP 或在主机网络命名空间 (docker run --net host ...) 中运行容器。

    如果您想从容器中使用套接字进行 MySQL 连接,那么您将需要使用 Docker 卷。您可能在套接字权限、套接字所有者方面有问题……我推荐 IP 连接方式。

    【讨论】:

    • 不确定我是否理解 Jan. MariaDB 主机是一个远程系统,为 zabbix 代理打开了端口 10050。我的理解是调用zabbix代理,然后在本地运行数据采集命令。
    • 我记得容器化应用程序必须使用外部 IP,尽管在同一主机上运行时。
    • @Daein:你有详细信息吗?我该把外部 IP 放在哪里?
    • 这是 -p 选项。此选项启用从主机或主机 ip 到 docker 内部端口的端口转发。例如; docker run -p hostip:port:containerport ...snip...
    • @Daein:我不明白。它们不在同一台主机上运行。 Zabbix 服务器是 Dockerized 的,其余的不是。代理在常规 CentOS 服务器上运行,并安装常规 MariaDB。代理收集所有信息都很好,除了 mysql 数据。
    【解决方案2】:

    原因是selinux。 selinux 正在禁止 Zabbix 代理访问 mysql 套接字文件和可能的其他资源。

    在您尝试zabbix_get 的同时运行tail -f /var/log/audit/audit.log,您将实时看到拒绝信息。

    然后你需要设计一个 selinux 策略,根据需要启用访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多