Jika Anda ingin menambahkan atau menghapus shard ke atau dari instance kluster terpecah ApsaraDB for MongoDB, atau memigrasi data, Anda mungkin perlu mengubah jendela waktu aktif balancer atau menentukan apakah akan mengaktifkan atau menonaktifkannya. Topik ini menjelaskan cara mengelola balancer.
Deskripsi fitur
Balancer dapat menyeimbangkan data di antara node shard dalam instance kluster terpecah. Prinsip kerja balancer bervariasi berdasarkan versi instance ApsaraDB untuk MongoDB.
MongoDB 5.0 dan versi sebelumnya
Balancer memantau jumlah chunk pada setiap node shard dalam instance kluster terpecah. Ketika jumlah chunk pada node shard mencapai ambang batas migrasi data tertentu, balancer memigrasikan chunk pada node shard (moveChunk) ke node shard lain untuk menyeimbangkan distribusi chunk di seluruh semua node shard. Ambang batas migrasi data bervariasi berdasarkan versi instance. Tabel berikut menjelaskan ambang batas migrasi data untuk versi instance yang berbeda.
Versi mesin database
Ambang batas migrasi data
MongoDB 3.2 (tidak digunakan lagi)
Jika total jumlah chunk kurang dari 20, ambang batas migrasi data adalah 2.
Jika total jumlah chunk berkisar antara 20 hingga 80, ambang batas migrasi data adalah 4.
Jika total jumlah chunk lebih besar dari atau sama dengan 80, ambang batas migrasi data adalah 8.
MongoDB 3.4 (tidak digunakan lagi)
MongoDB 4.0
Ambang batas migrasi data default adalah 2.
Jika total jumlah chunk kurang dari 20, atau jika total jumlah chunk yang sebelumnya dimigrasikan kurang dari 20, ambang batas migrasi data adalah 1.
MongoDB 4.2
MongoDB 4.4
MongoDB 5.0
Ambang batas migrasi data adalah 1.
MongoDB 6.0
Keberadaan chunk jumbo dapat menyebabkan masalah berikut: Jumlah chunk pada setiap node shard sama, tetapi penggunaan ruang pada setiap node shard berbeda. Untuk menyelesaikan masalah ini, balancer memantau ukuran data dalam koleksi yang sama pada setiap node shard dalam instance kluster terpecah ApsaraDB for MongoDB 6.0 atau lebih baru. Jika perbedaan ukuran data antara dua node shard dalam koleksi yang sama melebihi 384 MB (tiga kali ukuran chunk), balancer membagi data berdasarkan tag shard dan memigrasikan data ke node shard lain (moveRange).
Untuk menentukan apakah data sudah seimbang, Anda dapat menjalankan perintah
getShardDistribution()untuk melihat distribusi data dalam sebuah koleksi. Alih-alih fokus pada konsep logis chunk, Anda hanya perlu fokus pada ukuran data koleksi.
Catatan penggunaan
Balancer hanya didukung untuk instance kluster terpecah.
Secara default, balancer diaktifkan. Untuk informasi lebih lanjut tentang cara mengaktifkan balancer, lihat Aktifkan Balancer.
Secara default, jendela waktu aktif balancer adalah 24 jam. Saat balancer memigrasikan chunk, kinerja database mungkin menurun. Untuk menghindari dampak migrasi chunk terhadap bisnis Anda, kami sarankan Anda mengubah jendela waktu aktif balancer menjadi jam-jam sepi. Untuk informasi lebih lanjut tentang cara menetapkan jendela waktu aktif, lihat Tetapkan Jendela Aktif untuk Balancer.
Dalam contoh-contoh yang diberikan dalam topik ini, mongo shell digunakan untuk mengelola balancer. Metode yang digunakan alat klien lain untuk mengelola balancer dan informasi yang dikembalikan mungkin berbeda dari contoh-contoh ini.
Tetapkan jendela waktu aktif untuk balancer
Hubungkan ke instance kluster terpecah menggunakan mongo shell
Setelah terhubung ke node mongos, jalankan perintah berikut di mongo shell untuk beralih ke database config:
use configJalankan perintah berikut untuk menetapkan jendela waktu aktif untuk balancer:
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )Catatan<start-time>: waktu mulai jendela waktu aktif. Tentukan waktu dalam format HH:MM. Nilai HH berkisar dari 00 hingga 23, dan nilai MM berkisar dari 00 hingga 59. Format ini menunjukkan waktu lokal wilayah tempat instance diterapkan.<stop-time>: waktu akhir jendela waktu aktif. Tentukan waktu dalam format HH:MM. Nilai HH berkisar dari 00 hingga 23, dan nilai MM berkisar dari 00 hingga 59. Format ini menunjukkan waktu lokal wilayah tempat instance diterapkan.
Sebagai contoh, Anda harus mengubah jendela waktu aktif balancer menjadi pukul 1 pagi hingga 3 pagi setiap hari. Contoh perintah:
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00", stop : "03:00" } } }, { upsert: true } )Setelah menyelesaikan konfigurasi, Anda dapat menjalankan perintah
sh.status()untuk melihat jendela waktu aktif balancer. Contoh hasil:
Operasi terkait: Jika Anda ingin balancer selalu dalam status Running, jalankan perintah berikut untuk menghapus pengaturan jendela waktu aktif:
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } }) Aktifkan balancer
Jika Anda telah mengonfigurasi sharding, balancer dapat segera memulai prosedur penyeimbangan di antara node shard setelah balancer diaktifkan. Penyeimbangan memakan sumber daya instance. Oleh karena itu, kami sarankan Anda melakukan operasi ini selama jam-jam sepi.
Hubungkan ke instance kluster terpecah menggunakan mongo shell
Setelah terhubung ke node mongos, jalankan perintah berikut di mongo shell untuk beralih ke database config:
use configJalankan perintah berikut untuk mengaktifkan balancer:
sh.setBalancerState(true)
Nonaktifkan balancer
Secara default, balancer diaktifkan. Untuk sementara menonaktifkan balancer, lakukan langkah-langkah berikut.
Setelah balancer dinonaktifkan, balancer tidak lagi menyeimbangkan data di seluruh node shard. Ini dapat menyebabkan skew data.
Hubungkan ke instance kluster terpecah menggunakan mongo shell
Setelah terhubung ke node mongos, jalankan perintah berikut di mongo shell untuk beralih ke database config:
use configJalankan perintah
sh.isBalancerRunning()untuk melihat status berjalan balancer.Perintah
sh.isBalancerRunning()mengembalikan nilai Boolean atau Map berdasarkan versi klien mongo shell.Boolean
Jika nilai false dikembalikan, balancer tidak melakukan tugas. Dalam hal ini, Anda dapat menonaktifkan balancer.
Jika nilai true dikembalikan, balancer sedang melakukan tugas migrasi chunk. Dalam hal ini, Anda tidak dapat menonaktifkan balancer. Jika tidak, ketidaksesuaian data mungkin terjadi.
Map
{ mode: 'full', inBalancerRound: false, numBalancerRounds: Long("1143"), ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1639753724, i: 3 }), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: Long("0") } }, operationTime: Timestamp({ t: 1639753724, i: 3 }) }Jika parameter inBalancerRound disetel ke false, balancer tidak melakukan tugas. Dalam hal ini, Anda dapat menonaktifkan balancer.
Jika parameter inBalancerRound disetel ke true, balancer sedang melakukan tugas migrasi chunk. Dalam hal ini, Anda tidak dapat menonaktifkan balancer. Jika tidak, ketidaksesuaian data mungkin terjadi.
Untuk informasi lebih lanjut tentang perintah
sh.isBalancerRunning(), lihat sh.isBalancerRunning().Setelah memastikan bahwa tidak ada keluaran yang dikembalikan untuk perintah ini pada langkah sebelumnya, jalankan perintah berikut untuk menonaktifkan balancer:
sh.stopBalancer()