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

Memperbaiki Kesalahan Halaman di MongoDB

Kesalahan halaman adalah kesalahan umum yang sebagian besar terjadi pada aplikasi besar yang melibatkan data besar. Itu terjadi ketika database MongoDB membaca data dari memori fisik daripada dari memori virtual. Kesalahan kesalahan halaman terjadi pada saat MongoDB ingin mendapatkan data yang tidak tersedia di memori aktif dari database sehingga terpaksa membaca dari disk. Ini menciptakan latensi yang besar untuk operasi throughput yang membuat kueri terlihat seperti tertinggal.

Menyesuaikan kinerja MongoDB dengan menyetel adalah komponen penting yang mengoptimalkan eksekusi aplikasi. Basis data ditingkatkan untuk bekerja dengan informasi yang disimpan di disk, namun biasanya menyimpan sejumlah besar data dalam RAM dalam upaya mengakses disk. Sangat mahal untuk menyimpan dan mengakses data dari database, oleh karena itu informasi harus disimpan terlebih dahulu dalam disk sebelum mengizinkan aplikasi untuk mengaksesnya. Karena kenyataan bahwa disk lebih lambat dibandingkan dengan cache data RAM, maka prosesnya memakan banyak waktu. Oleh karena itu, MongoDB dirancang untuk melaporkan terjadinya kesalahan halaman sebagai ringkasan dari semua insiden dalam satu detik

Topologi Pergerakan Data di MongoDB

Data dari klien dipindahkan ke memori virtual  tempat cache halaman membacanya seperti yang tertulis, data kemudian disimpan dalam disk seperti yang ditunjukkan pada diagram di bawah.

Cara Menemukan Kesalahan Halaman MongoDB

Kesalahan halaman dapat dideteksi melalui kinerja penguncian yang memastikan konsistensi data di MongoDB. Saat operasi tertentu mengantre atau berjalan dalam waktu lama, performa MongoDB menurun dan operasi melambat  saat menunggu penguncian. Hal ini menyebabkan pelambatan karena penundaan terkait penguncian bersifat sporadis dan terkadang memengaruhi kinerja aplikasi. Kunci mempengaruhi kinerja aplikasi saat kunci dibagi (locks.timeAcquiringMicros oleh locks.acquireWaitCount), ini memberikan waktu rata-rata untuk menunggu mode kunci tertentu. Locks.deadLockCount memberikan total semua kebuntuan akuisisi kunci yang dialami. Mengingat globalLock.totalTime  tinggi secara harmonis, maka ada banyak permintaan yang mengharapkan penguncian. Karena lebih banyak permintaan menunggu penguncian, lebih banyak RAM yang dikonsumsi dan ini mengarah ke Kesalahan halaman.

Anda juga dapat menggunakan mem.mapped yang memungkinkan pengembang untuk meneliti total memori yang digunakan mongod. Mem.mapped adalah operator server untuk memeriksa jumlah memori dalam megabyte (MB) di mesin penyimpanan MMAPv1. Jika operator mem.mapped menunjukkan nilai A lebih besar dari jumlah total memori sistem, maka kesalahan halaman akan terjadi karena penggunaan memori dalam jumlah besar akan menyebabkan kesalahan halaman dalam database.

Bagaimana Kesalahan Halaman Terjadi di MongoDB

Memuat halaman di MongoDB bergantung pada ketersediaan memori kosong, jika memori kosong tidak tersedia maka sistem operasi harus:

  1. Cari halaman yang databasenya telah berhenti digunakan dan tulis halaman tersebut pada disk memori.
  2. Muat halaman yang diminta ke dalam memori setelah membacanya dari disk.

Dua aktivitas ini terjadi saat halaman dimuat dan dengan demikian menghabiskan banyak waktu dibandingkan dengan membaca dalam memori aktif yang menyebabkan terjadinya kesalahan halaman.

Memecahkan Kesalahan Halaman MongoDB

Berikut adalah beberapa cara yang dapat digunakan untuk mengatasi kesalahan halaman: 

  1. Penskalaan secara vertikal ke perangkat dengan RAM yang cukup atau penskalaan Horizontal: Jika RAM tidak mencukupi untuk  kumpulan data tertentu, pendekatan yang benar adalah meningkatkan memori RAM dengan menskalakan secara vertikal ke perangkat dengan RAM lebih banyak untuk menambahkan lebih banyak sumber daya ke server. Penskalaan vertikal adalah salah satu cara terbaik dan mudah untuk meningkatkan kinerja MongoDB dengan tidak menyebarkan beban di antara beberapa server. Karena penskalaan secara vertikal menambahkan lebih banyak RAM, penskalaan secara horizontal memungkinkan penambahan lebih banyak pecahan ke cluster pecahan. Secara sederhana, penskalaan horizontal adalah tempat database dibagi menjadi berbagai bagian dan disimpan di beberapa server. Penskalaan horizontal memungkinkan pengembang untuk menambahkan lebih banyak server dengan cepat dan ini sangat meningkatkan kinerja basis data karena tidak menimbulkan waktu henti nol. Penskalaan vertikal dan penskalaan horizontal mengurangi penyelesaian kesalahan halaman dengan meningkatkan memori yang berfungsi saat bekerja dengan database.
  2. Indeks data dengan benar: Penggunaan indeks yang sesuai untuk memastikan bahwa ada kueri yang efisien yang tidak menyebabkan pemindaian koleksi. Pengindeksan yang tepat memastikan bahwa database tidak mengulangi setiap dokumen dalam koleksi dan dengan demikian memecahkan kemungkinan terjadinya kesalahan kesalahan halaman. Pemindaian koleksi menyebabkan kesalahan kesalahan halaman karena seluruh koleksi diperiksa oleh mesin kueri saat dibaca ke dalam RAM. Sebagian besar dokumen dalam pemindaian koleksi tidak dikembalikan dalam aplikasi dan dengan demikian menyebabkan kesalahan halaman yang tidak perlu untuk setiap kueri berikutnya yang tidak mudah dihindari. Selain itu, kelebihan indeks juga dapat menyebabkan penggunaan RAM yang tidak efisien hal ini dapat menyebabkan kesalahan page fault. Oleh karena itu, pengindeksan yang tepat sangat penting jika  developer bermaksud untuk mengatasi kesalahan kesalahan halaman. MongoDB menawarkan bantuan dalam menentukan indeks yang harus disebarkan saat menggunakan database. Mereka menawarkan Penganalisis Kueri Lambat yang memberikan informasi yang diperlukan tentang cara mengindeks untuk pengguna dan pengguna bersama.
  3. Bermigrasi ke MongoDB versi terbaru lalu pindahkan aplikasi ke WiredTiger. Ini diperlukan jika Anda ingin menghindari kesalahan kesalahan halaman karena kesalahan halaman hanya umum di mesin penyimpanan MMAPv1 dibandingkan dengan versi yang lebih baru dan WiredTiger. Mesin penyimpanan MMAPv1 tidak digunakan lagi dan MongoDB tidak lagi mendukungnya. WiredTiger adalah mesin penyimpanan default saat ini di MongoDB dan memiliki Kontrol Konkurensi MultiVersi yang membuatnya jauh lebih baik dibandingkan dengan mesin penyimpanan MMAPv1. Dengan WiredTiger MongoDB dapat menggunakan cache sistem file dan cache internal WiredTiger yang memiliki ukuran sangat besar baik 1GB (50% 0f ( RAM - 1GB)) atau 256 MB.
  4. Melacak total RAM yang tersedia untuk digunakan di sistem Anda. Ini dapat dilakukan dengan menggunakan layanan seperti pemantauan Relik Baru Google Cloud Monitoring. Selain itu, BindPlane dapat digunakan dengan layanan pemantauan cloud yang disebutkan. Menggunakan sistem pemantauan adalah tindakan proaktif yang memungkinkan seseorang untuk mengatasi kesalahan halaman sebelum terjadi daripada bereaksi terhadap kesalahan halaman yang terjadi. BindPlane memungkinkan monitor untuk mengatur peringatan konstan untuk terjadinya kesalahan halaman, peringatan juga membuat seseorang menyadari jumlah indeks, ukuran indeks dan ukuran file.
  5. Memastikan bahwa data dikonfigurasikan ke perangkat kerja yang berlaku dan tidak akan menggunakan lebih banyak RAM daripada yang disarankan. MongoDB adalah sistem database yang bekerja paling baik ketika data yang sering diakses dan indeks dapat masuk dengan sempurna ke dalam memori yang ditetapkan. Ukuran RAM adalah aspek penting ketika mengoptimalkan kinerja database, oleh karena itu seseorang harus memastikan bahwa selalu ada cukup memori RAM sebelum menerapkan aplikasi.
  6. Mendistribusikan beban antar instance mongod dengan menambahkan shard atau men-deploy cluster sharded. Sangat penting untuk mengaktifkan naungan di mana koleksi yang ditargetkan berada. Pertama,  sambungkan ke mongo di shell mongo dan gunakan metode di bawah ini.
    1. sh.shardCollection()

      Kemudian buat indeks dengan metode ini.

      ​db.collection.createIndex(keys, options)
      Indeks yang dibuat mendukung shard key, yaitu jika kumpulan yang dibuat telah menerima atau menyimpan beberapa data. Namun, jika koleksi tidak memiliki data (kosong), gunakan metode di bawah ini untuk mengindeksnya sebagai bagian dari ssh.shardCollection: sh.shardCollection()
    2. Ini diikuti oleh salah satu dari dua strategi yang disediakan oleh mongoDB.
      1. Hash shading 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Bayangan berbasis rentang 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Cara Mencegah Kesalahan Halaman MongoDB

  1. Tambahkan pecahan atau terapkan kluster pecahan untuk mendistribusikan beban
  2. Memiliki RAM yang cukup untuk aplikasi Anda sebelum menerapkannya
  3. Pindah ke MongoDB versi yang lebih baru lalu lanjutkan ke WiredTiger
  4. Skalakan secara vertikal atau Horizontal untuk perangkat dengan RAM lebih banyak 
  5. Gunakan RAM yang Disarankan dan pantau ruang RAM yang digunakan

Kesimpulan 

Beberapa kesalahan halaman (Sendiri) membutuhkan waktu yang singkat Namun, dalam situasi di mana ada banyak kesalahan halaman (agregat), ini merupakan indikasi bahwa database sedang membaca sejumlah besar data di disk. Ketika agregat terjadi, akan ada lebih banyak kunci baca MongoBD yang akan menyebabkan kesalahan halaman.

Saat menggunakan MongoDB, ukuran RAM untuk sistem dan jumlah kueri dapat sangat memengaruhi kinerja aplikasi. Kinerja aplikasi di MongoDB sangat bergantung pada RAM yang tersedia pada memori fisik yang berdampak pada waktu yang dibutuhkan aplikasi untuk membuat satu kueri. Dengan RAM yang cukup  kejadian kesalahan halaman berkurang dan kinerja aplikasi ditingkatkan.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mendapatkan data ReferenceField di mongoengine?

  2. Pembaruan Massal Dokumen di MongoDB

  3. Fungsi Mongo Find() tidak akan mengecualikan _id

  4. findOne Subdocument dalam bahasa luwak

  5. Hapus semua bidang yang null