Sharding adalah penskalaan horizontal yang membagi isi satu koleksi ke beberapa server sekaligus, sehingga beban data dan query tidak menumpuk pada satu mesin. Topik ini memperkenalkan komponen kluster ter-shard, peran kunci shard dalam menentukan distribusi data, dan perintah pengaturan sharding pada mongosh. Kluster ter-shard tidak berjalan pada lingkungan latihan jalur ini, sehingga seluruh perintah sh.* pada topik ini hanya berupa contoh yang tidak dieksekusi, dan arsitekturnya diperjelas melalui diagram.
Mengapa penskalaan horizontal diperlukan#
Penskalaan vertikal menaikkan kapasitas satu server dengan mengganti prosesor, memori, atau penyimpanannya. Cara ini mudah dijalankan, tetapi kapasitas satu mesin memiliki batas fisik dan biayanya naik lebih cepat daripada pertumbuhan data. Penskalaan horizontal mengambil jalan lain, yaitu menambah banyak mesin biasa yang membagi tugas, sehingga kapasitas bertambah setiap kali satu mesin ditambahkan.
Sharding menerapkan penskalaan horizontal pada tingkat koleksi. Isi satu koleksi dipecah menjadi bagian-bagian (chunk) menurut nilai kunci shard, dan setiap bagian disimpan pada shard yang berbeda. Satu shard adalah replica set utuh, sehingga setiap bagian tetap memperoleh redundansi dan failover milik replica set. Query yang menyertakan kunci shard diteruskan hanya ke shard yang relevan, sedangkan query yang tidak menyertainya diteruskan ke seluruh shard dan hasilnya digabungkan.
Komponen kluster ter-shard#
Kluster ter-shard tersusun atas tiga komponen. Shard adalah replica set yang menyimpan bagian data. Router query bernama mongos menerima seluruh koneksi aplikasi dan meneruskan operasi ke shard yang relevan. Config server adalah replica set kecil yang menyimpan metadata pemetaan dari setiap bagian data ke shard tempat bagian itu disimpan. Aplikasi hanya berkomunikasi dengan mongos dan tidak perlu mengetahui letak datanya.
Alur sebuah query mengikuti diagram tersebut. Aplikasi mengirim query ke mongos. Selanjutnya, mongos membaca pemetaan dari config server untuk menentukan shard mana yang memuat data yang dicari, lalu meneruskan query tersebut dan mengembalikan hasilnya. Router ini tidak menyimpan data, sehingga mongos dapat dijalankan lebih dari satu tanpa menimbulkan salinan data yang perlu disinkronkan.
Kunci shard#
Kunci shard (shard key) adalah field yang nilainya menentukan pembagian data, dan pilihannya ditetapkan pada saat koleksi mulai di-shard. Pembagian menurut rentang membagi nilai dari terkecil ke terbesar, sedangkan pembagian menurut hash menghitung nilai hash kunci lalu membagi hasilnya secara merata. Kunci dengan nilai yang selalu bertambah, seperti timestamp atau ObjectId, menghasilkan tulisan yang menumpuk pada satu shard bila dibagi menurut rentang. Karena itu, kunci semacam ini lazimnya memakai tipe hashed.
Kualitas kunci shard dinilai dari dua sisi. Sisi pertama adalah kardinalitas, yaitu banyaknya nilai berbeda pada kunci, karena kunci dengan sedikit nilai berbeda membatasi banyaknya bagian yang dapat dibentuk. Sisi kedua adalah pola query, karena query yang tidak menyertakan kunci shard harus diteruskan ke seluruh shard. Kunci yang baik memuat field yang hampir selalu ada pada query sekaligus memiliki banyak nilai berbeda.
Perintah pengaturan sharding#
Pengaturan sharding dijalankan melalui mongos dengan keluarga perintah sh.*. Perintah sh.addShard() mendaftarkan sebuah replica set sebagai shard, lalu sh.shardCollection() menetapkan kunci shard sebuah koleksi. Sejak MongoDB 6.0, mengaktifkan sharding pada sebuah basis data berlangsung otomatis saat sh.shardCollection() dijalankan, sehingga tidak ada langkah pengaktifan terpisah. Contoh berikut tidak dijalankan karena kluster ter-shard tidak tersedia pada lingkungan latihan.
# tidak-dijalankan
// mendaftarkan dua replica set sebagai shard pada kluster
sh.addShard("rs-shard-0/node-0.example.net:27017")
sh.addShard("rs-shard-1/node-1.example.net:27017")# tidak-dijalankan
// membagi koleksi log_kegiatan menurut rentang nilai field waktu
sh.shardCollection("operasional.log_kegiatan", { waktu: 1 })
// membagi koleksi nilai_ujian menurut hash field siswaId
sh.shardCollection("operasional.nilai_ujian", { siswaId: "hashed" })Bentuk { field: 1 } membagi koleksi menurut rentang nilai field di dalamnya, sedangkan bentuk { field: "hashed" } membaginya menurut hash. Setelah koleksi terbagi, sh.status() merangkum keadaan kluster dari shell, termasuk daftar shard dan sebaran bagiannya. Distribusinya terus bergerak, karena balancer pada kluster memindahkan bagian data antarshard agar bebannya tetap seimbang.
Kesalahan umum#
Kesalahan pertama adalah memilih kunci shard yang nilainya terus bertambah tanpa tipe hashed. Pembagian menurut rentang menempatkan seluruh tulisan baru pada satu ujung rentang, sehingga satu shard menerima semua beban tulis dan tujuan penskalaan horizontal tidak tercapai. Perbaikannya adalah memakai tipe hashed pada kunci semacam itu atau memilih kunci dengan sebaran nilai yang merata.
Kesalahan kedua adalah menetapkan kunci shard tanpa mempertimbangkan pola query. Query yang tidak menyertakan kunci shard dipancarkan ke seluruh shard, sehingga biayanya naik seiring jumlah shard. Perbaikannya adalah mengikutsertakan field yang paling sering dipakai pada query ke dalam kunci shard, misalnya sebagai kunci majemuk yang memadukan beberapa field, sebelum koleksinya terbagi.
Ringkasan#
- Sharding membagi satu koleksi menjadi bagian-bagian menurut kunci shard, dan setiap shard berupa replica set utuh.
- Kluster ter-shard memuat shard penyimpan data,
mongossebagai router query, dan config server penyimpan metadata pemetaan. - Kunci shard ditetapkan sekali per koleksi, dan kunci yang buruk menimbulkan hotspot, yaitu pemusatan beban pada satu shard, atau query yang terpancar ke seluruh shard.
sh.addShard()mendaftarkan shard,sh.shardCollection()menetapkan kuncinya, dansh.status()merangkum keadaan kluster.
Referensi#
- Sharding Introduction — MongoDB Manual — Ikhtisar sharding dan kondisi ketika sebaiknya dipakai.
- Sharded Cluster Components — MongoDB Manual
— Peran shard,
mongos, dan config server pada kluster. - Shard Keys — MongoDB Manual — Aturan pemilihan kunci shard beserta strategi pembagiannya.
- sh.shardCollection — MongoDB Manual — Dokumentasi penetapan kunci shard pada koleksi.
- sh.addShard — MongoDB Manual — Dokumentasi pendaftaran replica set sebagai shard.