Kesalahan MySQL: (2003, "Tidak dapat terhubung ke server MySQL pada '2001: db8: 81: 2c :: 2' (-9)")

15

Saya mencoba mengatur Zenoss 4.2.0 pada CentOS 6.3 untuk memonitor server MySQL 5.5.25a jarak jauh melalui IPv6. Firewall terbuka untuk server pemantauan dan saya dapat terhubung dengan baik dari baris perintah:

[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, bagaimanapun, menghasilkan acara "Tidak ada data kinerja dari plugin" yang detailnya mengeluh bahwa itu tidak dapat terhubung ke server:

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

Sejauh yang saya tahu, -9 bahkan bukan errno yang valid. Dan tentu saja tidak mungkin bagi Google angka negatif .

masukkan deskripsi gambar di sini

Saya telah memeriksa zMySqlUsername dan zMySqlPassword - lebih dari sekali - dan mereka memiliki nilai yang benar.

Saya juga mencoba memasukkan alamat IPv6 dengan tanda kurung, tetapi MySQL tidak suka sama sekali, baik di dalam Zenoss atau di baris perintah.

Apa penyebab masalah ini?

Michael Hampton
sumber
Jika semuanya gagal, tidak bisakah Anda kembali ke IPv4?
John Gardeniers
@JohnGardeniers Terkadang. Tetapi banyak dari mesin yang akan dipantau tidak memiliki alamat IPv4 global, sehingga proxy Zenoss akan diperlukan. Di antara hal-hal lain, saya berusaha menjauh dari itu.
Michael Hampton
Ok, saya hanya berpikir itu mungkin menjadi pilihan, terutama dengan IPv6 yang begitu tidak lengkap atau tidak sempurna dalam banyak produk.
John Gardeniers

Jawaban:

11

Saya akhirnya menyerah dan pergi untuk men-debug yang ini sendiri.

Berdasarkan jawaban @ SelivanovPavel, saya mengaktifkan debug zencommanddan menunggu, dan tentu saja, ZenPack gagal.

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 

Jadi saya menggali ZenPack dan menemukan itu mengimpor (versi yang tampaknya lama) pymysqldari /opt/zenoss/lib/python.

Pada pengujian dari baris perintah python saya menemukan di mana pengecualian dilemparkan dari:

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

Dan saat menginspeksi connections.pydi sekitar tempat umum itu, saya merasa ngeri ketika mencoba membuka AF_INETsoket, dan tidak ada kode di mana pun untuk membuka AF_INET6soket. Boom, gagal instan.

Versi saat ini pymysqljuga tampaknya mengandung kekurangan ini; tidak ada dukungan IPv6 apa pun.

Jadi "jawabannya" adalah saya harus memperbaikinya pymysql. Tidak bagaimana saya ingin menghabiskan sore saya.

Sedikit peretasan jahat ini berfungsi dengan baik (meskipun Anda membutuhkan Python 2.6). Buka /opt/zenoss/lib/python/pymysql/connections.pydan cari di AF_INETsekitar baris 660. Kemudian buat perubahan berikut:

                 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'

Sejak saat ini telah diperbaiki di pymysql hulu dan harus tersedia dalam rilis mendatang.

Michael Hampton
sumber
5

Periksa, apakah ada upaya koneksi:

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

tshark adalah versi konsol dari program penangkapan paket Wireshark.

Jika pengguna layanan zenoss bukan root - coba sambungkan ke mysql dari shell-nya:

su zenoss
mysql ...

Bagaimana dengan log Zenoss (Pengaturan> Daemon)? Cobalah untuk meningkatkan verbositas log (atur logseverity = 30) dan lihat apa yang terjadi.

Doc ini mungkin berguna: Troubleshooting_Zenoss

Selivanov Pavel
sumber
Anda mendapatkan hadiah karena Anda datang lebih dekat daripada orang lain ke sumber masalahnya. Terima kasih. :)
Michael Hampton
3

Coba letakkan di kurung [2001: 470: ...] atau ipv6: []. Banyak parser yang tidak dapat membedakan antara entri teks dan alamat v6.

rnxrx
sumber
1
Pernah ke sana, melakukan itu. MySQL, setidaknya, menginginkan alamat IP tanpa tanda kurung.
Michael Hampton
2
Kode kesalahan itu mungkin berasal dari perpustakaan yang Zenoss gunakan daripada dari mysql itu sendiri. Ini sebagian besar ditulis dalam Python jika saya mengingat dengan benar, sehingga mungkin menjadi tempat untuk mencari petunjuk.
rnxrx
1
Jika saya harus menggali kode sumber, saya akhirnya akan menjawab pertanyaan saya sendiri. Lagi. :)
Michael Hampton
3
Bukankah itu keindahan open source? Kita semua dapat memperbaiki bug kita sendiri <kidding>. Hei - pemikiran lain. Bagaimana jika Anda mengatur nama host standar yang hanya diselesaikan ke AAAA dan kemudian menggunakan nama host itu alih-alih IP mentah?
rnxrx