MongoDB – Como verificar o Status do ReplicaSet
- Postado por Adriano Bonacin
- Categorias mongodb
- Data 20/01/2022
- Comentários 0 comentário
Olá, pessoal. Nosso último artigo terminou com dois membros no nosso ReplicaSet. Agora precisamos avançar e olhar o status do ReplicaSet, que nos ajudam a “enxergar” melhor este ambiente um pouco mais complexo. Precisamos descobrir todos os hosts que participam desta configuração, qual papel cada um assume, qual o status de determinado membro.
Imagine a situação, um cliente pede para dar uma “olhadinha” em seu MongoDB e você pergunta: “Seu MongoDB tem ReplicaSet?”. Seu cliente não tem ideia do que você está falando. Vou tentar explicar como podemos obter estas informações de forma prática.
ReplicaSet Status
O primeiro método que costumamos utilizar é o rs.status. Ele vai nos dizer quem é o PRIMARY, SECONDARY, se todos estão vivos (health). Veja como fica e aproveite para dar uma conferida com bastante carinho e atenção.
rsYadax0 [direct: primary] test> rs.status()
{
set: 'rsYadax0',
date: ISODate("2022-01-20T13:41:49.637Z"),
myState: 1,
term: Long("1"),
syncSourceHost: '',
syncSourceId: -1,
heartbeatIntervalMillis: Long("2000"),
majorityVoteCount: 2,
writeMajorityCount: 2,
votingMembersCount: 2,
writableVotingMembersCount: 2,
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
lastCommittedWallTime: ISODate("2022-01-20T13:41:48.451Z"),
readConcernMajorityOpTime: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
appliedOpTime: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
durableOpTime: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
lastAppliedWallTime: ISODate("2022-01-20T13:41:48.451Z"),
lastDurableWallTime: ISODate("2022-01-20T13:41:48.451Z")
},
lastStableRecoveryTimestamp: Timestamp({ t: 1642686088, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: 'electionTimeout',
lastElectionDate: ISODate("2022-01-16T14:46:42.456Z"),
electionTerm: Long("1"),
lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1642344402, i: 1 }), t: Long("-1") },
lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1642344402, i: 1 }), t: Long("-1") },
numVotesNeeded: 1,
priorityAtElection: 1,
electionTimeoutMillis: Long("10000"),
newTermStartDate: ISODate("2022-01-16T14:46:42.488Z"),
wMajorityWriteAvailabilityDate: ISODate("2022-01-16T14:46:42.504Z")
},
members: [
{
_id: 0,
name: 'mymongo1:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
uptime: 341922,
optime: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
optimeDate: ISODate("2022-01-20T13:41:48.000Z"),
lastAppliedWallTime: ISODate("2022-01-20T13:41:48.451Z"),
lastDurableWallTime: ISODate("2022-01-20T13:41:48.451Z"),
syncSourceHost: '',
syncSourceId: -1,
infoMessage: '',
electionTime: Timestamp({ t: 1642344402, i: 2 }),
electionDate: ISODate("2022-01-16T14:46:42.000Z"),
configVersion: 3,
configTerm: 1,
self: true,
lastHeartbeatMessage: ''
},
{
_id: 1,
name: 'mymongo2:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
uptime: 229304,
optime: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
optimeDurable: { ts: Timestamp({ t: 1642686108, i: 1 }), t: Long("1") },
optimeDate: ISODate("2022-01-20T13:41:48.000Z"),
optimeDurableDate: ISODate("2022-01-20T13:41:48.000Z"),
lastAppliedWallTime: ISODate("2022-01-20T13:41:48.451Z"),
lastDurableWallTime: ISODate("2022-01-20T13:41:48.451Z"),
lastHeartbeat: ISODate("2022-01-20T13:41:48.488Z"),
lastHeartbeatRecv: ISODate("2022-01-20T13:41:48.345Z"),
pingMs: Long("0"),
lastHeartbeatMessage: '',
syncSourceHost: 'mymongo1:27017',
syncSourceId: 0,
infoMessage: '',
configVersion: 3,
configTerm: 1
}
],
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1642686108, i: 1 }),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: Long("0")
}
},
operationTime: Timestamp({ t: 1642686108, i: 1 })
}
Você conseguiu ver o nome do ReplicaSet? E quantos votos são necessários para atingir a maioria? Achou todos os membros? Eles estão ok? Todas estas informações são retornadas por esse método. E se quiséssemos focar nos membros? Tente isso:
rsYadax0 [direct: primary] test> rs.status().members
[
{
_id: 0,
name: 'mymongo1:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
uptime: 343389,
optime: { ts: Timestamp({ t: 1642687568, i: 1 }), t: Long("1") },
optimeDate: ISODate("2022-01-20T14:06:08.000Z"),
lastAppliedWallTime: ISODate("2022-01-20T14:06:08.642Z"),
lastDurableWallTime: ISODate("2022-01-20T14:06:08.642Z"),
syncSourceHost: '',
syncSourceId: -1,
infoMessage: '',
electionTime: Timestamp({ t: 1642344402, i: 2 }),
electionDate: ISODate("2022-01-16T14:46:42.000Z"),
configVersion: 3,
configTerm: 1,
self: true,
lastHeartbeatMessage: ''
},
{
_id: 1,
name: 'mymongo2:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
uptime: 230770,
optime: { ts: Timestamp({ t: 1642687568, i: 1 }), t: Long("1") },
optimeDurable: { ts: Timestamp({ t: 1642687568, i: 1 }), t: Long("1") },
optimeDate: ISODate("2022-01-20T14:06:08.000Z"),
optimeDurableDate: ISODate("2022-01-20T14:06:08.000Z"),
lastAppliedWallTime: ISODate("2022-01-20T14:06:08.642Z"),
lastDurableWallTime: ISODate("2022-01-20T14:06:08.642Z"),
lastHeartbeat: ISODate("2022-01-20T14:06:15.671Z"),
lastHeartbeatRecv: ISODate("2022-01-20T14:06:15.582Z"),
pingMs: Long("0"),
lastHeartbeatMessage: '',
syncSourceHost: 'mymongo1:27017',
syncSourceId: 0,
infoMessage: '',
configVersion: 3,
configTerm: 1
}
]
Qual é a mágica? O retorno do rs.status() é um documento e, assim sendo, podemos navegar por ele, exibir apenas uma das chaves e assim por diante. O que fizemos neste último exemplo foi exatamente isso, quando pedimos rs.status().members. De tudo que foi retornado, queremos olhar apenas para os membros.
Além de MongoDB acabamos precisando conhecer um pouquinho de JavaScript para facilitar o dia a dia. Prometo um dia escrever algo sobre como operar e iterar sobre estes elementos.
Avançamos um pouco nesse mundo de ReplicaSet, que ainda tem muito mais. Como estão até aqui? Todo mundo acompanhando? Se precisarem de alguma ajuda ou tiverem alguma sugestão, só me procurar. Em seguida vou escrever sobre a troca de papéis entre Primary e Secondary. Até lá.
Tag:mongodb