DevVeri.com

Boğulacaksan büyük veride boğul!

MongoDB’de Sharding

Sharding, büyük miktarda veriyi yönetebilmek amacıyla parçalara ayırmak ve bu parçalar üzerinden kullanmak diyebiliriz. MongoDB’nin güzel özelliklerinden birisi de sharding kabiliyeti. MongoDB’de shard yapabilmek için mongos, config server ve shard’lara ihtiyaç vardır.

Shards

İçinde datayı barındıran mongod processleridir. Mongos’un yönlendirmesi ile datalar farklı shardlara bölünür ve chunklar şeklinde herbir shard’da farklı datalar bulunur.

Mongos

Mongos, router gibi çalışarak gelen isteklerin nereye yönlendirileceğini belirleyen ve client’lara veri dönmeden önce farklı shardlardan aldığı verileri merge eden bir process’dir.

Mongos herhangi bir data tutmadığı için persist state’ı bulunmamakta, bu yüzden config server’a ihtiyaç duymaktadır.

Config Server

Cluster’ın metadatasını tutan mongod instance’ı dır. Shardları ve her shard’da ki chunkların bilgisini tutar.

200MB için 1KB şeklinde yer ayırmak önerilmektedir.

Geliştirme ortamı için 1 adet, gerçek ortam için minimum 3 adet config server bulunması gerekmektedir (3, 5, 7 şeklinde olmalı).

Örnek Kurulum

Örnek; 2 mongos, 2 shard ve 1 config server, 2 sanal sunucu üzerine kurularak yapılmıştır.

Öncelikle, shard instanceları aşağıdaki şekilde çalıştırılır. Bu işlem her sunucuta tek tek yapılmalıdır.

$ mongod --shardsvr --port 27018 > /var/log/mongo/mongod.log &

Shardlar ile birlikte mongos processini başlatmadan önce config serverların da çalıştırılması gerekiyor. Bunu da aşağıdaki şekilde yapmak mümkün. Sadece bir tane config server olacağı için aşağıdakini tek bir sunucuda yapmamız yeterli olacaktır.

$ mongod --configsvr --port 27019 --dbpath /data/db/config > /var/log/mongo/config.log &

Config ve Shard processleri hazır olduktan sonra mongos processini çalıştırmamız gerekiyor. Config serverda tanımlanıcak olan shard serverlar için router görevi görecek.

Normal şartlarda Mongos serverin bir adet olması yeterli olacaktır fakat bunu da her ihtimale karşı birden fazla sunucu çalıştırarak “single point of failure” durumunu azaltmış oluyoruz. Birden fazla Mongos kullanıldığı durumda netscaler seviyesinde yönlendirme yapmak veya programatik olarak mongos’lar arasinda yönlendirme (balancing) yapmak gerekli.

$ mongos --configdb host1.myhost.net:27019,host2.myhost.net:27019 > /var/log/mongo/mongos.log &

Bütün herşeyin çalışır olduğundan emin olduktan sonra ayarlarımızı girmeye başlıyoruz. Mongos’lardan bir tanesine bağlanarak aşağıdakileri yazıyoruz. Mongos’a bağlanmak için mongos’un kurulu olduğu sunucuya mongos’a verdiğiniz port ile bağlanmanız yeterli.

Mongos’da ayarları yapabilmek için admin database’ini kullanmanız gerekiyor. “use admin” komutu ile admin database’ine geçiş yapabilirsiniz.

$ # mongos için default port kullandığımız için port belirtmeden mongos’a bağlanmış oluyoruz

$ mongo

> use admin

> db.runCommand( {addShard : "host1.myhost.net:27018"} );

{"ok" : 1 , "added" : "host1.myhost.net:27018"}

> db.runCommand( {addShard : "host2.myhost.net:27018"} );

{"ok" : 1 , "added" : "host2.myhost.net:27018"}

Cluster hazır olduktan sonra, hangi database’in hangi collectionını shard edeceğimizi girmemiz gerekiyor. Bu adımdan sonra, collection shard edilmeye başlanmış oluyor.

> db.runCommand( { enablesharding: "test_database"} );

{ "ok" : 1 }

> db.runCommand( { shardcollection : "test_database.myCollection", key : {"_id" :1} })

{ "collectionsharded" : "test_database.myCollection", "ok" : 1 }

Processler aynı sunucuda olduğu için farklı portlar ve farklı –dbpath parametreleri ile çalıştırıyoruz. Böylelikle bir mongodb sunucusu üzerinde shard edilmiş yada edilmemiş farklı collectionlar da bulunabilir.

shardcollection komutunu çalıştırırken verdiğimiz key parametresi collection’ı neye göre shard edeceğimizi gösteriyor. Shard’ın düzgün çalışması için, collection içindeki bütün dökümanlarda geçen bir key seçilmesi gerekiyor.

, ,

3 thoughts on “MongoDB’de Sharding

  • Hakan İlter dedi ki:

    MongoDB’de bu konfigürasyonları yapmak biraz karışık. Bu değerli bilgiler için teşekkürler.

  • fethi dedi ki:

    merhaba. makaleniz için çok teşekkür ederim.
    ancak bir sorum olacaktır.
    benim mevcut mongo db deki bir collecionu nasıl shard edebilirim.

    veritabanımı iki shard servera koymam mı gerekecek.

  • Mehmet dedi ki:

    Merhebalar, “Birden fazla Mongos kullanıldığı durumda netscaler seviyesinde yönlendirme yapmak veya programatik olarak mongos’lar arasinda yönlendirme (balancing) yapmak gerekli.” demişsiniz. Peki balancing işlemini biz mi yönetmeliyiz mongodb otomatik yapmıyormu?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.