Я пытаюсь настроить Zenoss 4.2.0 на CentOS 6.3 для мониторинга удаленного сервера MySQL 5.5.25a через IPv6. Брандмауэр открыт для сервера мониторинга, и я могу нормально подключиться из командной строки:
[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, однако, генерирует событие «Нет данных о производительности от плагина», детали которого жалуются, что он не может подключиться к серверу:
MySQL Error: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")
Насколько мне известно, -9 даже не является допустимой ошибкой. И конечно невозможно Google отрицательное число.
Я проверял zMySqlUsername и zMySqlPassword - более одного раза - и они имеют правильные значения.
Я также пробовал вводить IPv6-адрес в скобках, но MySQL это совсем не нравится ни в Zenoss, ни в командной строке.
В чем причина этой проблемы?
В конце концов, я сдался и сам пошел отлаживать эту.
По материалам @ SelivanovPavel's ответ Я включил отладку zencommand
и ждал, и конечно же, ZenPack вышел из строя.
2012-08-16 18:16:14,092 INFO zen.zencommand: Datasource MySQL/mysql command: /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py -H 2001:db8:81:2c::2 -p 3306 -u zenoss -w 'password' -g
2012-08-16 18:16:14,100 DEBUG zen.zencommand: Running /opt/zenoss/ZenPacks/ZenPacks.zenoss.MySqlMonitor-2.2.0-py2.7.egg/ZenPacks/zenoss/MySqlMonitor/libexec/check_mysql_stats.py
2012-08-16 18:16:14,544 DEBUG zen.zencommand: Datasource: mysql Received exit code: 1 Output: 'MySQL Error: (2003, "Can\'t connect to MySQL server on \'2001:db8:81:2c::2\' (-9)")\n'
2012-08-16 18:16:14,545 DEBUG zen.zencommand: Process MySQL/mysql stopped (1), 0.43 seconds elapsed
Итак, я покопался в ZenPack и обнаружил, что он импортирует (очевидно, старую версию) pymysql
из /opt/zenoss/lib/python
.
При тестировании из командной строки python я обнаружил, откуда было выброшено исключение:
>>> sys.path.insert(0, "/opt/zenoss/lib/python");
>>> import pymysql
>>> pymysql.install_as_MySQLdb()
>>> import MySQLdb
>>> self.conn = MySQLdb.connect(host="2001:db8:81:2c::2", port=3306, db='', user='zenoss', passwd='password')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/zenoss/lib/python/pymysql/__init__.py", line 93, in Connect
return Connection(*args, **kwargs)
File "/opt/zenoss/lib/python/pymysql/connections.py", line 504, in __init__
self._connect()
File "/opt/zenoss/lib/python/pymysql/connections.py", line 673, in _connect
raise OperationalError(2003, "Can't connect to MySQL server on %r (%s)" % (self.host, e.args[0]))
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")
И при осмотре connections.py
в этом районе я, к своему ужасу, обнаружил, что он пытался открыть AF_INET
сокета, и нигде не было кода, чтобы открыть AF_INET6
разъем. Бум, мгновенный провал.
Текущая версия pymysql
также, кажется, содержит этот недостаток; нет поддержки IPv6 что угодно.
Так что "ответ" мне придется исправить pymysql
. Не то, как я хотел провести свой день.
Этот неприятный хакерский прием заставляет все работать (хотя вам нужен Python 2.6). Открыть /opt/zenoss/lib/python/pymysql/connections.py
и искать AF_INET
вокруг строки 660. Затем сделайте следующее изменение:
if DEBUG: print 'connected using unix_socket'
else:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- t = sock.gettimeout()
- sock.settimeout(self.connect_timeout)
- sock.connect((self.host, self.port))
- sock.settimeout(t)
+ sock = socket.create_connection((self.host, self.port), self.connect_timeout)
self.host_info = "socket %s:%d" % (self.host, self.port)
if DEBUG: print 'connected using socket'
С тех пор это было исправлено в исходном pymysql и должен быть доступен в будущем выпуске.
Проверьте, есть ли попытки подключения:
tshark -i br200 -f "host 2001:db8:81:2c::2"
tshark - это консольная версия программы захвата пакетов Wireshark.
Если пользователь службы zenoss не является пользователем root - попробуйте подключиться к mysql из его оболочки:
su zenoss
mysql ...
Что насчет журналов Zenoss (Настройки> Демоны)? Попробуйте повысить уровень детализации логов (установите logseverity = 30) и посмотрите, что произойдет.
Этот документ может быть полезен: Troubleshooting_Zenoss
Попробуйте заключить его в квадратные скобки [2001: 470: ...] или ipv6: []. Очень многие парсеры не могут отличить текстовую запись от адреса v6.