Pertumbuhan data yang besar disertai dengan biaya operasi throughput yang lebih rendah terutama ketika dilayani oleh satu server. Namun, Anda dapat meningkatkan kinerja ini dengan meningkatkan jumlah server dan juga mendistribusikan data Anda di beberapa nomor server ini. Dalam artikel ini, set Replika di MongoDB, kami membahas secara rinci bagaimana operasi throughput dapat ditingkatkan selain memastikan ketersediaan data yang tinggi. Proses ini tidak dapat dicapai sepenuhnya tanpa menyebutkan Sharding di MongoDB.
Apa itu Sharding di MongoDB
MongoDB dirancang dengan cara yang fleksibel sehingga dapat diskalakan untuk Anda jalankan dalam kluster di seluruh platform terdistribusi. Dalam platform ini, data didistribusikan di sejumlah server untuk penyimpanan. Proses inilah yang disebut sebagai sharding. Jika satu server dikenai sejumlah besar data untuk penyimpanan, Anda mungkin kehabisan ruang penyimpanan. Selain itu, operasi throughput yang sangat kritis seperti membaca dan menulis dapat terpengaruh secara luas. Fitur penskalaan horizontal di MongoDB memungkinkan kami mendistribusikan data ke beberapa mesin dengan hasil akhir meningkatkan penyeimbangan beban.
Pecahan MongoDB
Shard dapat dianggap sebagai kumpulan replika yang menampung beberapa subset data yang digunakan dalam sharded cluster. Untuk instance mongod tertentu dengan beberapa kumpulan data, data dibagi dan didistribusikan ke sejumlah database dalam hal ini pecahan. Pada dasarnya, sejumlah pecahan yang berbeda berfungsi sebagai basis data independen tetapi secara kolektif mereka membentuk basis data logis. Pecahan mengurangi beban kerja yang harus dilakukan oleh seluruh database dengan mengurangi jumlah operasi yang harus ditangani oleh pecahan selain lebih sedikit jumlah data yang akan dihosting oleh pecahan ini. Metrik ini memberikan ruang untuk perluasan cluster secara horizontal. Arsitektur sharding sederhana ditunjukkan di bawah ini.
Data yang dikirim dari aplikasi klien dicegat oleh driver server dan kemudian diumpankan ke router. Router kemudian akan berkonsultasi dengan konfigurasi server untuk menentukan di mana menerapkan operasi baca atau tulis di server shard. Singkatnya, untuk operasi seperti menulis, ia memiliki beberapa indeks yang akan menentukan pecahan mana yang merupakan catatan untuk menjadi tuan rumah. Katakanlah database memiliki kapasitas data 1TB yang didistribusikan ke 4 shard, setiap shard akan menampung 256GB data ini. Dengan pengurangan jumlah data yang dapat ditangani oleh shard, operasi dapat dilakukan dengan cukup cepat. Anda harus mempertimbangkan untuk menggunakan sharded cluster di database Anda saat:
- Anda memperkirakan jumlah data akan melebihi kapasitas penyimpanan instans tunggal Anda di masa mendatang.
- Jika operasi tulis gagal dilakukan oleh instance MongodB tunggal
- Anda kehabisan RAM Memori Akses Acak dengan mengorbankan peningkatan ukuran set kerja aktif.
Sharding hadir dengan peningkatan kompleksitas dalam arsitektur selain sumber daya tambahan. Namun, disarankan untuk melakukan sharding pada tahap awal sebelum data Anda bertambah karena cukup melelahkan untuk melakukannya saat data Anda melebihi kapasitas.
Kunci Pecahan MongoDB
Seperti yang kita semua tahu, dokumen di MongoDB memiliki bidang untuk menyimpan nilai. Saat Anda menerapkan sharding, Anda akan diminta untuk memilih bidang dari koleksi yang akan Anda gunakan untuk membagi data. Bidang yang Anda pilih ini adalah kunci pecahan yang menentukan bagaimana Anda akan membagi dokumen dalam koleksi di sejumlah pecahan. Dalam contoh sederhana, data Anda mungkin memiliki nama bidang siswa, guru kelas, dan nilai. Anda dapat memutuskan satu set pecahan untuk memuat dokumen dengan siswa indeks, satu lagi guru, dan nilai. Namun, Anda mungkin memerlukan data Anda untuk didistribusikan secara acak oleh karena itu gunakan kunci pecahan yang di-hash. Ada berbagai kunci pecahan yang digunakan dalam memisahkan data selain kunci pecahan yang di-hash tetapi dua kategori utama adalah bidang terindeks dan bidang gabungan terindeks.
Memilih Kunci Pecahan
Untuk fungsionalitas, kemampuan, dan kinerja strategi sharding yang lebih baik, Anda harus memilih kunci sharding yang sesuai. Kriteria pemilihan bergantung pada 2 faktor:
- Struktur skema data Anda. Misalnya, kita dapat mempertimbangkan bidang yang nilainya dapat meningkat atau menurun (berubah secara monoton). Ini kemungkinan besar akan memengaruhi distribusi sisipan ke satu shard dalam sebuah cluster.
- Bagaimana konfigurasi kueri Anda ditampilkan untuk melakukan operasi penulisan.
Apa yang dimaksud dengan Kunci Shard yang Di-Hash
Ini menggunakan indeks hash dari satu bidang sebagai kunci pecahan. Indeks hash adalah indeks yang memelihara entri dengan hash dari nilai bidang yang diindeks.yaitu
{
"_id" :"5b85117af532da651cc912cd"
}
Untuk membuat indeks hash, Anda dapat menggunakan perintah ini di mongo shell.
db.collection.createIndex( { _id: hashedValue } )
Di mana variabel hashedValue mewakili string dari nilai hash yang Anda tentukan. Sharding yang di-hash mempromosikan distribusi data yang merata di seluruh cluster yang di-shard sehingga mengurangi operasi target. Namun, dokumen dengan kunci shard yang hampir sama mungkin tidak mungkin berada di shard yang sama sehingga memerlukan instance mongo untuk melakukan operasi siaran dalam memenuhi kriteria kueri yang diberikan.
Kunci Shard Berbasis Rentang
Dalam kategori ini, kumpulan data dipartisi berdasarkan rentang nilai dari kunci bidang yang dipilih sehingga rentang partisi yang tinggi. Yaitu. jika Anda memiliki kunci numerik yang nilainya berjalan dari tak terhingga negatif hingga tak terhingga positif, setiap kunci pecahan akan jatuh pada titik tertentu dalam garis itu. Baris ini dibagi menjadi potongan-potongan dengan setiap potongan memiliki rentang nilai tertentu. Tepatnya, dokumen-dokumen dengan kunci pecahan yang hampir mirip di-host di potongan yang sama. Keuntungan dengan teknik ini adalah mendukung berbagai kueri karena router akan memilih shard dengan potongan tertentu.
Karakteristik dari Shard Key yang Optimal
- Kunci shard yang ideal harus dapat menargetkan satu shard untuk meningkatkan program mongos untuk mengembalikan operasi kueri dari satu instance mongod. Kuncinya adalah bidang utama mencirikan ini. Yaitu. tidak dalam dokumen yang disematkan.
- Memiliki tingkat keacakan yang tinggi. Artinya, bidang tersebut harus tersedia di sebagian besar dokumen. Ini akan memastikan operasi tulis didistribusikan dalam shard.
- Mudah dibagi. Dengan kunci pecahan yang mudah dibagi, ada peningkatan distribusi data sehingga lebih banyak pecahan.
Komponen Penyebaran Klaster Produksi
Mengenai arsitektur yang ditunjukkan di atas, cluster shard produksi harus memiliki:
- Mongos/ Router kueri. Ini adalah instance mongo yang bertindak sebagai server antara driver aplikasi dan database itu sendiri. Dalam penerapan, penyeimbang beban dikonfigurasi untuk mengaktifkan koneksi dari satu klien untuk mencapai mongos yang sama.
- Pecahan. Ini adalah partisi di mana dokumen yang berbagi definisi kunci pecahan yang sama dihosting. Anda harus memiliki minimal 2 untuk meningkatkan ketersediaan data.
- Server Konfigurasi:Anda dapat memiliki 3 server konfigurasi terpisah di mesin yang berbeda atau sekelompok dari mereka jika Anda akan memiliki beberapa kluster sharding.
Penerapan Cluster Sharded
Langkah-langkah berikut akan memberi Anda arah yang jelas untuk menerapkan kluster sharding Anda.
-
Membuat host untuk server konfigurasi. Secara default, file server tersedia di direktori /data/configdb tetapi Anda selalu dapat mengaturnya ke direktori pilihan Anda. Perintah untuk membuat direktori data adalah:
$ mkdir /data/configdb
-
Mulai server konfigurasi dengan menentukan port dan jalur file untuk masing-masing menggunakan perintah
$ mongod --configsvr --dbpath /data/config --port 27018
Perintah ini akan memulai file konfigurasi di direktori data dengan nama config pada port 27018. Secara default semua server MongoDB berjalan pada port 27017.
-
Mulai instance mongos menggunakan sintaks:
$ mongo --host hostAddress --port 27018.
Variabel hostAddress akan memiliki nilai untuk nama host atau alamat ip host Anda.
-
Mulai mongod di server shard dan mulai menggunakan perintah:
mongod --shardsvr --replSet rs.initiate()
-
Mulai mongos Anda di router dengan perintah:
mongos --configdb rs/mongoconfig:27018
-
Menambahkan pecahan ke cluster Anda. Katakanlah kita memiliki port default menjadi 27017 sebagai cluster kita, kita dapat menambahkan shard pada port 27018 seperti ini:
mongo --host mongomaster --port 27017 sh.addShard( "rs/mongoshard:27018") { "shardAdded" : "rs", "ok" : 1 }
-
Aktifkan sharding untuk database menggunakan nama shard dengan perintah:
sh.enableSharding(shardname) { "ok" : 1 }
Anda dapat memeriksa status pecahan dengan perintah:
sh.status()
Anda akan diberikan informasi ini
sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("59f425f12fdbabb0daflfa82") } shards: { "_id" : "rs", "host" : "rs/mongoshard:27018", "state" : 1 } active mongoses: "3.4.10" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no NaN Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : shardname, "primary" : "rs", "partitioned" : true }
Shard Balancing
Setelah menambahkan pecahan ke cluster, Anda mungkin mengamati bahwa beberapa pecahan mungkin masih menampung lebih banyak data daripada yang lain dan untuk lebih memotong, pecahan baru tidak akan memiliki data. Oleh karena itu Anda perlu menjalankan beberapa pemeriksaan latar belakang untuk memastikan keseimbangan beban. Balancing adalah dasar untuk mendistribusikan kembali data dalam sebuah cluster. Penyeimbang akan mendeteksi distribusi yang tidak merata sehingga memindahkan potongan dari satu pecahan ke pecahan lain hingga kuorum keseimbangan tercapai.
Proses penyeimbangan menghabiskan banyak bandwidth selain overhead beban kerja dan ini akan memengaruhi pengoperasian database Anda. Proses penyeimbangan yang lebih baik melibatkan:
- Memindahkan satu bongkahan pada satu waktu.
- Lakukan penyeimbangan saat ambang migrasi tercapai, yaitu saat perbedaan antara jumlah potongan terendah untuk koleksi tertentu dan jumlah potongan tertinggi dalam koleksi yang di-shard.