Lỗi MySQL: (2003, không thể kết nối với máy chủ MySQL vào '2001: db8: 81: 2c :: 2' (-9)


15

Tôi đang cố gắng thiết lập Zenoss 4.2.0 trên CentOS 6.3 để theo dõi máy chủ MySQL 5.5.25a từ xa thông qua IPv6. Tường lửa được mở cho máy chủ giám sát và tôi có thể kết nối tốt từ dòng lệnh:

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

Tuy nhiên, Zenoss tạo ra một sự kiện "Không có dữ liệu hiệu suất từ ​​plugin" có chi tiết phàn nàn rằng nó không thể kết nối với máy chủ:

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

Theo như tôi biết, -9 thậm chí không phải là một lỗi hợp lệ. Và tất nhiên, Google không thể đánh số âm .

nhập mô tả hình ảnh ở đây

Tôi đã kiểm tra zMySqlUsername và zMySqlPassword - hơn một lần - và chúng có các giá trị chính xác.

Tôi cũng đã thử nhập địa chỉ IPv6 bằng dấu ngoặc, nhưng MySQL hoàn toàn không giống như vậy, trong Zenoss hoặc trên dòng lệnh.

Nguyên nhân của vấn đề này là gì?


Nếu vẫn thất bại, bạn có thể quay lại IPv4 không?
John Gardeniers

@JohnGardeniers Đôi khi. Nhưng nhiều máy được giám sát không có địa chỉ IPv4 toàn cầu, do đó, cần có proxy Zenoss. Trong số những thứ khác, tôi đang cố gắng tránh xa điều đó.
Michael Hampton

Ok, tôi chỉ nghĩ rằng nó có thể là một lựa chọn, đặc biệt là với IPv6 không hoàn chỉnh hoặc không hoàn hảo trong nhiều sản phẩm.
John Gardeniers

Câu trả lời:


11

Cuối cùng tôi đã từ bỏ và tự mình đi gỡ lỗi này.

Dựa trên câu trả lời của @ SelivanovPavel, tôi bật lên gỡ lỗi zencommandvà chờ đợi, và chắc chắn, ZenPack đã thất bại.

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 

Vì vậy, tôi đã tìm hiểu ZenPack và phát hiện ra nó đang nhập (một phiên bản rõ ràng cũ) pymysqltừ /opt/zenoss/lib/python.

Khi kiểm tra từ dòng lệnh python, tôi phát hiện ra ngoại lệ được ném từ đâu:

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

Và khi kiểm tra khu connections.pyvực chung đó, tôi phát hiện ra nỗi kinh hoàng của mình rằng nó đang cố mở một AF_INETổ cắm, và không có mã nào để mở AF_INET6ổ cắm. Bùng nổ, thất bại ngay lập tức.

Phiên bản hiện tại pymysqldường như cũng chứa thiếu sót này; không hỗ trợ IPv6 gì.

Vì vậy, "câu trả lời" là tôi sẽ phải sửa pymysql. Không phải làm thế nào tôi muốn dành buổi chiều của tôi.

Một chút tin tặc khó chịu này sẽ khiến mọi thứ hoạt động (mặc dù bạn cần Python 2.6). Mở ra /opt/zenoss/lib/python/pymysql/connections.pyvà tìm kiếm AF_INETxung quanh dòng 660. Sau đó thực hiện thay đổi sau:

                 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'

Điều này đã được cố định trong pymysql ngược dòng và sẽ có sẵn trong một bản phát hành trong tương lai.


5

Kiểm tra, có bất kỳ nỗ lực kết nối:

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

tshark là phiên bản console của chương trình bắt gói tin Wireshark.

Nếu người dùng dịch vụ zenoss không root - hãy thử kết nối với mysql từ shell của anh ấy:

su zenoss
mysql ...

Còn nhật ký Zenoss (Cài đặt> Daemon) thì sao? Hãy thử tăng mức độ chi tiết của nhật ký (đặt logseverity = 30) và xem điều gì sẽ xảy ra.

Tài liệu này có thể hữu ích: Trouble_Zenoss


Bạn nhận được tiền thưởng vì bạn đã đến gần hơn so với người khác đến nguồn gốc của vấn đề. Cảm ơn. :)
Michael Hampton

3

Hãy thử đặt nó trong ngoặc [2001: 470: ...] hoặc ipv6: []. Rất nhiều trình phân tích cú pháp không thể phân biệt giữa mục nhập văn bản và địa chỉ v6.


1
Đã từng trải qua rồi. MySQL, ít nhất, muốn địa chỉ IP không có dấu ngoặc.
Michael Hampton

2
Mã lỗi đó có thể là từ các thư viện mà Zenoss đang sử dụng chứ không phải từ chính mysql. Nó được viết chủ yếu bằng Python nếu tôi nhớ chính xác, vì vậy đó có thể là nơi để tìm gợi ý.
rnxrx

1
Nếu tôi phải đi sâu vào mã nguồn, tôi sẽ tự trả lời câu hỏi của mình. Lần nữa. :)
Michael Hampton

3
Không phải đó là vẻ đẹp của nguồn mở sao? Tất cả chúng ta đều có thể sửa các lỗi của mình <đùa thôi>. Hey - một suy nghĩ khác, mặc dù. Điều gì xảy ra nếu bạn thiết lập tên máy chủ chuẩn chỉ phân giải thành AAAA và sau đó sử dụng tên máy chủ đó thay vì IP thô?
rnxrx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.