MongoDB – Adicionando membros no ReplicaSet
- Postado por Adriano Bonacin
- Categorias mongodb
- Data 17/01/2022
- Comentários 0 comentário
Saudações pessoal. Falamos anteriormente de como criar um ReplicaSet com apenas um membro. Mas para que tenhamos redundância em nosso banco de dados, precisamos que os dados sejam replicados para outro host. Vamos adicionar membros no ReplicaSet para ter nosso ambiente com alta disponibilidade.
Nosso ponto de partida é ter 3 containers rodando com a imagem CentOS 8. Se precisar de ajuda com isso, pode revisar nosso artigo. Próximo passo será a instalação do MongoDB em todos eles, como fizemos neste artigo.
Instalação
Confirmando se está tudo instalado nos três containers:
abonacin@Adrianos-MacBook-Pro compose % docker exec -it mymongo1 /bin/bash
[root@mymongo1 /]# cat /etc/yum.repos.d/mongodb-org-5.0.repo
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
[root@mymongo1 /]# yum install -y mongodb-org
...
[root@mymongo1 /]# rpm -qa | grep mongo
mongodb-org-server-5.0.5-1.el8.x86_64
mongodb-mongosh-1.1.8-1.el7.x86_64
mongodb-org-database-tools-extra-5.0.5-1.el8.x86_64
mongodb-database-tools-100.5.1-1.x86_64
mongodb-org-5.0.5-1.el8.x86_64
mongodb-org-shell-5.0.5-1.el8.x86_64
mongodb-org-mongos-5.0.5-1.el8.x86_64
mongodb-org-database-5.0.5-1.el8.x86_64
mongodb-org-tools-5.0.5-1.el8.x86_64
Arquivo de configuração
Em seguida, vamos ajustar os arquivos de configuração de todos os containers, como fizemos no artigo. Ficará assim:
[root@mymongo1 /]# cat /etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
#security:
#operationProfiling:
replication:
replSetName: "rsYadax0"
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
[root@mymongo1 /]#
Ajuste arquivo /etc/hosts
Vamos inserir as algumas linhas no /etc/hosts para que a gente consiga tratar os hosts na configuração pelo nome e não pelo IP. Certifique que os três hosts tenham estas três linhas. Se preferir usar o IP, pode ignorar este passo. No resultado final não haverá diferença.
[root@mymongo1 /]# tail -3 /etc/hosts
172.100.0.11 mymongo1
172.100.0.12 mymongo2
172.100.0.13 mymongo3
[root@mymongo1 /]#
Start mongod nos três containers
Vamos startar o mongod nos 3 hosts.
[root@mymongo1 /]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 170
child process started successfully, parent exiting
[root@mymongo2 /]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 150
child process started successfully, parent exiting
[root@mymongo3 /]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 157
child process started successfully, parent exiting
ReplicaSet initiate
Agora vamos para o mymongo1 iniciar o ReplicaSet. Tenha em mente que isso vai ser executado apenas neste momento e apenas no primeiro host, nunca mais vamos precisar do initiate neste ReplicaSet. Este procedimento cria collections dentro do próprio MongoDB para controle interno. Uma vez que um novo host entra no cluster, ele receberá magicamente uma cópia destas collections, não sendo necessário iniciá-lo novamente neste host.
Se você precisar fazer o caminho contrário, transformar um ReplicaSet em Standalone, recomendo este artigo de um colega no Blog da Percona. O Jean comenta inclusive como limpar essas collections, vale muito a leitura.
Vamos lá:
[root@mymongo1 /]# mongosh
...
test> rs.initiate()
{
info2: 'no configuration specified. Using a default configuration for the set',
me: 'mymongo1:27017',
ok: 1
}
rsYadax0 [direct: other] test>
rsYadax0 [direct: primary] test>
Outra observação, ainda estamos trabalhando com controle de acesso desabilitado, ou seja, sem nenhum tipo de autenticação. Isso facilita um pouco, porém não é assim que acontece na vida real. Teremos em breve um artigo falando como configurar o ReplicaSet com controle de acesso habilitado. Se quiser ter mais detalhes deste procedimento, recomendo uma dar passadinha na documentação oficial.
Add member
Temos agora nosso ReplicaSet com um membro e chegamos no auge do nosso artigo. Vamos adicionar um segundo membro na configuração. Porém, antes disso vamos conectar o mongosh neste segundo node para ver o que vai acontecer.
Parece tudo normal, certo? Nenhuma indicação de que ele faz parte de um ReplicaSet. Se você tentar alguma coisa como “show dbs”, o MongoDB retorna: “MongoServerError: node is not in primary or recovering state.” Ou seja, subimos o mongod informando que ele faz parte de uma replicação e ele só vai funcionar quando de fato fizer. Mantenha essa sessão aberta.
[root@mymongo2 /]# mongosh
...
test>
test> show dbs MongoServerError: node is not in primary or recovering state
test>
Bora adicionar o mymongo2 no ReplicaSet? Toda operação envolvendo ReplicaSet precisa ser feita no PRIMARY. Um ponto que ainda não falamos, mas estava no arquivo de conf, é a porta que o MongoDB usa para conexão, por default a 27017. Isso quer dizer que quando formos adicionar o mymongo2, você o verá acompanhado de “:27017”.
rsYadax0 [direct: primary] test> rs.add('mymongo2:27017')
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1642456805, i: 1 }),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: Long("0")
}
},
operationTime: Timestamp({ t: 1642456805, i: 1 })
}
E para finalizar, apenas dê um <ENTER> na sessão do mymongo2. Você verá que agora ele faz parte do ReplicaSet rsYadax0 e seu papel é de um SECONDARY.
test>
rsYadax0 [direct: secondary] test>
Finalizamos, mas ainda há muito para explorar. No próximo artigo vamos ver como podemos obter informações dessa configuração que acabamos de montar e testar se de fato há replicação dos dados para o outro lado. Até lá.
Tag:mongodb