3 Mayıs 2017 Çarşamba

Mongodb Replica Set

Merhaba arkadaşlar,

Bugün sizlere mongodb de replica set nedir,ve nasıl yapılır onu göstereceğim.

Öncelikle replica set;cluster olarak bulunan database sunucularının senkronize şekilde çalışmasıdır. İlk önce database sunucuları arasında 1 tane Primary(Master) sunucu belirtilir diğer sunucular ise secondary(Slave)'dir ve ayrıca bir tane Arbiter sunucu vardır. Arbiter üye hiçbir şekilde veri işlemi yapmaz sadece Primary üye seçimi yapılırken seçmen sayısının tek sayının katı olması için vardır. Yani sadece seçim işleminde rol oynar. Replica Set üye sayısı tek sayı olmalıdır.  Primary sunucu bir şekilde down olursa diğer secondary sunucular kendi aralarında seçim yaparak bir tanesini Primary sunucu belirler. Genelde okuma işlemleri primary sunucudan yapılır ama bu isteğe göre değiştirilip secondary üyelerden de okuma işlemi yapılabilir. Primary sunucuya gelen yazma işlemlerini, primary sunucu oplog'a yazarak secondary sunucularda buradan veriyi okuyarak kendi databaselerine yazar. Doğrudan secondary databaselere veri yazamazsınız. Primary database durduğunda diğer database sunucularından bir tanesi otomatik olarak devreye girerek sistem kaldığı yerden aynı şekilde çalışmaya devam eder. Gel gelelim biz bu işlemi mongodb de ve kendi bilgisayarımızda nasıl gerçekleştireceğiz.

Öncelikle şu bağlantıya girerek mongodb nasıl kurulur öğreniyoruz ;

https://gumusburak.wordpress.com/2014/10/12/windows-uzerinde-mongodb-kurulumu/

DİKKAT ! Yalnız kurulumda birinci resimden sonrasını yapmayalım Replica Set için şuanlık. Daha sonradan MongoDB'yi auto start haline getiririz.

İlk önce komut satırımızı açıyoruz.
C:\MongoDB>bin\mongod --dbpath data\data1 --port 27021 --replSet mySet

şeklinde konsol ekranına kodumuzu yazıyoruz ve enter'a basıyoruz en altta bir problem çıkmadıysa "waiting for connection on port 27017" şeklinde bilgi mesajı yazar. Yalnız buradaki yollara dikkat edelim ben kendi bilgisayarımdaki yolları verdim.

Daha sonra yeni bir konsol ekranı açıyoruz ve ya varsa RoboMongo,Mongovue toolunu kullanabilirsiniz MongoDB için.Yalnız bir önceki konsolu kapatmayın açık dursun kapatırsanız DB'ye erişim sağlayamazsınız.

Yeni konsol ekranına aşağıdaki kodu yazarak oluşturmuş oldugumuz DB'ye bağlanıyoruz.
C:\MongoDB>bin\mongo --port 27021

şeklinde bağlanıyoruz.

Bu sunucu bizim Primary sunucumuz olacağı için bu sunucumuzu primary olarak belirtmemiz gerekmekte onun içinde aşağıdaki kodu yazıyoruz.
rs.initiate();

Cevap olarak bize problem yoksa aşağıdaki gibi mesaj dönecektir.
 {
"info2" : "no configuration explicitly specified -- making one",
"me" : "DESKTOP-U223FLP:27021",
"ok" : 1
}

Sunucumuzun Primary olup olmadığını kontrol etmek için ise aşağıdaki kodu yazıyoruz.
rs.status();

members array'i altında stateStr alanı PRIMARY ise ilk sunucumuz Primary olmuş demektir.
{
"set" : "mySet",
"date" : ISODate("2017-05-03T21:00:57.905Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "DESKTOP-U223FLP:27021",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 481,
"optime" : Timestamp(1493845155, 1),
"optimeDate" : ISODate("2017-05-03T20:59:15Z"),
"electionTime" : Timestamp(1493845155, 2),
"electionDate" : ISODate("2017-05-03T20:59:15Z"),
"configVersion" : 1,
"self" : true
}
],
"ok" : 1
}

Şimdi secondary databaseleri oluşturalım.

2 yeni komut satırı daha açıyoruz. Ve aşağıdaki gibi diğer 2 database sunucusunu oluşturuyoruz. replSet isimlerini değiştirmiyoruz. Primary sunucuda ne kullandıysak aynısını kullanacağız.
C:\MongoDB>bin\mongod --dbpath data\data2 --port 27022 --replSet mySet

C:\MongoDB>bin\mongod --dbpath data\data3 --port 27023 --replSet mySet

2 farklı komut satırında yukarıdaki komutları çalıştırdıysak yine başarılı şekilde bittiyse en altta "waiting for connections on port 2702.." şeklinde mesaj yazar.

Şimdi gelelim secondary sunucularımızı primary sunucuya tanıtmaya.Öncelikle primary sunucuya bağlanıyoruz. Aslında yukarıda bağlanmıştık kendisi primary yaparken falan eğer konsolu kapatmadıysanız oradan devam edebilirsiniz veya yeni bir komut satırı açabilirsiniz.
mySet:PRIMARY> rs.add('DESKTOP-U223FLP:27022');

olarak yazıyoruz fakat burada dikkat etmeniz gereken kural porttan önce bilgisayar adınızı yazmanızdır. Eğer hiç bir problem yok ise aşağıdaki gibi
{ "ok" : 1 }

mesajını verecektir. Hemen diğer sunucuyuda tanıtalım
mySet:PRIMARY> rs.add('DESKTOP-U223FLP:27023');

yine mesaj olarak { "ok" : 1 } cevabını aldım.

Şimdi gerçekten yukarıdaki database sunucularım secondary olmuş mu önce onları bir kontrol edeyim. aşağıdaki komutu çalıştırıyorum.
rs.status();

Cevap olarak
{
"set" : "mySet",
"date" : ISODate("2017-05-03T21:21:18.900Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "DESKTOP-U223FLP:27021",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1702,
"optime" : Timestamp(1493846249, 1),
"optimeDate" : ISODate("2017-05-03T21:17:29Z"),
"electionTime" : Timestamp(1493845155, 2),
"electionDate" : ISODate("2017-05-03T20:59:15Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "DESKTOP-U223FLP:27022",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 332,
"optime" : Timestamp(1493846249, 1),
"optimeDate" : ISODate("2017-05-03T21:17:29Z"),
"lastHeartbeat" : ISODate("2017-05-03T21:21:17.261Z"),
"lastHeartbeatRecv" : ISODate("2017-05-03T21:21:18.788Z"),
"pingMs" : 0,
"syncingTo" : "DESKTOP-U223FLP:27021",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "DESKTOP-U223FLP:27023",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 229,
"optime" : Timestamp(1493846249, 1),
"optimeDate" : ISODate("2017-05-03T21:17:29Z"),
"lastHeartbeat" : ISODate("2017-05-03T21:21:17.267Z"),
"lastHeartbeatRecv" : ISODate("2017-05-03T21:21:17.290Z"),
"pingMs" : 0,
"configVersion" : 3
}
],
"ok" : 1
}

yukarıdaki gibi bir sonuç döndü görmüş olduğunuz gibi 2 tane secondary ve  tane primary database sunucum mevcut. Fakat secondary database sunucularımla henüz tam işim bitmedi hemen onlarada bağlanıp onların slave olduğunu söylemem gerekmekte. Sırayla girip aşağıdaki kodu iki secondary sunucumda çalıştırıyorum.
mySet:SECONDARY> rs.slaveOk();

Mesaj olarak geriye bir şey dönmeyecektir.

Şimdi gelelim bu replica set mimarimizi test etmeye.
mySet:PRIMARY>  db.test.insert({name:'Replica Set Testi'});

Şeklinde primary database'ime bir kayıt ekliyorum ve ardından tekrar primary database'nde select çekip kayıdın gelip gelmediğini kontrol ediyorum.
mySet:PRIMARY> db.test.find();

Yukarıdaki gibi sorgumu yazdım ve aşağıdaki gibi kayıt geldi.
{ "_id" : ObjectId("590a4ba6a4ba2414af09b658"), "name" : "Replica Set Testi" }

Aynı sorguyu gidip diğer secondary database sunucularımda çekiyorum.
mySet:SECONDARY> db.test.find();

veee sonuuuçç :)
{ "_id" : ObjectId("590a4ba6a4ba2414af09b658"), "name" : "Replica Set Testi" }

Diğer secondary database sunucularımda da aynı kayıt geldi artık database'im çökerse datalarım ne olacak gibi bir problemimiz olmayacak. Hatta test etmek isterseniz primary sunucuyu durdurun diğer secondary üyelerden hemen bir tanesi Primary olarak çalışmaya devam edecektir.

Ayrıca

MongoDB1.bat
bin\mongod --dbpath data\data1 --port 27021 --replSet mySet

MongoDB2.bat
bin\mongod --dbpath data\data2 --port 27022 --replSet mySet

MongoDB3.bat
bin\mongod --dbpath data\data3 --port 27023 --replSet mySet

MongoDB.vbs
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\MongoDB\MongoDB1.bat", 0, False
WshShell.Run "C:\MongoDB\MongoDB2.bat", 0, False
WshShell.Run "C:\MongoDB\MongoDB3.bat", 0, False

dosyalarına yazarak , mongoDB.vbs dosyasına çift tıklayarak tüm databaseleri tek tuşla ayağa kaldırabilirsiniz. Dilerseniz MongoDB.vbs dosyasınıda task scheduler'a on start windows özelliğinde tanımlayarakta her bilgisayar açılışında otomatik ayağa kaldırabilirsiniz.

ve son olarak primary sunucu üzerinde hangi sunucunun primary olması gerektiğini söyleyebilirsiniz

Örneğin 2'nolu sunucu Primary olsun.
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 1
cfg.members[2].priority = 0.5
rs.reconfig(cfg)

 

umarım yardımcı olmaya çalışmışımdır.

teşekkürler.

JavaScript

JavaScript Nedir?    JavaScript web tabanlı bir programlama dilidir. Mayıs 1995 yılında Brendan Eich tarafından tasarlanmıştır. Kullanıcı et...