Mengalami masalah saat menyambungkan ke kumpulan replika MongoDB setelah memutakhirkan driver MongoDB Ruby ke 2.5.x? Kami baru-baru ini menerima beberapa pertanyaan tentang masalah ini dengan versi driver MongoDB Ruby terbaru dan menulis postingan ini untuk membagikan temuan kami tentang masalah dan penyebabnya.
Pesan kesalahan yang ditemukan pada upaya koneksi adalah -
No server is available matching preference: #<Mongo::ServerSelector::Primary:...>
Masalah ini telah dilaporkan ke MongoDB dan sedang dilacak di sini. Kami menghabiskan beberapa waktu untuk menyelidiki masalah ini dan akar penyebab yang diperkenalkan dalam kode driver di 2.5.x.
Ringkasan Masalah Driver MongoDB Ruby 2.5.x
Masalah ada di versi 2.5.x dari driver MongoDB Ruby dan ditemui saat nama host yang terdiri dari kumpulan replika berisi karakter peka huruf besar-kecil, misalnya, ABC-server1.example.com . Solusi yang mungkin adalah:
- Turunkan versi ke 2.4.x atau tingkatkan versi 2.6.x setelah tersedia.
- Ubah nama host semua anggota kumpulan replika menjadi huruf kecil. Misalnya, ubah nama host pada contoh di atas menjadi abc-server1.example.com.
Rincian Masalah
Mengaktifkan logging terperinci di Ruby memberikan petunjuk tentang apa yang terjadi:
... #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' ...
Tampaknya jelas bahwa driver tidak dapat mendeteksi peran utama dari kumpulan replika dengan benar. Saat membandingkan dengan log dari 2.4.x, jelas bahwa ini terjadi dengan benar pada versi tersebut, yaitu, yang utama diidentifikasi dengan benar sebagai yang utama.
] 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'.
Petunjuk lain yang kami miliki adalah bahwa nama server kami sedikit diubah di log. Alih-alih nama sebenarnya SG -connectiontest1-2.servers.example.com , itu dicatat sebagai sg -connectiontest1-2.servers.example.com .
Saat memeriksa kode seputar bagaimana nama host diurai selama inisialisasi koneksi dan peran ditugaskan padanya, kami dapat menentukan bahwa kode driver sedang down-casing (yaitu mengonversi ABC. example.com ke abc.example.com) saat mengurai string koneksi. Selanjutnya, driver terhubung ke primer untuk menemukan topologi menggunakan perintah isMaster. Saat mengurai hasil dari perintah ini, driver menentukan peran setiap node.
MongoDB Ruby Driver 2.5.x Masalah Sensitivitas Huruf Besar-kecil dengan Nama Host pada Kumpulan ReplikaKlik Untuk TweetNamun, saat membandingkan nama host yang dikembalikan dari perintah dengan yang ada di string koneksi, driver mengabaikan untuk melakukan pencocokan case-insensitive. Ini menyebabkan ketidakcocokan dalam nama-nama primer seperti yang dilaporkan oleh MongoDB dengan apa yang telah ditentukan oleh driver dari string koneksi. Hal ini menyebabkan peran utama menjadi tidak diketahui dan menyebabkan kegagalan koneksi. Pemeriksaan kecocokan alamat dalam kode deteksi peran telah ditambahkan di 2.5.x.
Perbaikan masalah telah ditargetkan ke versi 2.6.0 dari driver.