MongoDB Replication Kurulumu

Bu yazıda Ubuntu ortamı üzerinde MongoDB Replication Kurulumu gösterilecektir.

Ortam

HostnameIPOS VersionMongoDB VersionRamCPU
node1192.168.157.12818.04 LTS4.2 Enterprise1 GB1
node2192.168.157.12918.04 LTS4.2 Enterprise1 GB1
node3192.168.157.13018.04 LTS4.2 Enterprise1 GB1
Buradaki RAM ve CPU değerleri sadece bu yazı için tasarlanmıştır, normalde olması gerekenden çok daha düşük verilmiştir. Minimum gereksinimler için https://docs.mongodb.com/manual/administration/production-notes/ linkini inceleyiniz.

Bu ortamı sağlayabilmek için VMWare Workstation ve ssh bağlantısı için Putty ve file düzenleme işlemleri için nano (siz vi ve vim de kullanabilirsiniz) editörünü kullanacağız.

MongoDB 4.2 Enterprise kurulumu için; https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-ubuntu/
linkini kullanmanız tavsiye edilir, kullanacağımız paket mongodb’nin resmi sürümü olan mongodb-enterprise paketidir.

Sunucular Arası Bağlantı

Öncelikle sunucularımızın birbirlerini tanımaları için hosts dosyalarını düzenleyelim.
hosts dosyası /etc dizini altında mevcuttur. Değişiklik yapabilmek için ;

sudo nano /etc/hosts

Ardından diğer iki node’un ip ve hostname bilgilerini ekleyip kaydedip(CTRL+X ‘ e basıp Y tuşuna basıp ENTER diyoruz) çıkıyoruz.
Aynı işlemi diğer 2 sunucuda da gerçekleştiriyoruz.
node2 sunucusuna node1 ve node3’ün , node 3 sunucusuna ise node1 ve node2’nin bilgileriniz giriyoruz.

İşlemlerimizi yaptıktan sonra diğer sunuculara ping atıp hostname‘i çözüp çözmediğini kontrol ediyoruz.
ping atmak için;

ping node2

Replication Kurulumu

Sunucularımızın erişim konusunda sorun yaşamadığını gördükten sonra bütün sunuculardaki mongodb service’lerimizi çalıştıralım ve servicelerinin çalışır durumda olduğundan emin olalım.
Bunun için sırasıyla aşağıdaki kodları çalıştıralım;

sudo service mongod start
sudo service mongod status

Sunucularımızda mongod servicelerimiz çalışır durumda. Bundan sonraki adımda sunucular arası bağlantıda authentication sağlamak için bir key dosyası oluşturmamız gerekiyor. Bunun için PRIMARY olarak belirlediğimiz sunucudaki bir dizine bu dosyayı oluşturup bazı yetkiler vermeliyiz. -ben home dizini altında kendi kullanıcımın dizininde oluşturdum-
Sırasıyla aşağıdaki kodları çalıştıramız gerekiyor.

İlk olarak key dosyamızı oluşturuyoruz.

openssl rand -base64 741 > /home/hakan/mrepkey

Ardından dosyanın sahipliğini mongodb(mongo service’ini çalıştıran default kullanıcı, bunu değiştirdiyseniz service kullanıcınızı yazınız) kullanıcısına veriyoruz.

sudo chown mongodb:mongodb /home/hakan/mrepkey

Dosya üzerinde dosya sahibine okuma ve yazma yetkisi veriyoruz. (chmod 600)

sudo chmod 600 /home/hakan/mrepkey

Bu işlemleri tamamladıktan sonra node1 üzerinde oluşturduğumuz dosyayı diğer sunucularda belirlediğimiz bir dizine kopyalıyoruz. -ben kolay yönetilebilirlik açısındanda tavsiye edebileceğim şekilde diğer sunucularda da aynı dizine koydum-
Uzak sunucuya kopyalama için aşağıdaki kodu çalıştırıyoruz.

sudo scp /home/hakan/mrepkey hakan@node2:/home/hakan
sudo scp /home/hakan/mrepkey hakan@node3:/home/hakan

Burada kullanacağımız uzak sunucudaki kullanıcı isimi bizimki ile aynı olmak zorunda değil ben kolaylık olması için aynı yaptım.
Bağlantı kurulurken authentication sağlamak için sizden connection’ı onaylamanızı istiyor yes yazarak enter‘a basıyoruz, uzak sunucudaki kullanıcı şifresini girip işlemimizi gerçekleştiriyoruz.

Ardından node2 ve node3’e kopyaladığımız dosya üzerinde yetkisel değişikliklerimizi gerçekleştiriyoruz.

sudo chown mongodb:mongodb /home/hakan/mrepkey
sudo chmod 600 /home/hakan/mrepkey

Tekrardan node1’deki mongod’a bağlanıp ilk kullanıcımızı oluşturuyoruz. Bu kullanıcı localhost exception‘ı bozacağı için oluştururken dikkatli olmak ve tam yetkiye sahip bir kullanıcı oluşturmak gerekiyor.

use admin
db.createUser({
  user: "admin",
  pwd: "pass",
  roles: [{role: "root", db: "admin"}]
})

Kullanıcımızı sadece PRIMARY node’da oluşturduk, diğer node’larda oluşturmamıza gerek yok çünkü replication kurulurken kullanıcıda taşınmış olacak.

Şimdi mongod service’imizin configuration dosyasını inceleyelim. Eğer bir değişiklik yapmadan default ayarlarda kurulum yaptıysanız mongod.conf dosyası /etc dizini altında olacaktır. Dosyayı açıp düzenlemek için sudo nano /etc/mongod.conf kodunu çalıştırınız.

sudo nano /etc/mongod.conf

mongod.conf dosyası YAML formatında bir dosyadır. Okuması ve düzenlemesi bu sebeple kolaydır.

Replication kurulumu için ilk ihtiyacımız olan şey mongod’un dışarıdan erişilebiliyor olmasıdır. Bunun için mongod.conf dosyanın içine girip net bloğu altındaki bindIP kısmını 127.0.0.1 den 0.0.0.0‘a çevirmemiz lazım.

  bindIp: 0.0.0.0

Ardından replication configurasyonu için belirlediğimiz replication ismini dosyanın içine aşağıdaki gibi eklememiz gerekiyor.
Buradaki ismin hiç bir önemi yok kendi belirlediğiniz herhangi bir isim olabilir ancak connection kurarken kullanılacağı için amacına uygun bir isimlendirme daha doğru olacaktır. Ben mrep olarak isimlendirdim.

replication:
  replSetName: mrep

Son olarak security bloğunda key dosyası bilgisini girmemiz lazım. MongoDB’de authorization’ı enable ettiğinizde otomatik olarak authentication da enable oluyor.

security:
 authorization: enabled
 keyFile: "/home/hakan/mrepkey"

Bu değişiklikleri yapıp kaydedip çıkıyoruz.
Sonrasında mongod service’ini restart etmemiz gerekiyor, bu sayede yeni config’leri ile çalışıyor olacaktır. Sırasıyla aşağıdaki kodları çalıştırıyoruz. Bu adımları node2 ve node3 için tekrarlıyoruz.

sudo service mongod restart
sudo service mongod status

uzaktan erişimin çalıştığından emin olmak için node1 üzerinde mongo --host node2 diyip connect oluyoruz. Ardından exit deyip terminale dönüyoruz.

PRIMARY node’a bağlanıp replication sürecini başlatıyoruz.

 mongo -u admin -p pass

MongoDB’ye yeni oluşturduğumuz kullanıcı ile bağlanıp rs.initiate() kodunu çalıştırıyoruz. Herhangi bir parametre belirtmediğimiz için default ayarları ile çalışıyor.

 rs.initiate()

Diğer node’ları ekliyoruz.

 rs.add("node2:27017")
 rs.add("node3:27017")

Replication kurulmuş oluyor. rs.conf() kodunu çalıştırıp bütün nodeları görebiliyoruz. Aynı şekilde rs.status() kodunu çalıştırıp daha detaylı bilgi edinebiliyoruz.

rs.conf() çıktısı ;

rs.status() çıktısı ; -çıktının bir kısmı-

Replication Testi

Replication’ın nasıl çalıştığına bakalım.
Öncelikle node2 ve node3 üzrindeki db ve collectionlara bakalım.
Bunun için her iki sunucuyada yeni kullanıcımız ile bağlanamamız gerekiyor aksi halde herhangi bir kod çalıştıramayız.
Bağlandığımız sunucular secondary olduğu için replicationa bağlanırken kullanmamız gereken mongo --host "mrep/node1,node2,node3" -u admin -p pass kodu yerine sanki standalone bir sunucuya bağlanıyormuş gibi connetion string yazmamız gerekiyor.

mongo -u admin -p pass

Yukarıdaki kod ile her iki sunucuyada ayrı ayrı bağlanıyoruz. Bağlandığımız sunucular secondary oldukları için rs.slaveOk() kodunu çalıştırıp sorgu çekmemiz için gereken izni alıyoruz. show dbs kodunu çalıştırarak databaselerimize bakıyoruz.
Şu an sadece admin,local ve config databaseleri mevcut.

Ardından Primary node’umuza bağlanıyoruz.
Bunu iki şekilde yapabiliriz.
İlki sanki standalonemuş gibi mongo -u admin -p pass connection string’ini kullanarak
Diğeri ise mongo --host "mrep/node1,node2,node3" -u admin -p pass connection stringini kullanarak bağlantı sağlayabiliriz. Bu connection string hangi sunucuda olursanız olun sizi her zaman PRIMARY node’a bağlar.

mongo --host "mrep/node1,node2,node3" -u admin -p pass

show dbs diyerek sunucuda sadece admin config ve local db’lerinin olduğunu görüyoruz. ecom isminde bir database oluşturuyoruz ve bu database’e customer isminde bir collection oluşturup içeriye bir kayıt atıyoruz.

show dbs
use ecom
db.customer.insert({name:"hakan"})
db.customer.find()

Ardından diğer node’lara gidip bu veriler oralarda mevcut mu bakıyoruz.

show dbs
use ecom
db.customer.find()

Gördüğünüz gibi PRIMARY’e yaptığımız kayıt diğer node’lara taşındı.

Bazı notlar;

  • Replication kurulumu için keyfile oluşturmak zorunlu değildir, ancak keyfile olmadan sunucular arası auth bilgileri taşınamayacağından auth özeliğini kullanamazsınız bu sebeple güvenli bir yapınız olmaz.
  • keyfile oluşturmadan sadece primary node üzerinde auth açıp kullanıcı oluşturursanız replication kurulmuş olmasına rağmen secondary’lere veri gitmez ve rs.status() çektiğinizde secondary’lerin state’ini STARTUP olarak görürsünüz.
  • Connection Stringlerin hepsine dilerseniz port bilgilerinide ekleyebilirsiniz,Eğer default portta işlem yapıyorsanız yazmanıza gerek yoktur.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s