С режимом работы кластера можно ознакомиться здесь
Начнем с кластера в режиме ReplicaSet
- Машины должны видеть друг друга по имена через ИП АДРЕСА НЕ РАБОТАЕТ.
- Дописываем в конфиг vim /etc/mongod.conf
replication:
replSetName: "rs0"
sharding:
clusterRole: "configsvr"
Дальше нам понадобиться консольный доступ через утилиту mongosh (Если ставили из официальных реп то должна идти в комплекте, ну или придётся доставить)
Инициализируем кластер, перечисляя ноды, делаем только на одной ноде
rs.initiate(
{
_id: "rs0",
configsvr: true,
members: [
{ _id : 0, host : "mongodb1:27017" },
{ _id : 1, host : "mongodb2:27017" },
]
}
)
Проверка Конфигурации
Enterprise rs0 [direct: primary] test> rs.conf()
{
_id: 'rs0',
version: 1,
term: 10,
members: [
{
_id: 0,
host: 'mongodb1:27017',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 1,
tags: {},
secondaryDelaySecs: Long("0"),
votes: 1
},
{
_id: 1,
host: 'mongodb2:27017',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 1,
tags: {},
secondaryDelaySecs: Long("0"),
votes: 1
}
],
protocolVersion: Long("1"),
writeConcernMajorityJournalDefault: true,
settings: {
chainingAllowed: true,
heartbeatIntervalMillis: 2000,
heartbeatTimeoutSecs: 10,
electionTimeoutMillis: 10000,
catchUpTimeoutMillis: -1,
catchUpTakeoverDelayMillis: 30000,
getLastErrorModes: {},
getLastErrorDefaults: { w: 1, wtimeout: 0 },
replicaSetId: ObjectId("62c2c06515c0c4c459c2688b")
}
Статус Кластера
Enterprise rs0 [direct: primary] test> rs.status()
{
set: 'rs0',
date: ISODate("2022-07-04T14:30:17.750Z"),
myState: 1,
term: Long("10"),
syncSourceHost: '',
syncSourceId: -1,
heartbeatIntervalMillis: Long("2000"),
majorityVoteCount: 2,
writeMajorityCount: 2,
votingMembersCount: 2,
writableVotingMembersCount: 2,
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
lastCommittedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
readConcernMajorityOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
appliedOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
durableOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
lastAppliedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
lastDurableWallTime: ISODate("2022-07-04T14:30:14.470Z")
},
lastStableRecoveryTimestamp: Timestamp({ t: 1656945014, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: 'stepUpRequestSkipDryRun',
lastElectionDate: ISODate("2022-07-04T14:02:34.394Z"),
electionTerm: Long("10"),
lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1656943340, i: 7 }), t: Long("9") },
lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1656943340, i: 7 }), t: Long("9") },
numVotesNeeded: 2,
priorityAtElection: 1,
electionTimeoutMillis: Long("10000"),
priorPrimaryMemberId: 1,
numCatchUpOps: Long("0"),
newTermStartDate: ISODate("2022-07-04T14:02:34.402Z"),
wMajorityWriteAvailabilityDate: ISODate("2022-07-04T14:02:35.401Z")
},
electionParticipantMetrics: {
votedForCandidate: true,
electionTerm: Long("9"),
lastVoteDate: ISODate("2022-07-04T14:00:34.356Z"),
electionCandidateMemberId: 1,
voteReason: '',
lastAppliedOpTimeAtElection: { ts: Timestamp({ t: 1656943220, i: 72 }), t: Long("8") },
maxAppliedOpTimeInSet: { ts: Timestamp({ t: 1656943220, i: 72 }), t: Long("8") },
priorityAtElection: 1
},
members: [
{
_id: 0,
name: 'mongodb1:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
uptime: 8997,
optime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
optimeDate: ISODate("2022-07-04T14:30:14.000Z"),
lastAppliedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
lastDurableWallTime: ISODate("2022-07-04T14:30:14.470Z"),
syncSourceHost: '',
syncSourceId: -1,
infoMessage: '',
electionTime: Timestamp({ t: 1656943354, i: 1 }),
electionDate: ISODate("2022-07-04T14:02:34.000Z"),
configVersion: 1,
configTerm: 10,
self: true,
lastHeartbeatMessage: ''
},
{
_id: 1,
name: 'mongodb2:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
uptime: 8996,
optime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
optimeDurable: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
optimeDate: ISODate("2022-07-04T14:30:14.000Z"),
optimeDurableDate: ISODate("2022-07-04T14:30:14.000Z"),
lastAppliedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
lastDurableWallTime: ISODate("2022-07-04T14:30:14.470Z"),
lastHeartbeat: ISODate("2022-07-04T14:30:16.949Z"),
lastHeartbeatRecv: ISODate("2022-07-04T14:30:15.998Z"),
pingMs: Long("0"),
lastHeartbeatMessage: '',
syncSourceHost: 'mongodb1:27017',
syncSourceId: 0,
infoMessage: '',
configVersion: 1,
configTerm: 10
}
],
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1656945014, i: 1 }),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: Long("0")
}
},
operationTime: Timestamp({ t: 1656945014, i: 1 })
}
Добавить ноду в кластер. Выполняем на примаре наде.
Enterprise rs0 [direct: primary] test> rs.add( { host: "mongodb3:27017" } )
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1657003243, i: 1 }),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: Long("0")
}
},
operationTime: Timestamp({ t: 1657003243, i: 1 })
}
Удалить Ноду
rs.remove("mongod3.example.net")
Изменить роль ноды в Secoundary
rs.stepDown()