MySQL-Fehler: (2003, "Verbindung zum MySQL-Server unter '2001: db8: 81: 2c :: 2' (-9) nicht möglich")

15

Ich versuche Zenoss 4.2.0 unter CentOS 6.3 einzurichten, um einen entfernten MySQL 5.5.25a-Server über IPv6 zu überwachen. Die Firewall ist für den Überwachungsserver geöffnet und ich kann über die Befehlszeile eine Verbindung herstellen:

[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 generiert jedoch ein Ereignis "Keine Leistungsdaten vom Plugin", dessen Details darüber klagen, dass keine Verbindung zum Server hergestellt werden kann:

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

Soweit ich weiß, ist -9 nicht einmal eine gültige Fehlernummer. Und natürlich ist es unmöglich, eine negative Zahl zu googeln .

Bildbeschreibung hier eingeben

Ich habe zMySqlUsername und zMySqlPassword mehrmals überprüft und sie haben die richtigen Werte.

Ich habe auch versucht, die IPv6-Adresse in Klammern einzugeben, aber das gefällt MySQL überhaupt nicht, weder in Zenoss noch in der Befehlszeile.

Was ist die Ursache für dieses Problem?

Michael Hampton
quelle
Wenn alles andere fehlschlägt, können Sie nicht auf IPv4 zurückgreifen?
John Gardeniers
@ JohnGardeniers Manchmal. Viele der zu überwachenden Maschinen haben jedoch keine globalen IPv4-Adressen, sodass ein Zenoss-Proxy erforderlich wäre. Unter anderem versuche ich, mich davon zu entfernen.
Michael Hampton
Ok, ich dachte nur, dass es eine Option sein könnte, besonders wenn IPv6 in vielen Produkten so unvollständig oder unvollkommen ist.
John Gardeniers

Antworten:

11

Ich gab es schließlich auf und ging selbst zum Debuggen.

Aufgrund der Antwort von @ SelivanovPavel zencommandtauchte ich beim Debuggen auf und wartete, und das ZenPack schlug mit Sicherheit fehl.

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 

Also habe ich mich in das ZenPack vertieft und herausgefunden, dass es sich um einen Import (eine anscheinend alte Version) pymysqlvon handelt /opt/zenoss/lib/python.

Beim Testen über die Python-Befehlszeile habe ich festgestellt, woher die Ausnahme stammt:

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

Und als connections.pyich in dieser allgemeinen Umgebung nachschaute, stellte ich zu meinem Entsetzen fest, dass versucht wurde, eine AF_INETSteckdose zu öffnen , und dass es nirgendwo einen Code gab, um eine AF_INET6Steckdose zu öffnen . Boom, sofort scheitern.

Die aktuelle Version von pymysqlscheint diesen Mangel ebenfalls zu enthalten; Keine IPv6-Unterstützung .

Die "Antwort" ist also, dass ich sie reparieren muss pymysql. Nicht, wie ich meinen Nachmittag verbringen wollte.

Dieses böse Hackery bringt Dinge zum Laufen (obwohl Sie Python 2.6 brauchen). Öffnen /opt/zenoss/lib/python/pymysql/connections.pyund suchen Sie nachAF_INET Zeile 660. Nehmen Sie dann die folgende Änderung vor:

                 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'

Dies wurde seitdem in pymysql behoben und sollte in einer zukünftigen Version verfügbar sein.

Michael Hampton
quelle
5

Überprüfen Sie, ob Verbindungsversuche vorliegen:

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

tshark ist die Konsolenversion des Paketerfassungsprogramms Wireshark.

Wenn der Benutzer des Zenoss-Dienstes kein Root-Benutzer ist, versuchen Sie, über seine Shell eine Verbindung zu MySQL herzustellen:

su zenoss
mysql ...

Was ist mit Zenoss-Protokollen (Einstellungen> Daemons)? Versuchen Sie, die Ausführlichkeit der Protokolle zu erhöhen (setzen Sie logseverity = 30) und sehen Sie, was passiert.

Dieses Dokument kann nützlich sein: Troubleshooting_Zenoss

Selivanov Pavel
quelle
Sie bekommen das Kopfgeld, weil Sie der Ursache des Problems näher gekommen sind als der andere. Vielen Dank. :)
Michael Hampton
3

Setzen Sie es in Klammern [2001: 470: ...] oder ipv6: []. Sehr viele Parser können nicht zwischen einer Texteingabe und einer v6-Adresse unterscheiden.

rnxrx
quelle
1
Kenne ich schon. Zumindest MySQL möchte die IP-Adresse ohne Klammern.
Michael Hampton
2
Dieser Fehlercode stammt möglicherweise aus den Bibliotheken, die Zenoss verwendet, und nicht aus MySQL. Es ist hauptsächlich in Python geschrieben, wenn ich mich richtig erinnere, so dass es ein Ort sein kann, um nach einem Hinweis zu suchen.
RNXRX
1
Wenn ich mich in den Quellcode vertiefen muss, werde ich am Ende meine eigene Frage beantworten. Nochmal. :)
Michael Hampton
3
Ist das nicht die Schönheit von Open Source? Wir können alle unsere eigenen Fehler beheben. Hey - aber ein anderer Gedanke. Was ist, wenn Sie einen Standard-Hostnamen eingerichtet haben, der nur in einen AAAA aufgelöst wurde und dann diesen Hostnamen anstelle der unformatierten IP-Adresse verwendet hat?
RNXRX