mongoDB Replikasyon ve Failover

Merhaba

Bu yazıda mongoDB veri tabanı sisteminin replikasyon ve failover özelliklerinin kullanımı anlatılacaktır. MongoDB üzerinde replikasyon ve failover ayarlarının yapılandırılması oldukça basittir.

Benim replikasyona ihtiyaç durma nedenlerim arasında en önemli madde, yoğun trafik oldu. Şu anda üzerinde çalıştığım güvenlik projesinde saniyede ortalama 100’den fazla veri kayıdı yapılması gerekmekte. Başka bir taraftansa bu veriler üzerinde analiz (Select) sorgusu yapmak durumundayım. Bu saniyede 100’den fazla INSERT işlemi, analiz için kulanacağım algoritmaya göre dakikada 5000’e varan SELECT işleminin aynı mongoDB sunucusu üzerinde olacağı anlamına gelmekte.

Bu kadar R/W işlemini aynı sunucu üzerinde kaldırabilmek için ciddi bir iş gücü oluşuyor. Bu nedenle ben kararımı değiştirerek bir adet Master sunucu kurup tüm Write işlemlerini buraya alıp, bu sunucuyu Slave ile replikasyon ayarlarını gerçekleştirerek tüm Read işlemlerini ikinci bir sunucuda gerçekleştirme kararı aldım. Bunun yanında ise herhangi bir durumda Primary sunucuda gelecek servis dışı kalma durumunda tüm süreci anında Secondary sunucu ele alarak Write işlemlerinin aksamasının önüne geçmiş olmaktayız.

Master – Slave ve Heartbeat

Aşağıdaki resimde 3 adet sunucu bulunmaktadır. A ve B sunucuları birbiri ile aynı datayı içerek olan mongoDB sunucuları, C sunucusu ile herhangi bir veri tutmayacak ama A ve B arasında hakemlik yapacak başka bir mongoDB sunucu olarak tasarlanmıştır.

replika set

 

Eğer herhangi bir durumda A sunucusu serviş dışı kalırsa bunu heartbeat ile tespit etme görev C hakem sunucusundadır. C sunucusu ana sunucu olan A sunucusunun servis dışı kaldığını fark ettiği anda B sunucusuna gidip “Sen artı Primary oldun!” demektedir. A sunucusuna erişim tekrar sağlandığında ise C sunucusuna tekrar gidip “Primary geldi. Sen tekrardan Secondary’sin” diyerek hakemlik yapmaktadır.

mongoDB Konfigürasyonu

Bu durumu development ortamında simüle etmek için farklı portlarda çalışan mongoDB servislerine ihtiyaç vardır. 3 farklı mongodb servisi bu klasörlere veri yazma işlemi gerçekleştirecektir.

cd /tmp
mkdir mongodb_replikasyon
cd mongodb_replikasyon
mkdir db1
mkdir db2
mkdir db3

Klasör oluşturma işlemi tamamlandıktan sonra aşağıdaki komut ile 3 farklı mongoDB sunucusu çalıştırılmalıdır.

$ mongod --dbpath ./db1/ --port 30000 --replSet "demo"
$ mongod --dbpath ./db2/ --port 40000 --replSet "demo"
$ mongod --dbpath ./db3/ --port 50000 --replSet "demo"

Bu işlem tamamlandıktan sonra Primary DB olarak görev yapacak 30000 portunda çalışan mongoDB’ye bağlanılarak aşağıdaki javascript tanımlaması gerçekleştirilmelidir.

:> var demoConfig = { _id: "demo", members: [{ _id:0, host: 'localhost: 30000', priority: 10}, {_id:1, host: 'localhost: 40000'}, {_id:2, host: 'localhost: 50000', arbiterOnly: true}]};
:> 
:> demoConfig
{
	"_id" : "demo",
	"members" : [
		{
			"_id" : 0,
			"host" : "localhost: 30000",
			"priority" : 10
		},
		{
			"_id" : 1,
			"host" : "localhost: 40000"
		},
		{
			"_id" : 2,
			"host" : "localhost: 50000",
			"arbiterOnly" : true
		}
	]
}
:>

Bu ayarların tanımlanmasının ardından bu konfigürasyon aktif hale getirilmelidir.

> rs.initiate(demoConfig)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}

Bu komutun çalıştırılması ile birlikte, bu ayaralar tanımlanan diğer mongoDB sunucuları ilede paylaşılacaktır ve 1 dakika içerisinde mevcut terminalde enter’a basınca, shell oturumunda PRIMARY yazacaktır.

demo:PRIMARY>

 Replikasyonun Test Edilmesi

Primary sunucuda yapılan kayıtların Secondary sunucuya replike edileceğini söylemiştim.Bunun test etmek için PRIMARY sunucuya gidip bir veri girişi yapılacaktır.

demo:PRIMARY> db.mehmetince.save({'_id': 1337, 'value': 'ozgurInternet'})
demo:PRIMARY>

Aynı veri Secondary sunucuya mongoDB tarafından otomatik olarak replike edilmiştir. Secondary sunucuya bağlanıp aynı veriyi görebilirsiniz. Ufak bir değişiklik olarak, Secondary sunucuya kendisini slave olduğunun söylenmesi gerekmektedir.

demo:SECONDARY> db.setSlaveOk()
demo:SECONDARY> db.mehmetince.find()
{ "_id" : 1337, "value" : "ozgurInternet" }
demo:SECONDARY>

FailOver Test Edilmesi

Şu anda çalışmakta olan Primary sunucuyu durdurduğunuzda ise Secondary sunucu Hakem sunucu tarafında Primary olarak atanacaktır.