Balancer mendistribusikan data secara merata di seluruh node shard dalam instans kluster sharded ApsaraDB for MongoDB. Topik ini menjelaskan cara memeriksa status balancer, menjadwalkan jendela waktu aktif, serta mengaktifkan atau menonaktifkan balancer.
Semua contoh dalam topik ini menggunakan mongo shell. Perintah dan output dapat berbeda jika menggunakan alat klien lain.
Cara kerja
Balancer memantau distribusi data di seluruh node shard dan secara otomatis melakukan migrasi data untuk menjaga keseimbangan. Perilakunya bergantung pada versi mesin database.
MongoDB 5.0 dan sebelumnya
Balancer melacak jumlah chunk pada setiap node shard. Ketika selisih antar node shard mencapai ambang batas migrasi, balancer akan memigrasikan chunk (moveChunk) untuk menyeimbangkan kembali kluster.
| Versi mesin database | Ambang batas migrasi |
|---|---|
| MongoDB 4.2, 4.4, 5.0 | 1 |
| MongoDB 3.4 (tidak didukung lagi), MongoDB 4.0 | Default: 2. Diturunkan menjadi 1 jika total chunk < 20 atau chunk yang sebelumnya dimigrasikan < 20 |
| MongoDB 3.2 (tidak didukung lagi) | Total chunk < 20: ambang batas adalah 2. Total chunk 20–80: ambang batas adalah 4. Total chunk >= 80: ambang batas adalah 8 |
MongoDB 6.0
Balancer memantau ukuran data per koleksi pada setiap node shard, bukan menghitung jumlah chunk. Jika selisih ukuran data antara dua node shard dalam koleksi yang sama melebihi 384 MB (tiga kali ukuran chunk default), balancer akan membagi data berdasarkan tag shard dan memigrasikannya menggunakan moveRange.
Untuk memeriksa apakah data sudah seimbang, jalankan getShardDistribution() dan fokus pada ukuran data, bukan jumlah chunk.
Catatan penggunaan
Balancer hanya didukung untuk instans kluster sharded.
Secara default, balancer diaktifkan dengan jendela waktu aktif 24 jam (selalu berjalan).
Migrasi chunk mengonsumsi sumber daya instans dan dapat menurunkan performa database. Jadwalkan jendela waktu aktif selama jam sepi.
Periksa status balancer
Sebelum menonaktifkan balancer, periksa apakah balancer sedang menjalankan tugas migrasi.
Sambungkan ke instans kluster sharded menggunakan mongo shell.
Jalankan perintah berikut:
sh.isBalancerRunning()Interpretasikan hasil berdasarkan jenis nilai kembali: Nilai kembali Map Beberapa versi mongo shell mengembalikan objek Map. Periksa bidang
inBalancerRound: Untuk informasi lebih lanjut, lihat sh.isBalancerRunning().Nilai kembali Boolean
Nilai Makna falseBalancer tidak aktif. Anda dapat menonaktifkan balancer. trueBalancer sedang memigrasikan chunk. Jangan nonaktifkan—melakukannya dapat menyebabkan inkonsistensi data. inBalancerRoundMakna falseBalancer tidak aktif. Anda dapat menonaktifkan balancer. trueBalancer sedang memigrasikan chunk. Jangan nonaktifkan—melakukannya dapat menyebabkan inkonsistensi data. { 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 }) }
Tetapkan jendela waktu aktif
Jadwalkan balancer agar hanya berjalan pada jam tertentu guna menghindari dampak terhadap performa selama jam operasional.
Sambungkan ke instans kluster sharded menggunakan mongo shell.
Beralih ke database config:
use configTetapkan jendela waktu aktif: Ganti placeholder dengan nilai aktual: Contoh: Jadwalkan balancer berjalan dari pukul 01.00 hingga 03.00 setiap hari:
CatatanWaktu menggunakan zona waktu lokal wilayah tempat instans dideploy.
Placeholder Deskripsi Format <start-time>Waktu mulai jendela aktif HH:MM (HH: 00–23, MM: 00–59) <stop-time>Waktu akhir jendela aktif HH:MM (HH: 00–23, MM: 00–59) db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00", stop : "03:00" } } }, { upsert: true } )Verifikasi konfigurasi dengan menjalankan
sh.status(). Output mencakup jendela waktu aktif:
Hapus jendela waktu aktif
Untuk mengembalikan penyeimbangan berkelanjutan selama 24 jam, hapus jendela waktu aktif:
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })Aktifkan balancer
Setelah Anda mengaktifkan balancer, balancer akan segera mulai menyeimbangkan data jika sharding telah dikonfigurasi. Hal ini mengonsumsi sumber daya instans. Lakukan operasi ini selama jam sepi.
Sambungkan ke instans kluster sharded menggunakan mongo shell.
Beralih ke database config:
use configAktifkan balancer:
sh.setBalancerState(true)
Nonaktifkan balancer
Setelah balancer dinonaktifkan, balancer tidak lagi menyeimbangkan data di seluruh node shard. Hal ini dapat menyebabkan kesenjangan data.
Sambungkan ke instans kluster sharded menggunakan mongo shell.
Beralih ke database config:
use configPeriksa apakah balancer sedang aktif memigrasikan data: Untuk detail cara menginterpretasikan nilai kembali, lihat Periksa status balancer.
Jika hasilnya
false(atauinBalancerRound: falseuntuk nilai kembali Map), lanjutkan ke langkah berikutnya.Jika hasilnya
true(atauinBalancerRound: true), tunggu hingga migrasi saat ini selesai sebelum melanjutkan. Menonaktifkan balancer selama migrasi dapat menyebabkan inkonsistensi data.
sh.isBalancerRunning()Setelah memastikan balancer tidak aktif, nonaktifkan balancer:
sh.stopBalancer()