All Products
Search
Document Center

Data Transmission Service:Cara mengatasi distribusi data yang tidak merata di kluster MongoDB yang di-shard

Last Updated:Sep 24, 2026

Mengaktifkan balancer dan melakukan pre-splitting secara efektif dapat mengatasi masalah ketika sebagian besar data hanya ditulis ke satu shard (data skew).

Aktifkan balancer

Jika balancer dinonaktifkan atau jendela balancer yang dikonfigurasi belum tercapai, Anda dapat mengaktifkan balancer atau sementara menghapus jendela balancer agar penyeimbangan data segera dimulai.

  1. Koneksikan ke instans kluster MongoDB yang di-shard.

  2. Pada jendela perintah node mongos, alihkan ke database config.

    use config
  3. Jalankan perintah berikut sesuai kebutuhan Anda.

    • Aktifkan balancer

      sh.setBalancerState(true)
    • Sementara hapus jendela balancer

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

Pre-splitting

MongoDB mendukung sharding berbasis rentang (ranged sharding) dan sharding berbasis hash (hashed sharding). Pre-splitting mendistribusikan nilai chunk ke beberapa node shard sedekat mungkin secara merata, sehingga membantu menyeimbangkan beban selama sinkronisasi atau migrasi data DTS.

Hashed sharding

Gunakan parameter numInitialChunks untuk melakukan pre-splitting dengan cepat dan mudah. Nilai default-nya adalah jumlah shard × 2, dan nilai maksimumnya adalah jumlah shard × 8192. Untuk informasi lebih lanjut, lihat sh.shardCollection().

sh.shardCollection("phonebook.contacts", { last_name: "hashed" }, false, {numInitialChunks: 16384})

Ranged sharding

  • Jika MongoDB sumber juga menggunakan arsitektur kluster yang di-shard, Anda dapat mengkueri data di config.chunks untuk memperoleh rentang chunk dari koleksi yang di-shard di MongoDB sumber, lalu menggunakannya sebagai referensi untuk <split_value> dalam perintah pre-splitting berikutnya.

  • Jika MongoDB sumber merupakan replica set, Anda hanya dapat menentukan rentang spesifik kunci shard dengan menjalankan perintah find, lalu merancang titik pemisahan (split points) yang sesuai berdasarkan rentang tersebut.

    # Dapatkan nilai minimum kunci shard
    db.<coll>.find().sort({<shardKey>:1}).limit(1)
    # Dapatkan nilai maksimum kunci shard
    db.<coll>.find().sort({<shardKey>:-1).limit(1)

Sintaks perintah

Catatan

Contoh berikut menggunakan perintah splitAt. Untuk informasi lebih lanjut, lihat sh.splitAt(), sh.splitFind(), dan Split Chunks in a Sharded Cluster.

sh.splitAt("<db>.<coll>", {"<shardKey>":<split_value>})

Contoh

sh.splitAt("test.test", {"id":0})
sh.splitAt("test.test", {"id":50000})
sh.splitAt("test.test", {"id":75000})

Setelah menyelesaikan pre-splitting, Anda dapat menjalankan perintah sh.status() pada node mongos untuk memverifikasi hasilnya.