Configuração de um Replica Set no MongoDB
O que é um Replica Set?
Um Replica Set no MongoDB é um conjunto de processos mongod que operam sobre um mesmo conjunto de dados. A arquitetura de um Replica Set consiste em um nó primário, onde ocorrem as operações de escrita dos dados, que são replicados para os nós secundários. Os dados podem ser lidos tanto a partir do nó primário, quanto dos nós secundários.
Os objetivos principais de um Replica Set são garantir a alta disponibilidade dos dados, para situações como manutenções programadas, e a redundância dos dados, para casos de recuperação de desastre. Além disso, Replica Sets podem reduzir a carga de leitura dos dados do nó primário, através dos nós secundários.
Os nós do Replica Set enviam constantemente heartbeats, que são pings entre os membros da configuração. Caso um nó não retorne o ping em 10 segundos, o membro que falhou em responder ao heartbeat é marcado como falho.
Em caso de falha do nó primário, um failover automático ocorrerá, e os membros secundários restantes na configuração iniciam uma eleição para determinar o novo primário. Um Replica Set pode ter até 50 membros, porém dentre estes, apenas 7 podem ser membros com direito a voto na eleição do novo primário. Devido a este comportamento, os Replica Sets mais comuns tem 3, 5 ou 7 membros.

Cenário de Implementação
Para este artigo, estaremos considerando a configuração de um Replica Set de três nós. O sistema operacional utilizado como base é o Ubuntu Server 22.04 LTS. O primeiro host foi nomeado como mongo-server-0, que será o nó primário, e os dois nós secundários foram nomeados mongo-server-1 e mongo-server-2.
Para que os nós conseguissem se comunicar entre si, foram adicionadas as entradas abaixo no arquivo /etc/hosts de cada host:
192.168.1.95 mongo-server-0 mongo-server-0 192.168.1.96 mongo-server-1 mongo-server-1 192.168.1.97 mongo-server-2 mongo-server-2
Neste caso, os hosts foram implementados em máquinas virtuais, e estão usando a interface de rede pública para a comunicação, por ser um ambiente de testes. Em ambientes produtivos recomenda-se que a comunicação entre os nós de um Replica Set ocorra através de uma rede privada.
Em todos os hosts foi instalada a versão 7.0 do MongoDB Enterprise, conforme referenciado na documentação oficial, que pode ser acessada aqui.
Configurando o Replica Set
Inicialmente, paramos e desabilitamos o firewall do Linux:
systemctl stop ufw systemctl disable ufw
Em seguida, precisamos configurar o arquivo de configuração /etc/mongod.conf. As configurações relevantes para o deploy de um Replica Set são:
- net.bindIP: o hostname ou IP no qual o processo mongod irá receber conexões. Por padrão o mongo permite apenas conexões vindas do localhost, e portanto precisamos adicionar o hostname do nó atual, que foi configurado no arquivo /etc/hosts apontando para o IP do nó atual.
- replication.replSetName: o nome do Replica Set do qual o processo mongod fará parte. Este valor precisa ser igual para todos os nós do Replica Set.
- security.keyFile: o caminho para um key file que será usado para a autenticação entre os nós do Replica Set.
Abaixo, os arquivos de configuração de cada nó:
Arquivo /etc/mongod.conf no host mongo-server-0:
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /var/lib/mongodb # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # network interfaces net: port: 27017 bindIp: 127.0.0.1, mongo-server-0 # how the process runs processManagement: timeZoneInfo: /usr/share/zoneinfo security: keyFile: /etc/mongodb/pki/keyfile #operationProfiling: replication: replSetName: "myFirstReplicaSet" #sharding: ## Enterprise-Only Options: #auditLog:
Arquivo /etc/mongod.conf no host mongo-server-1:
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /var/lib/mongodb # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # network interfaces net: port: 27017 bindIp: 127.0.0.1, mongo-server-1 # how the process runs processManagement: timeZoneInfo: /usr/share/zoneinfo security: keyFile: /etc/mongodb/pki/keyfile #operationProfiling: replication: replSetName: "myFirstReplicaSet" #sharding: ## Enterprise-Only Options: #auditLog:
Arquivo /etc/mongod.conf no host mongo-server-2:
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /var/lib/mongodb # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # network interfaces net: port: 27017 bindIp: 127.0.0.1, mongo-server-2 # how the process runs processManagement: timeZoneInfo: /usr/share/zoneinfo security: keyFile: /etc/mongodb/pki/keyfile #operationProfiling: replication: replSetName: "myFirstReplicaSet" #sharding: ## Enterprise-Only Options: #auditLog:
Após a configuração, precisamos gerar os key files que serão utilizados para a autenticação entre os nós do Replica Set. Para isso podemos utilizar o comando openssl do Linux, para gerar um key file, e armazená-lo no diretório /tmp, e em seguida realizar a troca das permissões para o arquivo:
openssl rand -base64 756 > /tmp/keyfile chmod 0400 /tmp/keyfile
Na sequência, criamos o diretório apontado para o key file nos arquivos de configuração, movemos o key file para o diretório, e damos o owner deste diretório para o usuário Linux mongodb, que é o usuário que roda o processo mongod:
mkdir -p /etc/mongodb/pki mv /tmp/keyfile /etc/mongodb/pki/ chown -R mongodb:mongodb /etc/mongodb
Neste momento precisamos enviar uma cópia deste key file para cada um dos demais membros do Replica Set:
scp /etc/mongodb/pki/keyfile mongo-server-1:/tmp scp /etc/mongodb/pki/keyfile mongo-server-2:/tmp
E repetimos o processo feito no nó primário em ambos os nós secundários, criando o diretório apontado para o key file nos arquivos de configuração, movendo o key file para o diretório, e dando o owner deste diretório para o usuário Linux mongodb:
mkdir -p /etc/mongodb/pki/ mv /tmp/keyfile /etc/mongodb/pki/ chown -R mongodb:mongodb /etc/mongodb
Feito todo esse processo, reiniciamos o serviço mongod em todos os hosts:
systemctl restart mongod
Agora que o MongoDB em todos os hosts já está executando com as novas configurações, podemos executar o comando de inicialização do Replica Set, através do utilitário mongosh. É necessário que o _id do Replica Set tenha o mesmo nome que o configurado em replication.replSetName no arquivo /etc/mond.conf:
rs.initiate( { _id: "myFirstReplicaSet", version: 1, members: [ { _id: 0, host : "mongo-server-0" }, { _id: 1, host : "mongo-server-1" }, { _id: 2, host : "mongo-server-2" } ] } )
Em seguida, podemos verificar informações sobre o status do Replica Set através do comando:
rs.status()
Conclusão
A utilização de Replica Sets é algo comum em ambientes MongoDB que visam a alta disponibilidade dos seus dados e a recuperação de desastres, como em ambientes críticos e de produção.
Espero que tenham aprendido algo novo neste artigo!
Publicar comentário