Sunday, September 22, 2013

MongoDB Part 3: Autosharding


Pada bagian tiga ini, saya akan coba menjelaskan tentang teknik sharding di MongoDB. Tapi sebelum itu, jika Anda belum tahu mengenai database ini, Anda dapat membaca dulu bagian I dan bagian II di Bisakomputer.

Sharding ini mengacu pada pembagian data ke beberapa komputer dengan porsi yang berbeda. Istilah lainnya mengenai sharding sama dengan partioning. Setiap penyimpanan data baik itu relational database maupun database NoSQL, akan selalu menyediakan fitur partioning data, ini beralasan karena dengan teknik ini dapat meningkatkan performanceavailability dan manageability data store.

Seperti yang saya katakan diawal artikel (bagian I), arsitektur MongoDB telah dirancang untuk kemudahan penerapan teknik ini. Sharding mongodb lebih dikenal dengan autosharding, ini karena beberapa urusan administrative telah otomatis dilakukan oleh mongodb, seperti menangani pembagian data ke beberapa cluster dan mengotomatisasi rebalancing data.

Arsitektur

Konsep dasar dari sharding adalah memisahkan collection ke dalam bagian-bagian kecil yang disebut chunksChunks ini kemudian didistribusikan ke server cluster yang disebut sebagai shard. Dengan begini masing-masing shard bertanggung jawab terhadap subset data yang disimpan. Setiap shard dapat direpresentasikan sebagai mesin dengan koneksi ke satu atau lebih service mongo (mongod). Dari sini tentunya kita berpikir bahwa akan ada lebih dari satu service mongod yang dibuat, sehingga pertanyaannya adalah client harus terkoneksi ke mana untuk mengambil dan store data?.

Dalam mengembangkan sebuah aplikasi, kita dapat men-setup aplikasi untuk langsung koneksi ke service MongoDB. Namun, dengan melakukan sharding, koneksi tidak secara langsung kepada tiap service. Menghubungkan aplikasi dengan shards cluster, bisa dilakukan dengan proses routing yang dinamakan dengan mongos (Gambar 2).

Gambar 1
men-setup aplikasi untuk langsung koneksi ke service MongoDB
Gambar 2
Menghubungkan aplikasi dengan shards cluster

mongos process dapat juga dikatakan sebagai abstraksi koneksi ke shards cluster. Client terkoneksi ke mongos yang kemudian diteruskan ke shards. Developer tidak perlu memikirkan perbedaan proses mongos dan mongod, karena dalam level development aplication mereka memiliki bentuk yang sama, sehingga tidak perlu mengganti kode aplikasi ketika memutuskan untuk scale up database.

Ada beberapa manfaat yang bisa diambil dengan melakukan teknik ini, diantaranya adalah:
  • Dengan teknik ini, Anda dapat merencanakan ukuran media penyimpanan data pada tiap shard yang Anda miliki.
  • Menulis data akan lebih cepat daripada hanya pada satu mongod.
  • Proporsi data yang bisa disimpan dimemori bisa lebih banyak, ini tentunya akan menambah performa pemrosesan data.

Setting Up Sharding

Ada tiga hal yang harus kita ketahui untuk menerapkan sharding database ini:
1. Shard
Seperti yang sudah saya sebutkan diatas, tiap server yang menyimpan bagian-bagian collection(chunks) disebut sebagai shard. Tiap shard bisa memiliki satu mongod atau mungkin bisa lebih dari itu. Walaupun bisa lebih dari satu mongod, tetap saja yang dijadikan master hanya satu, mongod-mongod yang lain hanya digunakan sebagai slave jika sewaktu-waktu terjadi trouble pada master-nya (replica set).
2. Mongos
mongos berfungsi sebagai proses route request dan kemudian mengumpulkan responses untuk client. Bagian ini tidak dapat menyimpan data, sehingga konfigurasi nantinya disimpan pada config server.
3. Config server
Pada config server ini, mongos akan berpedoman. mongos akan membaca ini tiap kali ada read dan write operation database.

Komponen
Komponen

Menjalankan mongos process

Pertama yang kita butuhkan adalah membuat config server. Ini perlu Anda buat terlebih dahulu karena mongos akan membaca konfigurasi yang Anda tulis disana. Untuk membuatnya sama seperti kita membuat proses mongod biasa:
$ mkdir -p ~/dbs/config$ ./mongod --dbpath ~/dbs/config --port 20000
Config server ini tidak banyak membutuhkan space data, estimasinya hanya butuh 1KB untuk tiap 200MB data. Setelah config server ini dibuat, kemudian Anda dapat membuat proses mongos dengan memakai konfigurasi ini.
$ ./mongos --port 30000 --configdb localhost:20000
Proses mongos dan config server-nya berjalan pada mesin yang sama. Mongos berjalan pada port 30000, sedangkan config server berada pada port 20000. Anda pun dapat membuat beberapa config server dan kemudian menjalankan proses mongos dengan multi config server tersebut. Untuk tahap production, disarankan menjalankan mongos ini dengan beberapa config server, karena jika salah satu down maka client masih bisa membaca dan menulis data.

Menambahkan shard ke mongos process

Pada praktek sesungguhnya tentunya kita sudah memiliki mesin-mesin lain yang siap kita jadikan shard cluster. Tapi pada praktek yang ditunjukkan ini, semuanya masih berjalan pada satu mesin lokal. Disini misal saya memiliki sebuah proses mongod yang juga saya jalankan pada komputer lokal.
$ mkdir -p ~/dbs/shard1 
$ ./mongod --dbpath ~/dbs/shard1 --port 10000
Proses mongod yang saya buat berjalan pada port 10000 dan semua berkas datanya diletakkan pada direktori ~/dbs/shard1, sehingga untuk menjadikannya salah satu dari shards cluster mongos adalah sebagai berikut:
Pertama pergi ke shell javascript mongos, pada contoh mongos berada pada port 30000.
$ ./mongo localhost:30000/admin 
MongoDB shell version: 1.6.0 
url: localhost:30000/admin 
connecting to localhost:30000/admin 
type "help" for help>
Kemudian jalankan perintah untuk memasukkan proses mongod pada port 10000 sebagai shards cluster.
> db.runCommand({addshard : "localhost:10000", allowLocal : true}) 
{"added" : "localhost:10000","ok" : true}
"allowLocal" berarti shard yang saya tambahkan boleh pada mesin yang sama dengan mongos process. Key ini sangat membantu ketika masih tahap development. Tapi ketika sudah sampai tahap production, Anda seharusnya sudah memiliki proses mongod yang berjalan pada mesin lain. Dengan command "addshard" seperti pada contoh diatas, Anda dapat menambahkan semua proses mongod yang Anda punya pada proses mongos.

Sharding Data

MongoDB tidak secara otomatis memecah data dan mendistribusikannya. Anda masih dapat menentukan data pada collection mana yang dapat dipecah dan di store ke cluster. Untuk menentukan itu bisa menjalankan perintah "enablesharding" pada database yang Anda punya dan perintah "shardcollection" pada collectionnya. Semisal saya menginginkan data yang ada di collection "book" dengan database "office" bisa dipartisi sesuai dengan "_id" nya
> db.runCommand({"enablesharding" : "office"}) 
> db.runCommand({"shardcollection" : "office.book", "key" : {"_id" : 1}})
Dengan perintah diatas, collection "book" akan dipartisi berdasar "_id" nya. Ketika saya menambahkan data pada collection tersebut maka secara otomatis partisi data akan dilakukan oleh MongoDB.

Demikian artikel ini berakhir, masih banyak tips-tips bagus mengenai sharding mongodb. Informasi lebih lengkap mengenai sharding Mongodb dapat anda baca pada link berikut ini.

Artikel ini pernah dimuat di BisaKomputer.com tertanggal 22 Juli 2012

No comments:

Post a Comment