MongoDB Master Slave Replication Kurulumu

MongoDB Nedir & Tipleri & Primary-Secondary Kurulumu

Deniz TÜRKMEN
9 min readNov 22, 2022

Merhabalar,

Bu yazımda Ubuntu 20.04 üzerine servis olarak MongoDB master-slave replication kurulumunu inceliycez. ilk olarak,

  • MongoDB Nedir
  • MongoDB Komutları
  • MongoDB Kurulum Tipleri
  • MongoDB Master-Slave Replication Kurulumu

MongoDB: Açık kaynak kodlu bir NoSQL (Not only SQL) veri tabanı tekonolojisidir. MongoDB Inc. tarafından C++ programlama dili kullanılarak 2009 yılında geliştirilmiş olan MongoDB, doküman tabanlı ve ölçeklenebilir bir tekonolojidir.

  • mongo: MongoDB veritabanı uygulamasını çalıştırmak için gerekli komuttur.
  • show databases: Sistemde bulunan veri tabanlarını listelemek için “show databases” komutu kullanılır.
  • use: Bu komut, yeni veri tabanı oluşturmak ya da var olan bir veritabanını açmak için kullanılır.
  • dropDatabase(): Bu komut, mevcut bir veri tabanını silmeye yarar.
  • createCollection: Bu komut kullanıldığında, veri tabanında yeni bir tablo oluşturulur.
  • show collections: Veri tabanındaki tabloları listelemek için bu komut kullanılır.
  • tabloismi.drop(): Veri tabanında yer alan tablolardan herhangi birini silmek için bu komut kullanılır.
  • tabloismi.insert({}): Bu komutu kullanarak, veri tabanında yer alan bir tablo içerisine veri ekleyebiliriz.
  • tabloismi.find(): Bu komutu kullanarak, veri tabanında yer alan tablodaki kayıtları listeleyebiliriz. pretty() parametresi ile human readable daha okunuşlu çıktı elde ederiz

MongoDB kurulum tiplerine bakacak olursak.

  1. Standalone (Tek Sunucu): Standalone kurulum aslında oldukça basittir. MongoDB’yi sunucuya yükler, servisi çalıştırır ve bağlanırsınız. Ancak standalone kullandığınız zaman altyapıda yaşanabilecek sorunlara karşı herhangi bir yedekliliğiniz yok demektir. Database sunucusu kapandığı zaman uygulamanız çalışmaz. Sunucunuzun gücü ne kadar ise o kadar performans alabilirsiniz.
Standalone
  1. Replica-Set: Replica Set kurulumu için en az 3 sunucuya ihtiyacınız vardır. Replica Set in öncelikli amacı datanın redundant ve high available olmasını sağlamaktır. Tüm sunucular tek bir replica set içerisine dahil edilir. İstediğiniz bir sunucuyu primary ilan edilir. Bu primary tüm read + write işlerini yapar. Diğer nodelar ise secondary node olur ve read veya backup işleri için kullanılabilir. Primary node’unuzda bir sıkıntı olduğu zaman diğer secondary nodelardan bir tanesi primary rolünü üstlenir. High Availability sağlanmış olur. Dezavantajlarına bakacak olursak;
  • Bir primary 30–40 tane secondary node’unuz olsun fakat primary node sayısı (1) kadar write yapabildiğiniz için performansınız primary node’unuzun kadar performansı ile kısıtlı olmuş olursunuz.

Note: Uygulamanız çoğunlukla write işlemi yapıyorsa, sizin için bir bottleneck oluşturabilir.

Note: Replica Set in öncelikli amacı datanın redundant ve high available olmasını sağlamaktır.

Primary-Secondary

3. Sharded Cluster: Büyük ölçekli verilerin sunucular arasında paylaştırılması özelliğine sharding denir. MongoDB de performansın en öncelikli konu olduğundan bahsetmiştik bu nedenle bazen veriler çok büyük boyutlara ulaştığında tek bir sunucu artık bizim için yetersiz bir hale gelebilir. Bundan dolayı yeni sunucular ile yatay büyümeye giderek veriler, bu sunuculara dağıtılır ve yük azaltılmış olur. Sharding konfigürasyon aslında MongoDB’nin database teknolojilerinin en üst konfigürasyonu diyebiliriz. Sharded cluster’ı açıklamak gerekirse birden fazla replica-set bir araya gelir ve sharded cluster’ı oluşturur. Birden fazla replica-set’te bir araya geldiği için birden fazla primary yani write node’umuz olmuş olur ve performansımız artırmış oluruz. Ek olarak da data istenilen şekilde replica-set’lere sharding edebiliriz. Örneğin bir e ticaret sitesi düşünelim. Monitör kategorisine ait dokümanları A shard’ında, oyuncu-koltuğu kategorisine ait dokümanları B shard’ında tutabiliriz. Bu sayede aslında iki kategorinin MongoDB’deki kaynağını ayırmış oluyoruz. Bu sayede “T” anında mönitor kategorisine gelen write + read yükü artar ise bundan oyuncu-koltuğu kategorisindeki ürünlerimiz etkilenmemiş olur. Çünkü birbirinden bağımsız document oldukları için.

Note: Buradaki dokuman ile kastettiğimiz SQL (RDMBS) row’dur aslında.

Sharded cluster’da client’ı ( son kullanıcıyı ) karşılayan ilk komponent “mongos”. Mongos bir proxy olarak düşünebiliriz. Uygulama connection string mongos’a yazar. Mongos üzerinden database’e bağlanır. Burada şöyle bir soru sorabiliriz. Peki istenilen verinin hangi replica-set’te olduğunu mongos nerden biliyor? Sonuçta monitör kategorisindeki bir ürün için A shard’ına, oyuncu-koltuğu kategorisindeki bir ürün için ise B shard’ına gitmemiz gerekiyor. Mongos herhangi bir metadata tutmuyor. Tüm replica-set metadatası “config server” dediğimiz component üzerinde tutuluyor. Yani client mongos’e gidiyor, mongos’da ilgili datanın nerede olduğunu öğrenmek için config server’a gidiyor. Shard (replica-set) bilgisini alıp client’a veriyor. Sharded cluster kurarken önemli ve bilmemiz gereken component’lar;

  • Mongos
  • Config server
  • Shard
Sharded CLuster

Shared Cluster Kurulumun Avantajları;

  • High Availability sağlar.
  • Shard’larınızdan biri ulaşılamaz olduğunda, diğer
    shardlara erişim vardır.
  • write + read yükü shardlar arasında paylaştırılır olur.

MongoDB Master — Slave için gereksinimlere bakacak olursak;

  • En az 3 Node gerekmektedir.
  • Openssl
  • Nodeların performanslı çalışması speclerinin yüksek olması gerekmektedir. Maximum ve minimum gereksinimler için mongo’nun resmi web sitesinden bakabilirsiniz.

Note: Örneğimizi Virtual Box gerçekleştirceğim için kurulum yapacağımız makinenin specleri düşük tutuyorum. Production ortama kurarken makinne spec’lerine dikket ediniz !!!!!!

  • MongoDb’nin tüm sunucularda kurulu olması gerekmektedir.

Kurulum yapacağımız ortamlara bilgileri aşağıda yer almaktadır.

Ilk olarak kurulum yapacağımız makinelerin IP ve Hostname bilgilerini /etc/hosts altına ekleyelim.

  • master-primary sunucusundan diğer iki makineye ping atarak kontrol edelim.

ikinci olarak tüm nodelara Mongodb CE kurulumu yapıyoruz. Bunun için;

  • Paket yönetim sistemi için key ekliyoruz.
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -sudo apt-get install gnupg
  • Apt paketine ekleyelim
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.listsudo apt update
  • Şimdi MongoDB Community Editon kuralım.
sudo apt-get install -y mongodb-org
  • Kurulumlar tamamlandıktan sonra mongodb versiyona bakmak için;
mongod --version
  • Son olarak mongodb servisi enable, start, deamon relaod edelim ve mongodb servisinin statüsüne bakalım.
sudo systemctl start mongodsudo systemctl daemon-reloadsudo systemctl status mongodsudo systemctl enable mongodsudo systemctl stop mongodsudo systemctl restart mongod

Evet 3 node’umuzda da mongod servisi çalışır durumda. Sunucular arasındaki bağlantıyı sağlamak için authentication oluşturmamız gerekiyor ve bunu da openssl ile oluşturuyoruz. Sonrada mongo.conf dosyasında node’daki path belirtiyor olacağız.

Note: Bu “.key” oluşturma işlemini Primary yani master olarak ilk kurulumda ayarladığınız makinede yapıyoruz.

  • Key dosyamızı oluşturmak için;
openssl rand -base64 741 > /home/master1/prirepkey
  • Oluştruduğumuz key dosyasının sahipliğini mongod olarak yapmak için;
sudo chown mongodb:mongodb /home/master1/prirepkey
  • Son olarak dosya sahibine okuma ve yazma yetkisi veriyoruz.
sudo chmod 600 /home/master1/prirepkey

Authentication için oluşturduğumuz “prirepkey” dosyasını diğer makinelere gönderiyoruz.

sudo scp -r prirepkey slave1@192.168.1.10:/home/slave1sudo scp -r prirepkey slave2@192.168.1.14:/home/slave2

Scp ile diğer node’lara gönderdiğimiz kullanıcın yetkileri aldı tekrar düzenlemek için slave1 ve slave2 node’umuzda;

sudo chown mongodb:mongodb /home/slave1/prirepkeysudo chmod 600 /home/slave1/prirepkeysudo chown mongodb:mongodb /home/slave2/prirepkeysudo chmod 600 /home/slave2/prirepkey

Şimdi de primary olarak belirlediğimiz node’a gidiyoruz ve bir tane root yetkisine sahip kullanıcı oluşturuyoruz.

  • Terminal ekranından “mongo” yazıp enter’a basıyoruz.
mongouse admin;db.createUser({
user: "admin",
pwd: "denizturkmen",
roles: [{role: "root", db: "admin"}]
})

Note: Bu kullanıcıyı PRIMARY olarak belirlediğimiz node’da oluşturuyoruz. Replication yani secondary node olarak diğer iki node’umuzu yaptığımızda oluşturduğumuz user’da taşınmış olacak.

Oluşturduğumuz user’ı kontrol etmek için;

mongo -u admin -pya damongo -u admin -p denizturkmen

“mongo.conf” dosyasını inceleyelim default kurulum ile kurduğunuz için /etc’nin altında yer alır. Yaml formatında olduğu için okuması kolaydır. Replication kurulumu için gerekli olan mongodb servisine dışarıdan erişebiliyor olması gerekir, bir tane kendimiz belirlediği replication ismini girmemiz gerekiyor ve daha önceden oluşturduğumuz key dosyasınıda security path’ini belirliyoruz.

sudo vim mongod.conf---bindIP adresini : 0.0.0.0replication:
replSetName: slaverep
security:
authorization: enabled
keyFile: "home/master1/prirepkey"

Değişikliği kaydedip çıkıyoruz. Ama öncesinde oluşturduğumuz key dosyasını /etc/mongo/key altına taşıyorum ve bunu 3 node içinde yapıyoruz.

ve

Note: “mongo.conf” dosyasındaki configuration’ı 3 node içinde yapıyoruz. Yukarıdaki şekilde görüldüğü gibi.

Mongo servisi değişiklikleri algılaması için restart atıyoruz.

sudo service mongod restartsudo service mongod status

“mongo.conf “ dosyasını biraz daha açıklamak gerekirse;

  • dbpath: MongoDB’nin verileri yazacağı klasörün path’idir.
  • logpath: MongoDB calışırken logları yazacağı log dosyasıdır.
  • fork: MongoDB’nin daemon modda çalışabilmesi için gereken parametredir. Eğer MongoDB arkaplanda çalışmaz, fork: true derseniz arkaplanda (background )çalıştırmanıza imkan sağlar.
  • pidfilepath: MongoDB’yi çalıştırdığınızda process id’sini yazacağı dosyadır. Aslında process id’sini ps -ef | awk ‘/mongodb/{print $2}’ | head -1 komutuyla da alabilirsiniz.
  • logappend: Aslında bu opsiyon analitik için çok önemli. Bu seçenek true olarak ayarlanırsa, mongod restart edildiğinde var olan logların üzerine yazmaz ve kaldığı yerden devam eder. Ama bu seçenek yoksa, restart işleminde eski loglar uçar ve yeni bir log dosyası yaratıp ona yazmaya devam eder.
  • smallfiles: Bu seçenek true olursa, MongoDB nin oluşturduğu default veri dosya boyutları küçük olur. Bu konu performans açısından önemlidir. Daha detaylı bilgi için mongodb web sitesinden bakabilirsiniz.

Diğer node’lara bağlantı olup olmadığı kontrol etmek için, Primary makinesinden;

mongo --host slave-secondary-1 -p 27017mongo --host slave-secondary-2 -p 27017

Evet başarılı şekilde diğer nodelar’ımıza bağlandığımıza göre; Şimdi de primary makinemize gidiyoruz ve replication sürecini başlatıyoruz. Daha önce oluşturduğumuz user ile giriş yapıyoruz.

mongo -u admin -p denizturkmen

Bağlanıyoruz ve parametre belirtmeden aşağıdaki komutu çalıştırıyoruz.

rs.initiate()

Replication olarak diğer node’ları eklemek için;

rs.add("slave-secondary-1:27017")
rs.add("slave-secondary-2:27017")

Yukarıdaki gibi bir çıktı aldıktan sonra başarılı şekilde replication kurulumu tamamlamış oluyoruz :)

Tüm nodeları görmek için PRIMARY makinesinden,

rs.conf()

ya da

rs.status()

Komutunda daha detaylı bilgileride görebilirsiniz.

Son olarak da REPLICATION test’i yapalım.

  • Secondary (slave-secondary-1 ve slave-secondary-2 )nodeları’mızdan oluşturduğumuz user ile bağlanalım.
mongo -u admin -p denizturkmen

ve aşağıdaki kod ile replication doğruluyoruz ve sorgu çalıştırmak için gereken izni alıyoruz.

rs.secondaryOk()

ve database görüntülemek için;

show dbs

Note: Altaki komut ile hangi node’dan bağlanırsanız bağlanın sizi PRIMARY node’una bağlar.

mongo --host "slaverep/master-primary,slave-secondary-1,slave-secondary-2" -u admin -p denizturkmen

Şimdide “testdb” isminde bir database oluşturalım

show dbsshow collectionsdb.person.insert( { name: "deniz", surname: "turkmen" } )show collectionsdb.person.find()

Replication yani secondary nodelar’dan baktığımızda;

Evet görüldüğü gibi PRIMARY yazılan kayıtlar secondary node’lardan okumuş olduk :)

Son olarak PRIMARY node bişey olursa donanım veya herhangi bir sıkıntıdan dolayı kapanması durumunda SECONDARY node’lara priority vererek hangisinin PRIMARY node olacağını ayarlayabiliriz. Bunun için PRIMARY node’umuza tekrar bağlanıyoruz ve aşağıdaki komutlları çalıştırıyoruz.

mongo -u admin -p denizturkmen
rs.config()

Komutu ile baktığımızda priority aldıkları görebiliriz.

Evet o da başarılı şekilde tanımlandı.

Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler.

Referanslar;

--

--

Deniz TÜRKMEN
Deniz TÜRKMEN

No responses yet