我正在尝试在 CentOS 6.3 上设置 Zenoss 4.2.0 以通过 IPv6 监控远程 MySQL 5.5.25a 服务器。防火墙为监控服务器打开,我可以从命令行正常连接:
[root@zenoss ~]# mysql -u zenoss -p -h 2001:db8:81:2c::2
...
mysql> SELECT USER(),CURRENT_USER();
+-----------------------------------------+-----------------------------------------+
| USER() | CURRENT_USER() |
+-----------------------------------------+-----------------------------------------+
| zenoss@2001:db8:16:bf:5054:ff:fec0:f7a5 | zenoss@2001:db8:16:bf:5054:ff:fec0:f7a5 |
+-----------------------------------------+-----------------------------------------+
1 row in set (0.09 sec)
然而,Zenoss 生成了一个事件“No performance data from plugin”,其详细信息抱怨它无法连接到服务器:
MySQL Error: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")
据我所知,-9 甚至不是一个有效的错误号。当然,用谷歌搜索负数是不可能的。
我检查了 zMySqlUsername 和 zMySqlPassword - 不止一次 - 它们具有正确的值。
我也试过用括号输入 IPv6 地址,但 MySQL 根本不喜欢这样,无论是在 Zenoss 中还是在命令行中。
这个问题的原因是什么?
最后放弃了,自己去调试这个。
根据@SelivanovPavel 的回答,我打开调试
zencommand
并等待,果然,ZenPack 失败了。所以我深入研究了 ZenPack,发现它正在
pymysql
从/opt/zenoss/lib/python
.在从 python 命令行进行测试时,我发现异常是从哪里抛出的:
在附近进行检查
connections.py
时,我惊恐地发现它正试图打开一个AF_INET
套接字,而且没有任何代码可以打开一个AF_INET6
套接字。轰,瞬间失败。目前的版本
pymysql
似乎也包含这个缺陷;没有任何 IPv6 支持。所以“答案”是我将不得不修复
pymysql
。不是我想如何度过我的下午。这一点讨厌的 hackery 使事情正常(尽管你需要 Python 2.6)。打开
/opt/zenoss/lib/python/pymysql/connections.py
并搜索AF_INET
660 行附近。然后进行以下更改:这已经在上游 pymysql 中得到修复,并且应该在未来的版本中可用。
检查,是否有任何连接尝试:
tshark 是抓包程序 Wireshark 的控制台版本。
如果 zenoss 服务用户不是 root - 尝试从他的 shell 连接到 mysql:
Zenoss 日志(设置 > 守护进程)怎么样?尝试增加日志的详细程度(设置 logseverity = 30),看看会发生什么。
该文档可能有用:Troubleshooting_Zenoss
尝试将其放在方括号 [2001:470:...] 或 ipv6:[] 中。许多解析器无法区分文本条目和 v6 地址。