MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apakah mongoDB memiliki masalah koneksi ulang atau apakah saya salah melakukannya?

PERBARUI :Artikel dukungan kami untuk topik ini (pada dasarnya salinan posting ini) telah dipindahkan ke dokumen pemecahan masalah koneksi kami.

Ada masalah yang diketahui bahwa jaringan Azure IaaS memberlakukan batas waktu idle sekitar tiga belas menit (secara empiris tiba di). Kami bekerja dengan Azure untuk melihat apakah kami tidak dapat membuat segalanya lebih ramah pengguna, tetapi sementara itu yang lain telah berhasil dengan mengonfigurasi opsi driver mereka untuk mengatasi masalah tersebut.

Waktu idle koneksi maksimum

Solusi paling efektif yang kami temukan dalam bekerja dengan Azure dan pelanggan kami adalah menyetel waktu idle koneksi maksimal di bawah empat menit. Idenya adalah membuat driver mendaur ulang koneksi idle sebelum firewall memaksa masalah. Misalnya, satu pelanggan, yang menggunakan driver C#, menyetel MongoDefaults.MaxConnectionIdleTime menjadi satu menit dan itu menyelesaikan masalah mereka.

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

Kode aplikasi itu sendiri tidak berubah, tetapi sekarang di belakang layar, pengemudi secara agresif mendaur ulang koneksi yang tidak aktif. Hasilnya juga dapat dilihat di log server:banyak koneksi terputus selama periode idle di aplikasi.

Ada detail lebih lanjut tentang pendekatan ini di utas pengguna mongo terkait, SocketException menggunakan driver C# di Azure.

Keepalive

Anda juga dapat mengatasi masalah ini dengan membuat koneksi Anda tidak terlalu menganggur dengan semacam keepalive. Ini sedikit rumit untuk diterapkan kecuali driver Anda mendukungnya, biasanya dengan memanfaatkan TCP Keepalive. Jika Anda perlu melakukan roll sendiri, pastikan untuk mengambil setiap koneksi idle dari pool setiap beberapa menit dan mengeluarkan beberapa perintah sederhana dan murah, mungkin ping.

Menangani pemutusan sambungan

Pemutusan sambungan dapat terjadi dari waktu ke waktu bahkan tanpa pengaturan firewall yang agresif. Sebelum masuk ke produksi, pastikan Anda menanganinya dengan benar.

Pertama, pastikan untuk mengaktifkan koneksi ulang otomatis. Cara melakukannya bervariasi dari driver ke driver, tetapi ketika driver mendeteksi bahwa operasi gagal karena koneksi yang buruk menyalakan auto reconnect memberitahu pengemudi untuk mencoba menyambung kembali.

Tapi ini tidak sepenuhnya menyelesaikan masalah. Anda masih memiliki masalah tentang apa yang harus dilakukan dengan operasi yang gagal yang memicu penyambungan kembali. Sambung ulang otomatis tidak secara otomatis mencoba kembali operasi yang gagal. Itu akan berbahaya, terutama untuk menulis. Jadi biasanya pengecualian dilemparkan dan aplikasi diminta untuk menanganinya. Sering mencoba membaca kembali bukanlah hal yang sulit. Tetapi mencoba menulis ulang harus dipertimbangkan dengan cermat.

Sesi mongo shell di bawah ini menunjukkan masalahnya. Shell mongo secara default telah mengaktifkan koneksi ulang otomatis. Saya memasukkan dokumen ke dalam koleksi bernama stuff kemudian temukan semua dokumen dalam koleksi itu. Saya kemudian mengatur timer selama tiga puluh menit dan mencoba menemukan yang sama lagi. Gagal, tetapi shell secara otomatis terhubung kembali dan ketika saya segera mencoba kembali, ternyata berfungsi seperti yang diharapkan.

% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p *** 
MongoDB shell version: 2.2.2 
connecting to: ds012345.mongolab.com:12345/mydatabase 
> db.stuff.insert({}) 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") } 
> db.stuff.find() 
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345 
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345] 
Fri Jan 18 13:29:28 DBClientCursor::init call() failed 
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345 
Error: error doing query: failed 
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345 
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }

Kami siap membantu

Tentu saja, jika Anda memiliki pertanyaan, jangan ragu untuk menghubungi kami di [email protected] Kami siap membantu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb, kueri agregat dengan $lookup

  2. simpan luwak vs sisipkan vs buat

  3. MongoDB $pow

  4. Kueri MongoDB dengan kondisi 'atau'

  5. MongoDB $dalam Operator Pipa Agregasi