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?


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.


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.