Como configurar um Galera Cluster com o MySQL em servidores Ubuntu 18.04.

O autor selecionou o Free and Open Source Fund para receber uma doação como parte do programa Write for DOnations.

Introdução

O clustering proporciona alta disponibilidade ao seu banco de dados pela distribuição das alterações para servidores diferentes. Caso uma das instâncias falhe, as demais ficam rapidamente disponíveis para continuar a atender.

Os clusters vêm em duas configurações gerais, ativo-passivo e ativo-ativo. Em clusters do tipo ativo-passivo, todas as gravações são feitas em um único servidor ativo e, em seguida, copiadas para um ou mais servidores passivos que estão prontos para assumir – apenas se houver uma falha ativa no servidor. Alguns clusters do tipo ativo-passivo também permitem operações SELECT em nós passivos. Em um cluster do tipo ativo-ativo, cada nó é de leitura-gravação e uma alteração feita em um nó é reproduzida para todos.

O MySQL é um sistema de gerenciamento de banco de dados relacional de código aberto, sendo uma escolha popular para os bancos de dados SQL. O Galera é uma solução de clustering de banco de dados que permite que você configure clusters com múltiplos mestres usando replicação síncrona. O Galera consegue manter – de modo automático – dados em nós diferentes em sincronia, ao mesmo tempo em que permite que você envie consultas de leitura e gravação a qualquer um dos nós no cluster. Você pode aprender mais sobre o Galera na página de documentação oficial.

Neste guia, você irá configurar o cluster Galera, do tipo ativo-ativo, no MySQL. A título de demonstração, você irá configurar e testar três Droplets do Ubuntu 18.04, que atuarão como nós no cluster. Essa quantidade de nós é a menor configuração possível de um cluster.

Pré-requisitos

Para continuar, você precisará de uma conta DigitalOcean, além do seguinte:

  • Três Droplets do Ubuntu 18.04 com rede privada habilitada, cada qual com um usuário não raiz com privilégios sudo.
    • Para configurar uma rede privada nos três Droplets, siga nosso guia de Início rápido para redes privadas.
    • Para obter ajuda com a configuração de um usuário não raiz com privilégios sudo, siga nosso tutorial Configuração Inicial de servidor com o Ubuntu 18.04.

Embora os passos neste tutorial tenham sido escritos e testados em relação aos Droplets da DigitalOcean, grande parte deles também será aplicável a servidores que não sejam da DigitalOcean com a rede privada habilitada.

Passo 1 — Adicionando os repositórios do MySQL para todos os servidores

Neste passo, você adicionará os repositórios de pacotes do MySQL e Galera relevantes para cada um dos seus três servidores, de modo que você possa instalar a versão correta do MySQL e do Galera usadas neste tutorial.

Nota: a Codership, empresa por trás do Galera Cluster, mantém o repositório do Galera, mas saiba que nem todos os repositórios externos são confiáveis. Certifique-se de instalar apenas a partir de fontes confiáveis.

Neste tutorial, você usará o MySQL versão 5.7. Você começará adicionando o repositório externo do Ubuntu, mantido pelo projeto Galera, aos seus três servidores.

Assim que os repositórios forem atualizados nos três servidores, você estará pronto para instalar o MySQL junto com o Galera.

Primeiro, nos seus três servidores, adicione a chave de repositório do Galera com o comando apt-key, a qual o gerenciador de pacotes APT usará para verificar se o pacote é autêntico:

  • sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Depois de alguns segundos, você receberá o seguinte resultado:

OutputExecuting: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA gpg: key D669017EBC19DDBA: public key "Codership Oy <[email protected]>" imported gpg: Total number processed: 1 gpg:               imported: 1 

Assim que tiver a chave confiável no banco de dados de cada servidor, poderá adicionar os repositórios. Para fazer isso, crie um novo arquivo chamado galera.list dentro do diretório /etc/apt/sources.list.d/ em cada servidor:

  • sudo nano /etc/apt/sources.list.d/galera.list

No editor de texto, adicione as seguintes linhas, as quais tornarão os repositórios apropriados disponíveis ao gerenciador de pacotes APT:

/etc/apt/sources.list.d/galera.list

deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main deb http://releases.galeracluster.com/galera-3/ubuntu bionic main 

Salve e feche os arquivos em cada servidor (pressione CTRL + X, Y e, então, ENTER).

Agora, os repositórios da Codership estão disponíveis aos seus três servidores. No entanto, é importante que você instrua a apt a dar preferência aos repositórios da Codership em vez de outros repositórios, no intuito de assegurar que ela instale as versões corrigidas do software necessárias para criar um cluster Galera. Para fazer isso, crie outro arquivo novo chamado galera.pref, dentro do diretório /etc/apt/preferences.d/ de cada servidor:

  • sudo nano /etc/apt/preferences.d/galera.pref

Adicione as seguintes linhas ao editor de texto:

/etc/apt/preferences.d/galera.pref

# Prefer Codership repository Package: * Pin: origin releases.galeracluster.com Pin-Priority: 1001 

Salve e feche aquele arquivo e, em seguida, execute o seguinte comando em cada servidor para incluir os manifestos dos pacotes dos novos repositórios:

  • sudo apt update

Agora que você adicionou o repositório de pacotes com sucesso nos seus três servidores, está pronto para instalar o MySQL na seção seguinte.

Passo 2 — Instalando o MySQL em todos os servidores

Neste passo, você instalará o pacote da MySQL nos seus três servidores.

Execute o comando a seguir nos três servidores para instalar uma versão do MySQL corrigida para funcionar com o Galera, além do pacote Galera.

  • sudo apt install galera-3 mysql-wsrep-5.7

Você será solicitado a confirmar se deseja prosseguir com a instalação. Digite Y para continuar com a instalação. Durante a instalação, também será solicitado que defina uma senha para o usuário administrativo do MySQL. Defina uma senha forte e pressione ENTER para continuar.

Assim que o MySQL estiver instalado, você irá desativar o perfil padrão do AppArmor para garantir que o Galera funcione corretamente, conforme a documentação oficial do Galera. O AppArmor é um módulo de kernel para o Linux que oferece a função de controle de acesso para serviços através de perfis de segurança.

Desabilite o AppArmor, executando o seguinte em cada servidor:

  • sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

Esse comando adiciona um link simbólico do perfil MySQL ao diretório disable, o que desativa o perfil na inicialização.

Em seguida, execute o seguinte comando para remover a definição do MySQL que já foi carregada no kernel.

  • sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Assim que tiver instalado o MySQL e desabilitado o perfil do AppArmor no seu primeiro servidor, repita esses passos para seus outros dois servidores.

Agora que você instalou o MySQL com sucesso em cada um dos três servidores, prossiga para o passo de configuração na seção seguinte.

Passo 3 — Configurando o primeiro nó

Neste passo, você irá configurar seu primeiro nó. Cada nó no cluster precisa ter uma configuração quase idêntica. Por conta disso, você fará toda a configuração no seu primeiro computador e, depois, irá copiá-la para os demais nós.

Por padrão, o MySQL está configurado para verificar o diretório /etc/mysql/conf.d para obter configurações adicionais dos arquivos que terminam em .cnf. No seu primeiro servidor, crie um arquivo neste diretório com todas as diretivas específicas do seu cluster:

  • sudo nano /etc/mysql/conf.d/galera.cnf

Adicione a seguinte configuração ao arquivo. A configuração especifica diferentes opções de cluster, detalhes sobre o servidor atual e os outros servidores no bem como as configurações relacionadas à replicação. Note que os endereços IP na configuração são os endereços privados dos seus respectivos servidores; substitua as linhas destacadas pelos endereços IP apropriados.

/etc/mysql/conf.d/galera.cnf

[mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0  # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so  # Galera Cluster Configuration wsrep_cluster_name="test_cluster" wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"  # Galera Synchronization Configuration wsrep_sst_method=rsync  # Galera Node Configuration wsrep_node_address="This_Node_IP" wsrep_node_name="This_Node_Name" 
  • A primeira seção modifica ou reestrutura as configurações do MySQL que permitirão que o cluster funcione corretamente. Por exemplo, o Galera não funcionará com o MyISAM ou mecanismos de armazenamento não transacionais semelhantes. Além disso, o mysqld não deve estar vinculado ao endereço IP do localhost. Você pode aprender sobre configurações mais detalhadamente na página de configuração do sistema do Galera Cluster.
  • A seção “Configuração de provedor do Galera” configura os componentes do MySQL que fornecem uma API de replicação do WriteSet. No seu caso, trata-se do Galera, propriamente dito, uma vez que o Galera é um provedor de wsrep (Replicação de WriteSet). Você especifica os parâmetros gerais para configurar o ambiente de replicação inicial. Isso não exige nenhuma personalização, mas você pode aprender mais sobre as opções de configuração do Galera na documentação.
  • A seção “Configuração do Galera Cluster” define o cluster, identificando os membros do cluster pelo endereço IP ou nome de domínio resolvível e criando um nome para o cluster – para garantir que os membros se juntem ao grupo correto. Você pode alterar o wsrep_cluster_name para algo mais significativo que test_cluster ou deixá-lo assim mesmo, mas deve atualizar o wsrep_cluster_address com os endereços IP privados dos seus três servidores.
  • A seção Configuração de sincronização do Galera define como o cluster estabelecerá a comunicação e sincronizará os dados entre os membros. Isso é usado apenas para a transferência de estado que acontece quando um nó fica online. Para sua configuração inicial, você está usando o rsync, pois ele pode ser encontrado facilmente e fará o que você irá precisar, por ora.
  • A seção Configuração de nó do Galera esclarece o endereço IP e o nome do servidor atual. Isso é útil quando se tenta dignosticar problemas nos registros e para referenciar cada servidor de várias maneiras. O wsrep_node_address deve corresponder ao endereço do computador em que você estiver trabalhando. Para ajudá-lo a identificar o nó nos arquivos de registros, você pode escolher o nome que desejar.

Quando estiver satisfeito com seu arquivo de configuração de cluster, copie o conteúdo para sua área de transferência e, em seguida, salve e feche o arquivo.

Agora que você configurou seu primeiro nó com sucesso, pode prosseguir com a configuração dos demais nós na próxima seção.

Passo 4 — Configurando os nós restantes

Neste passo, você irá configurar os dois nós restantes. No seu segundo nó, abra o arquivo de configuração:

  • sudo nano /etc/mysql/conf.d/galera.cnf

Cole a configuração que você copiou do primeiro nó; depois, atualize a Configuração de nó do Galera para usar o endereço IP ou nome de domínio resolvível para o nó específico que estiver definindo. Por fim, atualize seu nome, que pode ser definido como qualquer coisa que ajude você a identificar o nó em seus arquivos de registro:

/etc/mysql/conf.d/galera.cnf

. . . # Galera Node Configuration wsrep_node_address="This_Node_IP" wsrep_node_name="This_Node_Name" . . .  

Salve e saia do arquivo.

Assim que tiver completado esses passos, repita-os para o terceiro nó.

Você está quase pronto para iniciar o cluster. Antes disso, porém, certifique-se de que as portas apropriadas estão abertas em seu firewall.

Passo 5 — Abrindo o firewall em cada um dos servidores

Neste passo, você irá configurar seu firewall para que as portas necessárias – para a comunicação entre nós – estejam abertas. Em cada um dos servidores, verifique o status do firewall executando:

  • sudo ufw status

Neste caso, apenas o SSH é permitido:

OutputStatus: active  To                         Action      From --                         ------      ---- OpenSSH                    ALLOW       Anywhere OpenSSH (v6)               ALLOW       Anywhere (v6) 

Uma vez que, neste caso, somente é permitido o tráfego SSH, você precisará adicionar regras para o tráfego do MySQL e do Galera. Se tentasse iniciar o cluster, ele falharia por causa dessas regras do firewall.

O Galera pode usar quatro portas:

  • 3306, para conexões de cliente do MySQL e Transferência de snapshots (instantâneos) de Estado que usam o método mysqldump.
  • 4567, para o tráfego de replicação do Galera. A replicação multicast usa tanto o transporte UDP quanto o TCP nessa porta.
  • 4568, para Transferência incremental de estado.
  • 4444, para todas as demais transferências de snapshots de estado.

Neste exemplo, você abrirá todas as quatro portas enquanto faz sua configuração. Assim que tiver confirmado que a replicação está funcionando, você vai desejar fechar as portas que não estiver efetivamente usando e restringir o tráfego apenas aos servidores no cluster.

Abra as portas com os seguintes comandos:

  • sudo ufw allow 3306,4567,4568,4444/tcp
  • sudo ufw allow 4567/udp

Nota: dependendo do que mais estiver em execução em seus servidores, talvez você queira restringir o acesso imediatamente. O guia sobre Fundamentos do UFW: regras e comandos de firewall comuns poderá ajudar com isso.

Após ter configurado seu firewall no primeiro nó, crie as mesmas configurações de firewall no segundo e terceiro nós.

Agora que você configurou os firewalls com sucesso, está pronto para iniciar o cluster no passo seguinte.

Passo 6 — Inicializando o cluster

Neste passo, você irá inicializar o Galera Cluster do seu MySQL. Antes disso, porém, você irá habilitar o serviço systemd do MySQL, de modo que o MySQL será iniciado automaticamente sempre que o servidor for reinicializado.

Habilite o MySQL para iniciar na inicialização nos três servidores:

Use o seguinte comando em todos os três servidores para habilitar o serviço systemd do MySQL:

  • sudo systemctl enable mysql

Você verá o resultado a seguir, que mostra que o serviço foi vinculado com sucesso à lista de serviços da inicialização:

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service. 

Agora que habilitou o mysql para iniciar na inicialização de todos os servidores, está pronto para prosseguir e iniciar o cluster.

Inicie o primeiro nó

Para iniciar o primeiro nó, você precisará usar um script de inicialização especial. A maneira como você configurou seu cluster faz com que cada nó que fique online tente se conectar a pelo menos um outro nó especificado em seu arquivo Galera.cnf para obter seu estado inicial. Sem usar o script mysqld_bootstrap que permite que o systemd passe o parâmetro --wsrep-new-cluster, um systemctl start mysql normal falharia, pois não há nós em execução com os quais o primeiro nó possa se conectar.

Execute o seguinte no seu primeiro servidor:

  • sudo mysqld_bootstrap

Esse comando não exibirá nenhum resultado no caso de execução bem-sucedida. Quando este script for bem-sucedido, o nó será registrado como parte do cluster e você poderá vê-lo com o seguinte comando:

  • mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Após digitar sua senha, verá o seguinte resultado, indicando que há um nó no cluster:

Output+--------------------+-------+ | Variable_name      | Value | +--------------------+-------+ | wsrep_cluster_size | 1     | +--------------------+-------+  

Nos nós restantes, você poderá iniciar o mysql normalmente. Eles irão procurar por qualquer membro da lista do cluster que esteja online e, quando encontrarem algum, irão juntar-se ao cluster.

Inicie o segundo nó

Agora, você pode iniciar o segundo nó. Inicie o mysql:

  • sudo systemctl start mysql

Nenhum resultado será exibido no caso de execução bem-sucedida. Você verá o tamanho do seu cluster aumentar à medida que cada nó ficar online:

  • mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Você verá o seguinte resultado que indica que o segundo nó se juntou ao cluster e que há dois nós no total.

Output+--------------------+-------+ | Variable_name      | Value | +--------------------+-------+ | wsrep_cluster_size | 2     | +--------------------+-------+  

Inicie o terceiro nó

Agora, é hora de iniciar o terceiro nó. Inicie o mysql:

  • sudo systemctl start mysql

Execute o seguinte comando para obter o tamanho do cluster:

  • mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Você verá o seguinte resultado, que indica que o terceiro nó se juntou ao cluster e que há um total de três nós no cluster.

Output+--------------------+-------+ | Variable_name      | Value | +--------------------+-------+ | wsrep_cluster_size | 3     | +--------------------+-------+ 

Neste ponto, todo o cluster está online e se comunicando com sucesso. Em seguida, você poderá assegurar-se de que a configuração está funcionando testando a replicação na seção seguinte.

Passo 7 — Testando a replicação

Até aqui, você percorreu os passos que fizeram com que seu cluster pudesse executar a replicação de qualquer nó para qualquer outro nó – processo conhecido como replicação ativa-ativa. Neste passo, você testará e verá se a replicação está funcionando como esperado.

Escrever para o primeiro nó

Você começará fazendo alterações no banco de dados no seu primeiro nó. Os comandos a seguir criarão um banco de dados chamado playground e uma tabela dentro desse banco de dados chamada equipment.

  • mysql -u root -p -e 'CREATE DATABASE playground;
  • CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
  • INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

No comando anterior, a instrução CREATE DATABASE cria um banco de dados chamado playground. A instrução CREATE cria uma tabela chamada equipment dentro do banco de dados playground, tendo uma coluna de identificador de incremento automático chamada id e outras colunas. As colunas type, quant e color são definidas para armazenar o tipo, quantidade e cor do equipamento, respectivamente. A instrução INSERT insere uma entrada do tipo slide, quantidade 2 e cor blue.

Agora, você possui um valor na sua tabela.

Leitura e gravação no segundo nó

Em seguida, observe o segundo nó para verificar se a replicação está funcionando:

  • mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Os dados que você digitou no primeiro nó estarão visíveis aqui no segundo, provando que a replicação está funcionando:

Output+----+-------+-------+-------+ | id | type  | quant | color | +----+-------+-------+-------+ |  1 | slide |     2 | blue  | +----+-------+-------+-------+ 

A partir deste mesmo nó, grave os dados para o cluster:

  • mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Leitura e gravação no terceiro nó

A partir do terceiro nó, você poderá ler todos esses dados, consultando a tabela novamente:

  • mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Você verá o seguinte resultado, que mostra as duas linhas:

Output   +----+-------+-------+--------+    | id | type  | quant | color  |    +----+-------+-------+--------+    |  1 | slide |     2 | blue   |    |  2 | swing |    10 | yellow |    +----+-------+-------+--------+ 

Novamente, você pode adicionar outro valor a partir desse nó:

  • mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

Leitura no primeiro nó

De volta ao primeiro nó, você pode verificar se os seus dados estão disponíveis em toda parte:

  • mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Você verá o seguinte resultado, que indica que as linhas estão disponíveis no primeiro nó.

Output   +----+--------+-------+--------+    | id | type   | quant | color  |    +----+--------+-------+--------+    |  1 | slide  |     2 | blue   |    |  2 | swing  |    10 | yellow |    |  3 | seesaw |     3 | green  |    +----+--------+-------+--------+ 

Com isto, você verificou com sucesso que consegue gravar em todos os nós e que a replicação está sendo executada corretamente.

Conclusão

Neste ponto, você possui tem um Galera Cluster de trés nós configurado e operacional. Se planeja usar um Galera Cluster em uma situação de produção, é recomendável que comece com não menos que cinco nós.

Antes do uso na produção, talvez você queira examinar alguns outros agentes de transferência de snapshots de estado (sst), como o xtrabackup, que permite a configuração rápida de novos nós – sem grandes interrupções nos seus nós ativos. Isso não afeta a replicação propriamente dita, mas pode ser fonte de preocupação durante a inicialização dos nós.

Você também pode ter interesse em outras soluções de cluster para o MySQL e, nesse caso, pode verificar nosso tutorial de Como criar um cluster MySQL de vários nós no Ubuntu 18.04. Se estiver procurando testar uma solução de banco de dados gerenciada, consulte a documentação sobre Bancos de dados gerenciados da DigitalOcean.