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

Cara Menghentikan Runaway Index Build di MongoDB

Bangunan indeks di MongoDB dapat berdampak buruk pada ketersediaan klaster MongoDB Anda. Jika Anda memicu build indeks latar depan pada koleksi besar di server produksi, Anda mungkin mendapati bahwa cluster Anda tidak responsif hingga build indeks selesai. Pada koleksi besar, ini bisa memakan waktu beberapa jam atau hari, seperti yang dijelaskan dalam bahaya pembuatan indeks di MongoDB.

Praktik terbaik yang disarankan adalah memicu pembuatan indeks di latar belakang, namun, pada indeks koleksi besar, kami telah melihat banyak masalah dengan pendekatan ini. Dalam kasus kluster tiga simpul, kedua sekunder mulai membangun indeks dan berhenti merespons permintaan apa pun. Akibatnya, primer tidak memiliki kuorum dan berpindah ke status sekunder dengan menghapus cluster Anda. Selain itu, build indeks default yang dipicu dari baris perintah adalah build indeks latar depan – menjadikannya masalah yang sekarang tersebar luas. Dalam rilis mendatang, kami berharap ini menjadi latar belakang secara default.

Setelah Anda memicu indeks, hanya memulai ulang server tidak menyelesaikan masalah kami; MongoDB akan mengambil build indeks dari tempat terakhirnya. Jika Anda menjalankan build indeks latar belakang sebelumnya setelah memulai ulang, sekarang menjadi build indeks latar depan, jadi dalam kasus ini, memulai ulang dapat memperburuk masalah.

Jika Anda telah memicu pembuatan indeks, bagaimana cara menghentikannya? Untungnya, menghentikan pembuatan indeks relatif mudah.

Opsi 1:Matikan proses pembuatan indeks

Temukan proses pembuatan indeks menggunakan db.currentOp() lalu matikan operasi menggunakan db.killOp(). Operasi indeks akan terlihat seperti ini:

{
"opid" : 820659355,
"active" : true,
"lockType" : "write",
....
"op" : "insert",
"ns" : "xxxx",
"query" : {
},
"client" : "xxxx",
"desc" : "conn",
"msg" : "index: (2/3) btree bottom up 292168587/398486401 64%"
}

Jika node tempat indeks dibangun tidak merespons koneksi baru, atau killOp tidak berfungsi, gunakan Opsi 2 di bawah ini:

Opsi 2:Mengonfigurasi “noIndexBuildRetry” &memulai ulang

MongoDB menyediakan opsi “–noIndexBuildRetry” yang memerintahkan MongoDB untuk berhenti membuat indeks yang tidak lengkap saat dimulai ulang.

Parameter ini tampaknya tidak didukung dari file konfigurasi, hanya sebagai parameter untuk proses mongod. Kami tidak suka menjalankan mongod secara manual dengan opsi ini karena jika Anda tidak sengaja menjalankan proses mongod sebagai pengguna yang ditinggikan (Misalnya root), itu akan mengubah izin semua file. Selain itu, setelah dijalankan sebagai "root", kami mengalami masalah terputus-putus saat menjalankan proses sebagai mongod lagi.

Pilihan yang lebih sederhana adalah mengedit file /etc/init.d/mongod. Cari baris ini:

OPTIONS=" -f $CONFIGFILE"

Ganti dengan baris ini:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Langkah detail

Untuk tujuan diskusi ini, kami menyediakan instruksi untuk CentOS/RedHat/Amazon Linux.

  1. Konfigurasikan “–noIndexBuildRetry”

    Tambahkan opsi “–noIndexBuildRetry” ke semua node data Anda seperti yang dijelaskan di atas.

  2. Mulai ulang semua node yang membangun indeks

    Lihat file log mongod untuk setiap server data dan tentukan apakah itu membangun file index. Jika ya, restart server “service mongod restart”.

  3. Lepaskan indeks yang tidak lengkap

    Setelah semua node yang relevan dimulai ulang, lihat daftar indeks dan hapus indeks yang tidak lengkap jika Anda melihatnya di daftar.

  4. Hapus “–noIndexBuildRetry”

    Edit file /etc/init.d/mongod untuk menghapus opsi –noIndexBuildRetry yang Anda tambahkan di langkah 1 sehingga kami dapat kembali ke perilaku default untuk melanjutkan pembangunan indeks.

Untuk pertanyaan lebih lanjut, hubungi kami di [email protected].

Selamat mengindeks!


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kompresi Awalan Indeks di MongoDB 3.0 WiredTiger

  2. MongoDB melalui Mongoose JS - Apa itu findByID?

  3. MongoDB $sum Agregasi Pipeline Operator

  4. MongoDB Node memeriksa apakah objectid valid

  5. 4 Cara Memperbarui Dokumen di MongoDB