swetrix
linuxpedi cover 1

MongoDb Replica Set Kurulumu – Ubuntu 20.04

MongoDB Replika Set Nedir?

Selamlar, önceki yazımda size MongoDb kurulumu hakkında bilgi vermiştim, bu yazıda ise MongoDb replica set kurulumu hakkında bilgi vereceğim. Replica set kurulumundan önce MongoDb standalone instance kurulumu için lütfen bir önceki yazıma bakın:

MongoDb replica set, aynı datayı içeren, bir mongod instancelar bütünüdür. MongoDb, replica set ile birlikte high availability ve redunduncy sağlar. Böylelikle replica set ile birlikte server-instance fail durumunda mongodb ye sürekli bir şekilde erişim sağlayabilirsiniz. MongoDb replica set ile birlikte ayrıca basit yük dağıtımı yapmakta mümkün.

Replica Set en az 3 node’dan oluşmalı, bu nodelarda her zaman 1 primary (ddl operasyonlarının geldiği) node, geriye kalan istediğimiz kadar nodelarda secondary oluyor.

MongoDb Replica Set architecture
Basit Bir MongoDb Replica Set Mimarisi

Gerekli Kaynaklar:

  • 3 Tane Ubuntu 20.04 server.
  • Bu serverlarda standalone mongo kurulumu (bir önceki yazımdan bakabilirsiniz).
  • Her bir server için minimum 4 GB RAM – 2 core CPU
  • Serverlar kendi aralarında mongo portu üzerinden birbirleriyle erişim sağlayabilmeli.

MongoDb Replica Set Kurulumu

Yapmamız gereken ilk şey, kurduğumuz standalone instancelarda bind_ip ayarlamalarını yapmak ve replika set ayarı yapmak olmalı, mongod.confta bu ayarlamaları her bir serverda aşağıdaki şekilde yapabilirsiniz:

sudo vi /etc/mongod.conf

Benim durumumda 1. node 192.168.159.135, 2. node 192.168.159.136, 3. node 192.168.159.137 ip’ye sahip.

1.node için, bulunduğumuz serverın ipsi yazılmalı ve replica set ayarı yapılmalı:

net:
  port: 27017
  bindIp: 192.168.159.135
.
.

replication:
 replSetName: "rs1"

2. node için, bulunduğumuz serverın ipsi yazılmalı ve replica set ayarı yapılmalı:

net:
  port: 27017
  bindIp: 192.168.159.136
.
.

replication:
 replSetName: "rs1"

3. node için, bulunduğumuz serverın ipsi yazılmalı ve replica set ayarı yapılmalı:

net:
  port: 27017
  bindIp: 192.168.159.137
.
.

replication:
 replSetName: "rs1"

Bu configlerle beraber mongod.conf save edilmeli ve mongod servisleri her bir serverda restart edilmeli:

sudo systemctl restart mongod

Daha sonra ilk servera girip, mongosh ile mongodb ye bağlanmalısınız:

mongosh --host 192.168.159.135 

MongoDb’ye bağlandıktan sonra, mongod’u replika set kurulumu için aşağıdaki commandle replica set initiate komutunu çalıştırmalısınız:

rs.initiate()

Bu command, aşağıdaki gibi bir output verecektir:

{
  info2: 'no configuration specified. Using a default configuration for the set',
  me: '192.168.159.135:27017',
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1675335209, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1675335209, i: 1 })
}

Daha sonra diğer nodeları Replica Set’e bağlamak için, rs.add() komutunu çalıştırmalıyız:

rs.add("192.168.159.136")

Bu command aşağıdaki gibi output verecektir:

{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1675335443, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1675335443, i: 1 })
}

Diğer node’u da ekleyelim:

rs.add("192.168.159.137")

Aşağıdaki gibi output verecektir:

{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1675335456, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1675335456, i: 1 })
}

Tebrikler! Basit bir MongoDb Replica Set oluşturdunuz, MongoDb bu node eklemelerle beraber bir seçim sürecine girip, primary bir node belirleyecektir. Write işlemlerinizi, bu primary node üzerinden yapmalısınız, read işlemleri ise secondary nodelardan yapılabilir. rs.status() commandiyle, replica set bilgilerini gözden geçirebilirsiniz:

rs.status()

Aşağıdaki bilgileri görebilirsiniz:

{
  set: 'rs1',
  date: ISODate("2023-02-02T13:38:33.145Z"),
  myState: 1,
  term: Long("1"),
  syncSourceHost: '',
  syncSourceId: -1,
  heartbeatIntervalMillis: Long("2000"),
  majorityVoteCount: 2,
  writeMajorityCount: 2,
  votingMembersCount: 3,
  writableVotingMembersCount: 3,
  optimes: {
    lastCommittedOpTime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
    lastCommittedWallTime: ISODate("2023-02-02T13:38:30.308Z"),
    readConcernMajorityOpTime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
    appliedOpTime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
    durableOpTime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
    lastAppliedWallTime: ISODate("2023-02-02T13:38:30.308Z"),
    lastDurableWallTime: ISODate("2023-02-02T13:38:30.308Z")
  },
  lastStableRecoveryTimestamp: Timestamp({ t: 1675345050, i: 1 }),
  electionCandidateMetrics: {
    lastElectionReason: 'electionTimeout',
    lastElectionDate: ISODate("2023-02-02T10:53:29.156Z"),
    electionTerm: Long("1"),
    lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1675335209, i: 1 }), t: Long("-1") },
    lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1675335209, i: 1 }), t: Long("-1") },
    numVotesNeeded: 1,
    priorityAtElection: 1,
    electionTimeoutMillis: Long("10000"),
    newTermStartDate: ISODate("2023-02-02T10:53:29.212Z"),
    wMajorityWriteAvailabilityDate: ISODate("2023-02-02T10:53:29.244Z")
  },
  members: [
    {
      _id: 0,
      name: '192.168.159.135:27017',
      health: 1,
      state: 1,
      stateStr: 'PRIMARY',
      uptime: 9972,
      optime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
      optimeDate: ISODate("2023-02-02T13:38:30.000Z"),
      lastAppliedWallTime: ISODate("2023-02-02T13:38:30.308Z"),
      lastDurableWallTime: ISODate("2023-02-02T13:38:30.308Z"),
      syncSourceHost: '',
      syncSourceId: -1,
      infoMessage: '',
      electionTime: Timestamp({ t: 1675335209, i: 2 }),
      electionDate: ISODate("2023-02-02T10:53:29.000Z"),
      configVersion: 5,
      configTerm: 1,
      self: true,
      lastHeartbeatMessage: ''
    },
    {
      _id: 1,
      name: '192.168.159.136:27017',
      health: 1,
      state: 2,
      stateStr: 'SECONDARY',
      uptime: 9669,
      optime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
      optimeDurable: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
      optimeDate: ISODate("2023-02-02T13:38:30.000Z"),
      optimeDurableDate: ISODate("2023-02-02T13:38:30.000Z"),
      lastAppliedWallTime: ISODate("2023-02-02T13:38:30.308Z"),
      lastDurableWallTime: ISODate("2023-02-02T13:38:30.308Z"),
      lastHeartbeat: ISODate("2023-02-02T13:38:31.884Z"),
      lastHeartbeatRecv: ISODate("2023-02-02T13:38:31.676Z"),
      pingMs: Long("1"),
      lastHeartbeatMessage: '',
      syncSourceHost: '192.168.159.135:27017',
      syncSourceId: 0,
      infoMessage: '',
      configVersion: 5,
      configTerm: 1
    },
    {
      _id: 2,
      name: '192.168.159.137:27017',
      health: 1,
      state: 2,
      stateStr: 'SECONDARY',
      uptime: 9656,
      optime: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
      optimeDurable: { ts: Timestamp({ t: 1675345110, i: 1 }), t: Long("1") },
      optimeDate: ISODate("2023-02-02T13:38:30.000Z"),
      optimeDurableDate: ISODate("2023-02-02T13:38:30.000Z"),
      lastAppliedWallTime: ISODate("2023-02-02T13:38:30.308Z"),
      lastDurableWallTime: ISODate("2023-02-02T13:38:30.308Z"),
      lastHeartbeat: ISODate("2023-02-02T13:38:31.885Z"),
      lastHeartbeatRecv: ISODate("2023-02-02T13:38:32.867Z"),
      pingMs: Long("0"),
      lastHeartbeatMessage: '',
      syncSourceHost: '192.168.159.135:27017',
      syncSourceId: 0,
      infoMessage: '',
      configVersion: 5,
      configTerm: 1
    }
  ],
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1675345110, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1675345110, i: 1 })
}

Replica setinizi test etmek için, aşağıdaki commandlerle primary dbnize bir döküman insert edin, daha sonra secondarylerden bağlanıp basit bir read commandiyle bu dökümanı görmeye çalışın:

use linuxpedi
switched to db linuxpedi

Document insert command:

db.linuxpedi.insertOne({"name":"MertYavuz"})

Secondary nodelardan birine bağlanıp, bu döküman orada da gözüküyor mu diye bakalım, ancak secondary nodelardan ddl yapmak otomatik olarak kapalı olacaktır. Readleri secondaylerde enable edebilmek için:

rs.secondaryOk()

veya,

db.getMongo().setReadPref('secondaryPreferred')

Bu commandden sonra, database’e sorgu atabilirsiniz:

db.linuxpedi.find().pretty()
MongoDbsecondaryquery

ReadPreference ile ilgili daha çok bilgi için, lütfen resmi dökümanları inceleyin: https://www.mongodb.com/docs/manual/core/read-preference/

MongoDb ile anlatacaklarım bu kadar, ancak bilmelisinizki replica setler konusunda daha öğrenecek çok şey var. Ama şimdilik replica set kurmayı biliyorsunuz :).

Son olarak, Eğer beklenmeyen bir hatayla karşılasırsanız ya da feedback vermek isterseniz, lütfen mail atmaktan çekinmeyin.

2 comments
  1. Merhaba,

    Bu makalede ki işlemleri docker compose ile ayağa kaldırdığım mongo hangi komutlarla yapabilirim?
    Örnekte ki gibi 2 adet pc olduğu farz edersek mongodb lerin replica set kurulumunu yapmak istiyorum.
    Bu mümkün mü?
    Örnek bir makale var mı paylaşabileceğim.

    1. Selamlar,

      Sanırım “Bu makalede ki işlemleri docker compose ile ayağa kaldırdığım mongo” derken docker compose ile 2 ayrı mongodb instance ayağa kaldırdığınızdan bahsediyorsunuz.

      Burada 2 ayrı standalone mongodb kaldırmak ve bunları bağlamak yerine bunun için hazırlanmış mongodb replica set docker compose makalelerine bakmanızı öneririm,

      Ayrıca replica set için en az 3 node olmalıdır. Tabi 2 nodelu replica set oluşturulabilir ancak bu best practice dışına çıkar, bunun yollarını internetteki bir çok makalede bulabilirsiniz.

      https://github.com/UpSync-Dev/docker-compose-mongo-replica-set
      https://bytelanguage.com/2023/02/13/create-mongo-replicaset-using-docker-compose/
      https://blog.devgenius.io/how-to-deploy-a-mongodb-replicaset-using-docker-compose-a538100db471

      İyi Çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Önceki Yazı
mongodb_standalone

MongoDb Kurulumu – Ubuntu 20.04

Sonraki Yazı
gitlab_cover

Gitlab CE Kurulumu – Ubuntu 22.04

Benzer Yazılar
ansible_cover

Ansible 101: Kurulum ve Temel Bileşenler Rehberi

Bu blog yazısında, Ansible'ın temelini, avantajlarını ve nasıl kurulacağını keşfedeceksiniz. Ayrıca, Ansible ile Ubuntu/Debian tabanlı bir sunucuda Nginx web sunucusu kurulumu ve yapılandırılması hakkında adım adım bir rehber bulacaksınız. Yazıda verilen GitHub reposunu inceleyerek ve kendi ortamlarınızda test ederek Ansible'ın çalışma şeklini ve dinamiklerini daha iyi anlayabilirsiniz. Yazı, Ansible'ın temel bileşenlerini ve yapılandırma yönetimi, otomasyon, dağıtım gibi konseptlerini detaylı bir şekilde ele alır.
Yazıya git