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.