Błąd MySQL: (2003, „Nie można połączyć się z serwerem MySQL na '2001: db8: 81: 2c :: 2' (-9)”)

15

Próbuję skonfigurować Zenoss 4.2.0 na CentOS 6.3, aby monitorować zdalny serwer MySQL 5.5.25a za pośrednictwem IPv6. Zapora jest otwarta dla serwera monitorowania i mogę połączyć się dobrze z linii poleceń:

[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 generuje jednak zdarzenie „Brak danych o wydajności z wtyczki”, którego szczegóły narzekają, że nie może połączyć się z serwerem:

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

O ile mi wiadomo, -9 nie jest nawet prawidłowym błędem. I oczywiście Google nie ma liczby ujemnej .

wprowadź opis zdjęcia tutaj

Sprawdziłem zMySqlUsername i zMySqlPassword - więcej niż raz - i mają poprawne wartości.

Próbowałem również wpisać adres IPv6 w nawiasach, ale MySQL wcale tego nie lubi, ani w Zenossie, ani w wierszu poleceń.

Co jest przyczyną tego problemu?

Michael Hampton
źródło
Jeśli wszystko inne zawiedzie, czy nie możesz wrócić do IPv4?
John Gardeniers,
@JohnGardeniers Czasami. Ale wiele monitorowanych maszyn nie ma globalnych adresów IPv4, więc wymagany byłby serwer proxy Zenoss. Między innymi staram się od tego odejść.
Michael Hampton
Ok, właśnie pomyślałem, że może to być opcja, zwłaszcza że IPv6 jest tak niekompletny lub niedoskonały w wielu produktach.
John Gardeniers,

Odpowiedzi:

11

W końcu poddałem się i sam poszedłem debugować.

Na podstawie @ SelivanovPavel za odpowiedź Odwróciłem się na debugowanie zencommandi czekał, i na pewno wystarczy, ZenPack była wadliwa.

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 

Więc przekopałem się do ZenPacka i dowiedziałem się, że to import (pozornie stara wersja) pymysqlz /opt/zenoss/lib/python.

Podczas testowania z wiersza poleceń Pythona odkryłem, skąd został zgłoszony wyjątek:

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

Podczas inspekcji connections.pyw tym ogólnym otoczeniu z przerażeniem odkryłem, że próbuje otworzyć AF_INETgniazdo, a nigdzie nie ma kodu, aby otworzyć AF_INET6gniazdo. Bum, natychmiastowa porażka.

Obecna wersja pymysqlwydaje się również zawierać ten brak; brak obsługi IPv6 .

Więc „odpowiedź” będę musiała naprawić pymysql. Nie tak chciałem spędzić popołudnie.

Ta odrobina paskudnego włamania działa, ale potrzebujesz Pythona 2.6. Otwórz /opt/zenoss/lib/python/pymysql/connections.pyi wyszukaj AF_INETokoło linii 660. Następnie wprowadź następującą zmianę:

                 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'

Zostało to już naprawione w poprzedniej wersji pymysql i powinno być dostępne w przyszłej wersji.

Michael Hampton
źródło
5

Sprawdź, czy są jakieś próby połączenia:

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

tshark to konsolowa wersja programu do przechwytywania pakietów Wireshark.

Jeśli użytkownik usługi zenoss nie jest rootem - spróbuj połączyć się z mysql z jego powłoki:

su zenoss
mysql ...

Co z dziennikami Zenoss (Ustawienia> Demony)? Spróbuj zwiększyć szczegółowość dzienników (set logseverity = 30) i zobacz, co się stanie.

Ten dokument może być przydatny: Rozwiązywanie problemów_Zenoss

Selivanov Pavel
źródło
Dostajesz nagrodę, ponieważ zbliżyłeś się do źródła problemu od drugiego faceta. Dzięki. :)
Michael Hampton
3

Spróbuj umieścić go w nawiasach [2001: 470: ...] lub ipv6: []. Ogromna liczba parserów nie może odróżnić wpisu tekstowego od adresu v6.

rnxrx
źródło
1
Byłem tam, zrobiłem to. MySQL przynajmniej chce adresu IP bez nawiasów.
Michael Hampton
2
Ten kod błędu może pochodzić z bibliotek używanych przez Zenoss, a nie z samego mysql. Jest napisany głównie w Pythonie, jeśli dobrze pamiętam, więc może to być miejsce na poszukiwanie podpowiedzi.
rnxrx
1
Jeśli będę musiał zagłębić się w kod źródłowy, skończę odpowiadając na własne pytanie. Jeszcze raz. :)
Michael Hampton
3
Czy to jednak nie piękno open source? Wszyscy możemy naprawić własne błędy <kidding>. Hej - jednak inna myśl. Co się stanie, jeśli skonfigurujesz standardową nazwę hosta, która rozwiązuje tylko AAAA, a następnie użyje tej nazwy hosta zamiast surowego adresu IP?
rnxrx