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.
Koneksikan ke instans kluster MongoDB yang di-shard.
Pada jendela perintah node mongos, alihkan ke database config.
use configJalankan 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.chunksuntuk 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
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.