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.
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()
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.
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.
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.