A replicação tem sido amplamente aplicada em sistemas de banco de dados para garantir alta disponibilidade de dados por meio da criação de redundância. É basicamente uma estratégia de fazer uma cópia dos mesmos dados em diferentes servidores em execução que podem estar em máquinas diferentes para que, em caso de falha do servidor principal, outro possa ser acionado para continuar o atendimento.
Um conjunto de réplicas é um grupo de instâncias do MongoDB que mantêm o mesmo conjunto de dados. Eles são a base das implantações de produção. A replicação é vantajosa pelo fato de que os dados estão sempre disponíveis em um servidor diferente, caso o sistema do servidor principal falhe. Além disso, melhora o throughput de leitura, permitindo que um cliente envie solicitação de leitura para diferentes servidores e obtenha resposta do mais próximo.
Um conjunto de réplicas constitui vários nós portadores de dados que podem ser hospedados em diferentes máquinas e um nó árbitro. Um desses nós portadores de dados é rotulado como primário, enquanto os outros são nós secundários. O nó primário recebe todas as operações de gravação e replica os dados para os outros nós após a conclusão da operação de gravação e as alterações registradas em um oplog.
Um árbitro é uma instância adicional que não mantém um conjunto de dados, mas fornece um quorum em um conjunto de réplicas, respondendo a solicitações de pulsação e eleição de outros membros do conjunto de réplicas. membro do conjunto de réplicas com um conjunto de dados.
Failover automático
Um nó primário pode falhar devido a alguns motivos, como falta de energia ou desconexão da rede, portanto, não consegue se comunicar com os outros membros. Se a comunicação for cortada por mais do que o período de eleiçãoTimeoutMillis configurado, um dos secundários solicitará uma eleição para nomear a si mesmo como o novo primário. Se a eleição for concluída e bem-sucedida, o cluster continuará com a operação normal. Durante este período, nenhuma operação de gravação pode ser realizada. No entanto, as consultas de leitura podem ser configuradas para funcionar normalmente nos secundários enquanto o primário estiver offline.
Para um processo de replicação ideal, o tempo médio antes que o cluster eleja um novo primário no máximo deve ser de 12 segundos com as configurações de replicação padrão. Isso pode ser afetado por fatores como latência de rede, que pode estender o tempo, portanto, deve-se considerar a arquitetura do cluster para garantir que esse tempo não seja definido muito alto.
O valor para selectionTimeoutMillis pode ser reduzido do padrão 10000 (10 segundos), portanto, o primário pode ser detectado primeiro durante muito rápido. No entanto, isso pode estar chamando as eleições com frequência, mesmo para fatores menores, como latência temporária da rede, mesmo que o nó primário esteja íntegro. Isso levará a problemas como reversões para operações de gravação.
Ansible para conjuntos de réplicas
Conforme mencionado, um conjunto de réplicas pode ter membros de diferentes máquinas host, tornando a manutenção do cluster mais complexa. Precisamos de uma única plataforma a partir da qual esse conjunto de réplicas possa ser mantido com facilidade. O Ansible é uma das ferramentas que fornece uma visão geral melhor para configurar e gerenciar um conjunto de réplicas. Se você é novo no ansible, faça uma rápida recapitulação deste artigo para entender o básico, como criar um manual.
Parâmetros de configuração
- arbiter_at_index: isso define a posição do árbitro na lista de membros do conjunto de réplicas. Um árbitro lembra que não possui nenhum dado como os outros membros e não pode ser usado como o nó primário. Só está disponível para criar um quórum durante a eleição. Por exemplo, se você tiver um número par de membros, é bom adicionar um árbitro de modo que, se os votos forem iguais, adicione 1 para fazer um membro vencedor. O valor a ser atribuído deve ser um número inteiro.
- encadeamento_permitido: Isso recebe um valor booleano e define se os outros membros secundários devem replicar dos outros membros secundários se encadear _allowed =true. Caso contrário, se encadear _allowed =false, os outros membros secundários só poderão replicar a partir do primário. O valor padrão é verdadeiro.
- election_timeout_secs: por padrão, o valor é 10000 (toma um valor inteiro). É o tempo em milissegundos para detectar quando o nó primário não está acessível ou não se comunica com os outros membros, portanto, desencadeia uma eleição. Defina isso para um valor médio de 12 segundos. Se definido muito alto, levará muito tempo antes de detectar a falha primária e, portanto, mais tempo para fazer uma eleição. Como isso afeta a operação de gravação, você pode acabar perdendo muitos dados durante esse período. Por outro lado, se for definido muito baixo, haverá desencadeamento frequente de uma eleição, mesmo quando o caso não é tão grave e as primárias ainda são alcançáveis. Como resultado, você terá tantas reversões para operações de gravação que podem, em algum momento, levar a uma integridade ou inconsistência de dados ruim.
- heartbeat_timeout_secs: Os conjuntos de réplicas precisam se comunicar entre si antes de uma eleição enviando um sinal conhecido como pulsação. Os membros precisam então responder a essa sinalização dentro de um período específico que, por padrão, é definido como 10 segundos. Heartbeat_timeout_secs é o número de segundos que os membros do conjunto de réplicas aguardam por uma pulsação bem-sucedida uns dos outros e, se um membro não responder, ele será marcado como inacessível. No entanto, isso é aplicável apenas para a versão de protocolo 0. O valor para isso é, portanto, um número inteiro.
- login_host: Este é o host que hospeda o banco de dados de login. Por padrão para MongoDB é localhost.
- login_database: o padrão é o admin e é onde as credenciais de login são armazenadas.(toma um valor de string)
- login_user: o nome de usuário com o qual a autenticação deve ser feita. (toma um valor de string)
- login_password: a senha para autenticar o usuário. (toma um valor de string)
- login_port: Esta é a porta do MongoDB para o host fazer login. (toma um valor inteiro)
- membros: define uma lista de membros do conjunto de réplicas. É uma string separada por vírgula ou uma lista yaml, ou seja, mongodb0:27017,mongodb2:27018,mongodb3:27019… Se não houver um número de porta, o 27017 será assumido.
- versão_do protocolo: recebe um inteiro que define a versão do processo de replicação. 0 ou 1
- replica_set: este é um valor de string que define o nome do conjunto de réplicas.
- ssl: valor booleano que define se deve ser usada a conexão SSL ao conectar-se ao banco de dados ou não.
- ssl_certs_reqs: isso especifica se um certificado é necessário do outro lado da conexão e se haverá necessidade de validá-lo, se fornecido. As opções para isso são CERT_NONE, CERT_OPTIONAL e CERT_REQUIRED. O padrão é CERT_REQUIRED.
- validar: recebe um valor booleano que define se deve ser feita qualquer validação básica na configuração do conjunto de réplicas fornecido. O valor padrão é verdadeiro.
Criando um conjunto de réplicas do MongoDB usando o Ansible
Aqui está um exemplo simples de tarefas para configurar uma réplica definida em ansible. Vamos chamar esse arquivo de tasks.yaml
# Create a replicaset called 'replica0' with the 3 provided members
- name: Ensure replicaset replica0 exists
mongodb_replicaset:
login_host: localhost
login_user: admin
login_password: root
replica_set: replica0
arbiter_at_index:2
election_timeout_secs:12000
members:
- mongodb1:27017
- mongodb2:27018
- mongodb3:27019
when: groups.mongod.index(inventory_hostname) == 0
# Create two single-node replicasets on the localhost for testing
- name: Ensure replicaset replica0 exists
mongodb_replicaset:
login_host: localhost
login_port: 3001
login_user: admin
login_password: root
login_database: admin
replica_set: replica0
members: localhost:3000
validate: yes
- name: Ensure replicaset replica1 exists
mongodb_replicaset:
login_host: localhost
login_port: 3002
login_user: admin
login_password: secret
login_database: root
replica_set: replica1
members: localhost:3001
validate: yes
Em nosso playbook podemos chamar as tarefas como
---
- hosts: ansible-test
remote_user: root
become: yes
Tasks:
- include: tasks.yml
Se você executar isso em seu playbook, ansible-playbook -i inventário.txt -c ssh mongodbcreateReplcaSet.yaml, você receberá uma resposta se o conjunto de réplicas foi criado ou não. Se a chave mongodb_replicaset for retornada com um valor de sucesso e uma descrição do conjunto de réplicas que foi criado, então você está pronto para ir.
Conclusão
No MongoDB geralmente é tedioso configurar um conjunto de réplicas para as instâncias do mongod que podem ser hospedadas por máquinas diferentes. No entanto, o Ansible fornece uma plataforma simples para fazer o mesmo, apenas definindo alguns parâmetros, conforme discutido acima. A replicação é um dos processos que garante a operação contínua do aplicativo, portanto, deve ser bem configurado, definindo um número múltiplo de membros no mundo da produção. Um árbitro é usado para criar um quorum durante o processo de eleição, portanto, deve ser incluído no arquivo de configuração definindo sua posição.