Erreur MySQL: (2003, «Impossible de se connecter au serveur MySQL sur '2001: db8: 81: 2c :: 2' (-9)»)

15

J'essaie de configurer Zenoss 4.2.0 sur CentOS 6.3 pour surveiller un serveur MySQL 5.5.25a distant via IPv6. Le pare-feu est ouvert pour le serveur de surveillance et je peux me connecter correctement à partir de la ligne de commande:

[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, cependant, génère un événement "Pas de données de performance du plugin" dont les détails se plaignent qu'il ne peut pas se connecter au serveur:

MySQL Error: (2003, "Can't connect to MySQL server on '2001:db8:81:2c::2' (-9)")

Pour autant que je sache, -9 n'est même pas un errno valide. Et bien sûr, il est impossible de Google un nombre négatif .

entrez la description de l'image ici

J'ai vérifié zMySqlUsername et zMySqlPassword - plus d'une fois - et ils ont les bonnes valeurs.

J'ai également essayé d'entrer l'adresse IPv6 avec des crochets, mais MySQL n'aime pas du tout cela, que ce soit dans Zenoss ou sur la ligne de commande.

Quelle est la cause de ce problème?

Michael Hampton
la source
Si tout le reste échoue, ne pouvez-vous pas revenir à IPv4?
John Gardeniers
@JohnGardeniers Parfois. Mais la plupart des machines à surveiller n'ont pas d'adresses IPv4 globales, donc un proxy Zenoss serait nécessaire. Entre autres choses, j'essaie de m'éloigner de cela.
Michael Hampton
Ok, je pensais juste que cela pourrait être une option, en particulier avec IPv6 étant si incomplet ou imparfait dans de nombreux produits.
John Gardeniers

Réponses:

11

J'ai finalement abandonné et suis allé déboguer celui-ci moi-même.

Sur la base de la réponse de @ SelivanovPavel, j'ai activé le débogage zencommandet j'ai attendu, et bien sûr, le ZenPack échouait.

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 

J'ai donc creusé dans le ZenPack et découvert qu'il importait (une ancienne version apparemment de) pymysqlde /opt/zenoss/lib/python.

Lors des tests à partir de la ligne de commande python, j'ai découvert d'où l'exception provenait:

>>> 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)")

Et en inspectant connections.pydans ce voisinage général, j'ai découvert avec horreur qu'il tentait d'ouvrir un AF_INETsocket, et il n'y avait aucun code pour ouvrir un AF_INET6socket. Boom, échec instantané.

La version actuelle de pymysqlsemble également contenir cette lacune; aucun support IPv6 que ce soit.

Donc la "réponse" est que je vais devoir corriger pymysql. Pas comme je voulais passer mon après-midi.

Ce petit hackery méchant fait fonctionner les choses (bien que vous ayez besoin de Python 2.6). Ouvrez /opt/zenoss/lib/python/pymysql/connections.pyet recherchez AF_INETautour de la ligne 660. Effectuez ensuite la modification suivante:

                 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'

Cela a depuis été corrigé dans pymysql en amont et devrait être disponible dans une prochaine version.

Michael Hampton
la source
5

Vérifiez s'il y a des tentatives de connexion:

tshark -i br200 -f "host 2001:db8:81:2c::2"

tshark est une version console du programme de capture de paquets Wireshark.

Si l'utilisateur du service zenoss n'est pas root - essayez de vous connecter à mysql depuis son shell:

su zenoss
mysql ...

Qu'en est-il des journaux Zenoss (Paramètres> Démons)? Essayez d'augmenter la verbosité des journaux (définissez logseverity = 30) et voyez ce qui se passe.

Ce document peut être utile: Dépannage_Zenoss

Selivanov Pavel
la source
Vous obtenez la prime parce que vous êtes plus proche que l'autre de la source du problème. Merci. :)
Michael Hampton
3

Essayez de le mettre entre crochets [2001: 470: ...] ou ipv6: []. Un grand nombre d'analyseurs ne peuvent pas faire la différence entre une entrée de texte et une adresse v6.

rnxrx
la source
1
J'y suis allé, j'ai fait ça. MySQL, au moins, veut l'adresse IP sans crochets.
Michael Hampton
2
Ce code d'erreur peut provenir des bibliothèques que Zenoss utilise plutôt que de mysql lui-même. C'est écrit principalement en Python si je me souviens bien, donc c'est peut-être un endroit pour chercher un indice.
rnxrx
1
Si je dois aller fouiller dans le code source, je finirai par répondre à ma propre question. Encore. :)
Michael Hampton
3
N'est-ce pas là la beauté de l'open source? Nous pouvons tous corriger nos propres bugs <kidding>. Hé - une autre pensée, cependant. Que se passe-t-il si vous configurez un nom d'hôte standard qui ne se résout qu'en AAAA et que vous utilisez ensuite ce nom d'hôte au lieu de l'adresse IP brute?
rnxrx