MongoDB Sharded Cluster Kurulumu
Daha önceki yazımda MongoDB Community Edition kurulumu ve genel olarak MongoDB Sharded Cluster bileşenlerinden söz etmiştim. Bu yazılara aşağıdan erişebilirsiniz:
MongoDB Community Edition Kurulumu
MongoDB Sharded Cluster Bileşenleri
Bu bölümde Centos Linux işletim sistemi kurulu üç ayrı makineye (mongodb1, mongodb2, mongodb3) Sharded Cluster kurulumunu inceleyeceğiz.
- Öncelikle MongoDB Community Edition Kurulumu yazımda belirttiğim şekilde her üç makinede kullanıcılar oluşturulur ve MongoDB Community Edition kurulumları gerçekleştirilir.
- Veri tabanı dosyalarının tutulacağı düzgün bir klasör yapısı oluşturmak gerekir. MongoDB bu konuda son derece esnek, istenilen şekilde klasör yapısına izin veriyor. Ben her bir sunucuda /mongodb dizini oluşturup içine shard, konfigurasyon ve log klasörlerini oluşturmayı uygun gördüm. Yapı genel olarak:
mongodb1
/mongodb
………. shA0
………. shB2
………. shC1
………. cfg0
………. logsmongodb2
/mongodb
………. shA1
………. shB0
………. shC2
………..cfg1
………. logsmongodb3
/mongodb
………. shA2
………. shB1
………. shC0
………. cfg3
………. logsBuradaki yapıyı şu şekilde özetleyebiliriz:
* shA, shB ve shC klasörleri üç ayrı shard’dır. Son eklerinde bulunan 0,1 ve 2 ise replica setleri ifade ediyor. Görüldüğü gibi her sharda ait verinin replica seti başka bir sunucuda duruyor, bu da veri kaybını en aza indirgemeyi sağlıyor. Sunuculardan biri kullanılamaz hale gelse bile diğer iki sunucu sayesinde veri kaybı olmayacaktır.
* cfg dizini konfigürasyon sunucusuna ait verileri içerecektir ve üç ayrı sunucuda da mevcuttur.
* logs dizinlerinde işlemlere ve sunuculara ait log dosyaları tutulacaktır.
* Her üç sunucuda shard’lar, birer config sunucu ve birer router bulunmaktadır. Birden fazla router sayesinde, router sorunlarında uygulamalar hizmet kesintisi yaşamadan diğer router’ları kullanabilecektir.
- Her üç makinede de aşağıdaki komutla dosya yolları ve cfg isimleri de belirtilerek konfigürasyon sunucuları oluşturulur. (mongodb1 için script)
[mongodb@mongodb1 ~]$ cd /mongodb [mongodb@mongodb1 ~]$ mongod --configsvr --dbpath cfg0 --port 26001 --fork --logpath logs/log.cfg0 --logappend
- Shard sunucuları, replica setleri ile oluşturulur. Sunucularda yukarıda belirtilen yollar kullanılmalıdır. (mongodb1 için script)
[mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shA --dbpath shA0 --logpath logs/log.shA0 --port 27500 --fork –-logappend [mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shB --dbpath shB2 --logpath logs/log.shB2 --port 27600 --fork –-logappend [mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shC --dbpath shC1 --logpath logs/log.shC1 --port 27700 --fork --logappend
- Her üç makinede de default portta (27017) router (mongos) işlemleri başlatılır.
[mongodb@mongodb1 ~]$ mongos --configdb mongodb1:26001,mongodb:26001,mongodb3:26001 --fork --logappend --logpath logs/log.mongos
- ps –ef | grep mongo komutuyla işlemlerin düzgün başladığı kontrol edilir.
Replica Set Oluşturma
Şu ana kadar gerekli işlemleri çalışır hale getirdik. Bu aşamada öncelikle replica set üyelerini ekleyeceğiz. (mongodb1 shA seti için)
[mongodb@mongodb1 ~]$ mongo --port 27500 >rs.status() { "info" : "run rs.initiate(...) if not yet done for the set", "ok" : 0, "errmsg" : "no replset config has been received", "code" : 94 } >rs.initiate({_id:"shA", members: [{"_id":0, "host":"mongodb1:27500"},{"_id":1, "host":"mongodb2:27500"},{"_id":2, "host":"mongodb3:27500"}]}) { "ok" : 1 } >rs.status() { "set" : "shA", "date" : ISODate("2016-09-25T19:16:59.040Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : [ { "_id" : 0, "name" : "mongodb1:27500", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3013, "optime" : { "ts" : Timestamp(1474831011, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2016-09-25T19:16:51Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1474831010, 1), "electionDate" : ISODate("2016-09-25T19:16:50Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "mongodb2:27500", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 19, "optime" : { "ts" : Timestamp(1474831011, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2016-09-25T19:16:51Z"), "lastHeartbeat" : ISODate("2016-09-25T19:16:58.758Z"), "lastHeartbeatRecv" : ISODate("2016-09-25T19:16:57.587Z"), "pingMs" : NumberLong(0), "syncingTo" : "mongodb1:27500", "configVersion" : 1 }, { "_id" : 2, "name" : "mongodb3:27500", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 19, "optime" : { "ts" : Timestamp(1474831011, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2016-09-25T19:16:51Z"), "lastHeartbeat" : ISODate("2016-09-25T19:16:58.757Z"), "lastHeartbeatRecv" : ISODate("2016-09-25T19:16:57.586Z"), "pingMs" : NumberLong(0), "syncingTo" : "mongodb1:27500", "configVersion" : 1 } ], "ok" : 1 }
Bu işlem shB ve shC için de yapılır (sadece bir sunucuda, shA için 27500 portu, shB için 27600 portu, shC için 27700 portu).
Görüldüğü gibi üç üyeden biri PRIMARY diğerleri SECONDARY durumdadır. Okuma ve yazma istekleri PRIMARY üyede çözülürken, SECONDARY üyelerde yedekler senkronize bir şekilde tutulur.
Shard Ekleme
Her sunucuda (PRIMARY replica üyesinin bulunduğu) aşağıdaki komutlar ile shard’lar eklenir.
[mongodb@mongodb1 ~]$ mongo mongos> sh.addShard("shA/mongodb1:27500") { "shardAdded" : "shA", "ok" : 1 } mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("27e81987jns3e8fp81fdb1") } shards: { "_id" : "shA", "host" : "shA/mongodb1:27500,mongodb2:27600,mongodb3:27700" } active mongoses: "3.2.9" : 4 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:
Son aşamadan sonra çalışır bir MongoDB Sharded Cluster yapımız oluşmuş oldu.