All Products
Search
Document Center

ApsaraDB for MongoDB:Mengelola balancer

Last Updated:Sep 10, 2026

Balancer mendistribusikan data di seluruh node shard dalam instans kluster sharded ApsaraDB for MongoDB. Anda dapat memeriksa status balancer, menjadwalkan jendela waktu aktif, atau mengaktifkan dan menonaktifkannya.

Catatan

Contoh dalam topik ini menggunakan mongo shell. Perintah dan output dapat berbeda jika menggunakan alat lain.

Cara kerja

Balancer memantau distribusi data di seluruh node shard dan melakukan migrasi data secara otomatis. Perilakunya bervariasi tergantung pada versi mesin database.

MongoDB 5.0 dan sebelumnya

Balancer melacak jumlah chunk per node shard. Ketika selisih 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 per shard, bukan jumlah chunk. Jika selisih ukuran antara dua shard dalam satu koleksi melebihi 384 MB (tiga kali ukuran chunk default), balancer akan membagi data berdasarkan tag shard dan memigrasikannya menggunakan moveRange.

Untuk memverifikasi keseimbangan data, jalankan getShardDistribution() dan fokus pada ukuran data, bukan jumlah chunk.

Catatan

Setelah Anda melakukan upgrade ke V6.0 (minor 7.0.1) atau versi yang lebih baru, sh.status() mungkin menunjukkan bahwa jumlah chunk di seluruh shard tidak lagi seimbang atau setiap shard hanya menyimpan satu chunk. Ini merupakan perilaku yang diharapkan dari balancer baru. Untuk detailnya, lihat Jumlah chunk tidak seimbang di seluruh shard setelah upgrade MongoDB.

Catatan penggunaan

  • Hanya didukung untuk instans kluster sharded.

  • Secara default, balancer berjalan terus-menerus (jendela aktif 24 jam).

  • Migrasi chunk mengonsumsi sumber daya dan dapat menurunkan performa. Jadwalkan jendela aktif selama jam sepi.

Periksa status balancer

Sebelum menonaktifkan balancer, pastikan tidak ada migrasi yang sedang berlangsung.

  1. Sambungkan ke instans kluster sharded menggunakan mongo shell.

  2. Jalankan perintah berikut:

       sh.isBalancerRunning()
  3. Interpretasikan hasil berdasarkan tipe nilai kembali: Nilai kembali Map Beberapa versi mongo shell mengembalikan objek Map. Periksa bidang inBalancerRound seperti yang didokumentasikan di sh.isBalancerRunning().

    Nilai kembali Boolean

    Nilai Makna
    false Balancer sedang idle. Aman untuk dinonaktifkan.
    true Balancer sedang memigrasikan chunk. Jangan nonaktifkan untuk menghindari inkonsistensi data.
    inBalancerRound Makna
    false Balancer sedang idle. Aman untuk dinonaktifkan.
    true Balancer sedang memigrasikan chunk. Jangan nonaktifkan untuk menghindari 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

Batasi balancer agar hanya berjalan pada jam tertentu guna mengurangi dampak terhadap performa selama jam sibuk.

  1. Sambungkan ke instans kluster sharded menggunakan mongo shell.

  2. Beralih ke database config:

       use config
  3. Tetapkan jendela waktu aktif. Ganti placeholder dengan nilai Anda. Contoh: Jalankan balancer setiap hari dari pukul 01.00 hingga 03.00:

    Catatan

    Waktu mengacu pada zona waktu lokal wilayah instans.

    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 }
       )
  4. Jalankan sh.status() untuk memverifikasi. Output akan menampilkan jendela waktu aktif:

Hapus jendela waktu aktif

Untuk mengembalikan penyeimbangan berkelanjutan, hapus jendela waktu aktif:

db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })

Aktifkan balancer

Mengaktifkan balancer akan segera memulai migrasi data jika sharding telah dikonfigurasi, yang mengonsumsi sumber daya instans. Lakukan proses ini selama jam sepi.

  1. Sambungkan ke instans kluster sharded menggunakan mongo shell.

  2. Beralih ke database config:

       use config
  3. Aktifkan balancer:

       sh.setBalancerState(true)

Nonaktifkan balancer

Catatan

Balancer yang dinonaktifkan akan menghentikan migrasi data di seluruh node shard, yang dapat menyebabkan kesenjangan data.

  1. Sambungkan ke instans kluster sharded menggunakan mongo shell.

  2. Beralih ke database config:

       use config
  3. Periksa apakah balancer sedang memigrasikan data. Interpretasikan nilai kembali seperti yang dijelaskan di Periksa status balancer.

    • Jika hasilnya false (atau inBalancerRound: false untuk nilai kembali Map), lanjutkan ke langkah berikutnya.

    • Jika hasilnya true (atau inBalancerRound: true), tunggu hingga migrasi selesai. Menonaktifkan balancer di tengah migrasi dapat menyebabkan inkonsistensi data.

       sh.isBalancerRunning()
  4. Setelah balancer idle, nonaktifkan:

       sh.stopBalancer()

Referensi

FAQ

Apakah normal jika dokumen yatim muncul setelah balancer diaktifkan, dan bagaimana cara menanganinya?

Dokumen yatim dapat terbentuk ketika migrasi chunk terganggu atau dibatalkan, atau ketika kunci shard yang tidak sesuai mendistribusikan data secara tidak merata. Dalam kasus tersebut, operasi moveChunk dapat meninggalkan data di shard sumber.

Jumlah dokumen yatim dapat berfluktuasi saat balancer sering memigrasikan chunk. Hal ini normal selama jumlahnya akhirnya turun ke 0 dan tidak tetap tinggi dalam jangka waktu lama.

Penyeimbangan juga dapat dipicu secara otomatis ketika selisih volume data antar koleksi melebihi ambang batas default, misalnya 200 MB. Proses ini dapat sementara menghasilkan dokumen yatim.

Jika dokumen yatim tetap ada, periksa log balancer untuk mencari error migrasi dan pastikan kunci shard mendistribusikan data secara merata. Setelah semua migrasi chunk selesai, jalankan cleanupOrphaned untuk menghapus dokumen yatim yang tersisa.