fragen stichworte

MySQL-Fehler: (2003, "Kann keine Verbindung zum MySQL-Server unter '2001: db8: 81: 2c :: 2' (-9) herstellen)"

Ich versuche, Zenoss 4.2.0 unter CentOS 6.3 so einzurichten, dass ein entfernter MySQL 5.5.25a-Server über IPv6 überwacht wird. Die Firewall ist für den Überwachungsserver geöffnet, und ich kann die Verbindung von der Befehlszeile aus 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 das Ereignis "Keine Leistungsdaten vom Plugin", dessen Details sich darüber beklagen, 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 es ist natürlich unmöglich, eine negative Zahl von Google zu verwenden.

enter image description here

Ich habe zMySqlUsername und zMySqlPassword mehr als einmal geprüft und sie haben die korrekten Werte.

Ich habe auch versucht, die IPv6-Adresse mit Klammern einzugeben, aber MySQL mag das überhaupt nicht, entweder innerhalb von Zenoss oder in der Befehlszeile.

Was ist die Ursache dieses Problems?

antworten

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

Basierend auf der Antwort von @ SelivanovPavel Antwort Ich habe das Debuggen von zencommand aufgetaucht und gewartet, und das ZenPack scheiterte.

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 griff ich in das ZenPack und stellte fest, dass es importiert wurde (eine anscheinend alte Version von) pymysql von /opt/zenoss/lib/python.

Beim Testen über die Python-Befehlszeile habe ich festgestellt, von wo aus die Ausnahme ausgelöst wurde:

>>> 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 ich connections.py in dieser allgemeinen Umgebung inspizierte, entdeckte ich zu meinem Entsetzen, dass versucht wurde, einen AF_INET -Sockel zu öffnen, und es gab keinen Code, um einen AF_INET6 -Sockel zu öffnen. Boom, sofort ausfallen.

Auch die aktuelle Version von pymysql scheint diesen Mangel zu enthalten. keine IPv6-Unterstützung.

Also die "Antwort" ist, dass ich pymysql reparieren muss. Nicht, wie ich meinen Nachmittag verbringen wollte.

Dieser böse Hacker bringt alles zum Laufen (obwohl Sie Python 2.6 benötigen). Öffnen Sie /opt/zenoss/lib/python/pymysql/connections.py und suchen Sie in der Zeile 660 nach AF_INET. 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 seit in der Upstream-Version von pymysql behoben und sollte in einer zukünftigen Version verfügbar sein.

Prüfen, gibt es Verbindungsversuche:

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

tshark ist die Konsolenversion des Paketerfassungsprogramms Wireshark.

Wenn der Benutzer des zenoss-Dienstes nicht root ist, versuchen Sie, sich von seiner Shell aus mit mysql zu verbinden:

su zenoss
mysql ...

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

Dieses Dokument kann nützlich sein: Troubleshooting_Zenoss

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