Errore MySQL: (2003, "Impossibile connettersi al server MySQL su '2001: db8: 81: 2c :: 2' (-9)")


15

Sto cercando di configurare Zenoss 4.2.0 su CentOS 6.3 per monitorare un server MySQL 5.5.25a remoto tramite IPv6. Il firewall è aperto per il server di monitoraggio e posso connettermi bene dalla riga di comando:

[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, tuttavia, genera un evento "Nessun dato sulle prestazioni dal plug-in" i cui dettagli si lamentano che non è possibile connettersi al server:

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

Per quanto ne so, -9 non è nemmeno un errno valido. E ovviamente è impossibile per Google un numero negativo .

inserisci qui la descrizione dell'immagine

Ho controllato zMySqlUsername e zMySqlPassword - più di una volta - e hanno i valori corretti.

Ho anche provato a inserire l'indirizzo IPv6 tra parentesi, ma a MySQL non piace affatto, né all'interno di Zenoss né sulla riga di comando.

Qual è la causa di questo problema?


Se tutto il resto fallisce, non puoi tornare a IPv4?
— John Gardeniers,

@JohnGardeniers A volte. Ma molte delle macchine da monitorare non hanno indirizzi IPv4 globali, quindi sarebbe richiesto un proxy Zenoss. Tra l'altro, sto cercando di allontanarmi da quello.
— Michael Hampton

Ok, ho pensato che potesse essere un'opzione, specialmente con IPv6 così incompleto o imperfetto in molti prodotti.
— John Gardeniers,

Risposte:


11

Alla fine ho rinunciato e sono andato a debug questo da solo.

Sulla base della risposta di @ SelivanovPavel, ho attivato il debug zencommande ho aspettato, e abbastanza sicuro, lo ZenPack stava fallendo.

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 

Così ho scavato nello ZenPack e ho scoperto che stava importando (una versione apparentemente vecchia di) pymysqlda /opt/zenoss/lib/python.

Durante i test dalla riga di comando di Python ho scoperto da dove veniva generata l'eccezione:

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

E ispezionando connections.pyin quella zona generale ho scoperto con mio orrore che stava tentando di aprire un AF_INETsocket e non c'era nessun codice per aprire un AF_INET6socket. Boom, fallimento immediato.

Anche l'attuale versione di pymysqlsembra contenere questa carenza; nessun supporto IPv6 .

Quindi la "risposta" è che dovrò risolvere pymysql. Non come volevo passare il mio pomeriggio.

Questo brutto hacker fa funzionare le cose (anche se hai bisogno di Python 2.6). Apri /opt/zenoss/lib/python/pymysql/connections.pye cerca AF_INETintorno alla linea 660. Quindi apporta la seguente modifica:

                 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'

Questo è stato risolto da pymysql a monte e dovrebbe essere disponibile in una versione futura.


5

Controlla, ci sono tentativi di connessione:

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

tshark è la versione console del programma di acquisizione pacchetti Wireshark.

Se l'utente del servizio zenoss non è root - prova a connetterti a mysql dalla sua shell:

su zenoss
mysql ...

Che dire dei registri Zenoss (Impostazioni> Demoni)? Prova ad aumentare la verbosità dei log (imposta logseverity = 30) e guarda cosa succede.

Questo documento può essere utile: Troubleshooting_Zenoss


Ottieni la generosità perché ti sei avvicinato più dell'altro alla fonte del problema. Grazie. :)
— Michael Hampton

3

Prova a metterlo tra parentesi [2001: 470: ...] o ipv6: []. Molti parser non sono in grado di distinguere tra una voce di testo e un indirizzo v6.


1
Ci sono stato, l'ho fatto. MySQL, almeno, vuole l'indirizzo IP senza parentesi.
— Michael Hampton

2
Tale codice di errore potrebbe provenire dalle librerie utilizzate da Zenoss anziché dallo stesso mysql. È scritto principalmente in Python se ricordo bene, quindi potrebbe essere un posto dove cercare un suggerimento.
— rnxrx,

1
Se devo scavare nel codice sorgente, finirò per rispondere alla mia domanda. Ancora. :)
— Michael Hampton

3
Ma quella non è la bellezza dell'open source? Tutti possiamo correggere i nostri bug <kidding>. Ehi - un altro pensiero, però. Che cosa succede se si imposta un nome host standard che si è risolto solo in un AAAA e quindi ha usato quel nome host anziché l'IP grezzo?
— rnxrx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.