MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB Ruby Driver 2.5.x Vấn đề phân biệt chữ hoa chữ thường với tên máy chủ trên bộ bản sao

Bạn gặp sự cố khi kết nối với bộ bản sao MongoDB sau khi nâng cấp trình điều khiển MongoDB Ruby lên 2.5.x? Gần đây, chúng tôi đã nhận được một số câu hỏi về vấn đề này với phiên bản trình điều khiển MongoDB Ruby mới nhất và đã viết bài đăng này để chia sẻ những phát hiện của chúng tôi về vấn đề và nguyên nhân.

Thông báo lỗi gặp phải khi cố gắng kết nối là -

No server is available matching preference: #<Mongo::ServerSelector::Primary:...>

Sự cố đã được báo cáo cho MongoDB và đang được theo dõi tại đây. Chúng tôi đã dành một chút thời gian để điều tra vấn đề này và nguyên nhân gốc rễ được giới thiệu trong mã trình điều khiển trong 2.5.x.

MongoDB Ruby Driver 2.5.x Tóm tắt sự cố

Sự cố tồn tại trong (các) phiên bản 2.5.x của trình điều khiển MongoDB Ruby và gặp phải khi tên máy chủ bao gồm tập hợp bản sao chứa các ký tự phân biệt chữ hoa chữ thường, ví dụ: ABC-server1.example.com . Các giải pháp thay thế có thể xảy ra là:

  1. Hạ cấp xuống 2.4.x hoặc nâng cấp lên 2.6.x khi có sẵn.
  2. Thay đổi tên máy chủ của tất cả các thành viên của bộ bản sao thành chữ thường. Ví dụ:thay đổi tên máy chủ trong ví dụ trên thành abc-server1.example.com.

Chi tiết về vấn đề

Việc kích hoạt ghi nhật ký chi tiết trên Ruby đã cung cấp manh mối về những gì đang xảy ra:

...
#19140] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'unknown'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.
#19140] DEBUG -- : MONGODB | There was a change in the members of the 'replica set' topology.
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/server_selector/selectable.rb:119:in `select_server': No server is available matching preference: # using server_selection_timeout=30 and local_threshold=0.015 (Mongo::Error::NoServerAvailable)
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/database.rb:157:in `command'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:404:in `list_databases'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:385:in `database_names'
...

Rõ ràng là trình điều khiển đã không thể phát hiện chính xác vai trò của phần tử chính của bộ bản sao. Khi so sánh với các nhật ký từ 2.4.x, rõ ràng là điều này đã từng xảy ra chính xác trên phiên bản đó, tức là phiên bản chính được xác định chính xác là phiên bản chính.

] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'primary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.

Manh mối khác mà chúng tôi có là tên máy chủ của chúng tôi đã được thay đổi một chút trong nhật ký. Thay vì tên thực SG -connectiontest1-2.servers.example.com , nó đang được ghi là sg -connectiontest1-2.servers.example.com .

Khi kiểm tra mã về cách các tên máy chủ được phân tích cú pháp trong quá trình khởi tạo kết nối và các vai trò được gán cho chúng, chúng tôi có thể xác định rằng mã trình điều khiển là cách viết hoa (tức là chuyển đổi ABC. example.com thành abc.example.com) trong khi phân tích cú pháp chuỗi kết nối. Tiếp theo, trình điều khiển kết nối với cấu trúc chính để khám phá cấu trúc liên kết bằng cách sử dụng lệnh isMaster. Trong khi phân tích kết quả của lệnh này, trình điều khiển sẽ xác định vai trò của mỗi nút.

MongoDB Ruby Driver 2.5.x Các vấn đề về phân biệt chữ hoa chữ thường với tên máy chủ trên bộ bản sao Nhấp để Tweet

Tuy nhiên, trong khi so sánh tên máy chủ được trả về từ lệnh với tên máy chủ trong chuỗi kết nối, trình điều khiển đã bỏ qua để thực hiện đối sánh không phân biệt chữ hoa chữ thường. Điều này dẫn đến sự không khớp về tên của tệp chính như được MongoDB báo cáo với những gì trình điều khiển đã xác định từ chuỗi kết nối. Điều này khiến vai trò của thiết bị chính trở nên không xác định và dẫn đến sự cố kết nối. Kiểm tra đối sánh địa chỉ trong mã phát hiện vai trò đã được thêm vào 2.5.x.

Bản sửa lỗi cho sự cố đã được nhắm mục tiêu đến phiên bản 2.6.0 của trình điều khiển.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tìm bằng cách sử dụng _id không hoạt động với tổng hợp

  2. Phần tử mảng cập nhật Mongo (trình điều khiển .NET 2.0)

  3. Nhóm Mongodb và sắp xếp

  4. Mongodb:Truy vấn một đối tượng json được lồng trong một mảng

  5. Nhóm MongoDB và tính tổng với id làm khóa