Alta Disponibilidade do MySQL com InnoDB Cluster - Blog 4Linux
13 de novembro de 2018 Arlindo Neto 5426 Views
Alta disponibilidade é um recurso que os bancos de dados — sejam eles relacionais ou não (NoSQL) — devem possuir para serem respeitados no mercado. A topologia master-slave já é consolidada no meio relacional (PostgreSQL, MySQL, Oracle, etc), mas existe a demanda de que o processo de chaveamento entre master e standby seja feito de forma automática e transparente para a aplicação.
A partir da versão 5.7, o MySQL dispõe do InnoDB Cluster, uma solução para High Availability (HA) com o banco de dados MySQL. Em conjunto com o AdminAPI, fornecido pelo MySQL Shell, é fácil administrar um conjunto de 3 ou mais servidores MySQL compondo o InnoDB Cluster.
Este tutorial visa configurar um cluster em três máquinas com sistema operacional Debian 9.
Instalação InnoDB Cluster
Para esse tutorial, precisamos de três máquinas com a última versão do MySQL instalada.
Antes de iniciar a configuração do cluster, precisamos garantir que os hostnames das máquinas que irão compor o cluster sejam resolvidos apontando para endereços externos. Em Linux, isso é feito através do arquivo /etc/hosts. Neste exemplo, três entradas foram adicionadas ao início do arquivo em todas as máquinas:
192.168.200.10 node1
192.168.200.20 node2
192.168.200.30 node3
É necessário instalar o MySQL Shell nas três máquinas. Para instalar o MySQL Shell em sistemas operacionais Debian, execute:
# apt install mysql-shell
Após a instalação do MySQL Shell, podemos proceder com a implementação do Cluster.
Inicialmente, crie um usuário para administrar o cluster. Este usuário não precisa ser o usuário root. Assim, criamos um usuário com todos os privilégios necessários nas três máquinas que irão compor o cluster.
mysql> CREATE USER 'cluster_admin'@'%' IDENTIFIED BY '4linux';
mysql> GRANT ALL ON *.* TO 'cluster_admin'@'%' WITH GRANT OPTION;
Acesse o MySQL Shell e conecte-se ao servidor node1:
MySQL JS > \connect cluster_admin@node1
# Insira sua senha, e digite yes para salvar a senha
É necessário realizar algumas alterações de parâmetros e reiniciar o banco de dados MySQL nas três máquinas. Felizmente, isso é abstraído e facilitado através do MySQL Shell. Prepare as instâncias através do comando dba.configureInstance() e passe como parâmetro o usuário e hostname da máquina a ser configurada:
MySQL JS > dba.configureInstance('cluster_admin@node1')
MySQL JS > dba.configureInstance('cluster_admin@node2')
MySQL JS > dba.configureInstance('cluster_admin@node3')
Finalmente podemos criar o nosso cluster. Ainda conectado no mysqlsh, crie o objeto JavaScript cluster através do comando dba.createCluster():
MySQL JS > var cluster = dba.createCluster('meuCluster')
Para verificar o status do cluster, utilize o método status():
MySQL JS > cluster.status()
Um cluster com apenas um nó não tem valor algum. Adicione o node2 e node3 ao cluster:
MySQL JS > cluster.addInstance('cluster_admin@node2');
MySQL JS > cluster.addInstance('cluster_admin@node3');
Verifique o status do cluster novamente:
Após alguns instantes, o resultado esperado é que o cluster esteja ONLINE:
"clusterName": "cluster_teste",
"primary": "node1:3306",
"groupInformationSourceMember": "mysql://cluster_admin@node1:3306"
Caso o cluster inteiro caia, é possível rebootar o cluster inteiro. Para isso use o comando dba.rebootClusterFromCompleteOutage():
MySQL JS > dba.rebootClusterFromCompleteOutage('cluster_teste')
Reconfiguring the cluster 'cluster_teste' from complete outage…
The instance 'node2:3306' was part of the cluster configuration.
The instance 'node3:3306' was part of the cluster configuration.
Se você se esquecer qual era o nome do seu cluster, acesse a tabela clusters na base mysql_innodb_cluster_metadata:
mysql> select * from mysql_innodb_cluster_metadata.clusters\G
cluster_name: cluster_teste
Após ter configurado o InnoDB Cluster, é necessário implementar um middleware capaz de conectar a aplicação com o cluster, para que o processo de failover seja efetuado de forma transparente para a aplicação.
MySQL Router é um componente do InnoDB Cluster, e se trata de um middleware que provê roteamento transparente entre a sua aplicação e as instâncias MySQL do cluster. Este middleware pode ser utilizado em diversos casos, como ao prover alta disponibilidade e escalabilidade ao rotear tráfego vindos da aplicação para back-ends MySQL apropriados. Sua arquitetura modular também permite que desenvolvedores ampliem os usos o MySQL Router.
O MySQL usa Group Replication para replicar dados entre múltiplas instâncias, ao mesmo tempo gerenciando failover automático em casos de quedas no servidor. Quando utilizado em conjunto com o InnoDB Cluster, o Router funciona como um proxy escondendo instâncias MySQL e redirecionando aos nós do cluster. A forma recomendada de se instalar o MySQL Router é junto ao servidor de aplicação.
Instale o MySQL Router em seu servidor de aplicação:
$ apt install mysql-router
Conecte-se a qualquer nó do cluster:
$ mysqlrouter --bootstrap cluster_admin@node1:330 --directory /opt/myrouter --user cluster_admin
cluster_admin@node1:3306 corresponde ao usuário, hostname e porta a ser utilizada para conexão, respectivamente. A opção –directory faz com que um diretório seja automaticamente gerado com todos os arquivos de configuração e diretórios necessários para o MySQL Router. A opção –user define que o usuário cluster_admin do sistema operacional será responsável pelo gerenciamento dos arquivos de configuração definidos pelo parâmetro –directory /opt/myrouter, neste exemplo.
Ao emitir este comando, 4 portas são abertas:
Porta 6446: Conexões comuns de escrita ao MySQL, redireciona a escrita ao nó primário
Porta 64460: Conexões de escritas à X API do MySQL, utilizada pelo MySQL Shell e pelo X Dev API, para utilizar o MySQL como DocumentStore.
Porta 6447: Conexões comuns de leitura ao MySQL, redireciona a leituras aos nós secundários utilizando o algoritmo round-robin.
Porta 64470: Conexões de leituras à X Api do MySQL, utilizada pelo MySQL Shell e pelo X Dev API, para utilizar o MySQL como DocumentStore. Realiza leituras aos nós secundários utilizando o algoritmo round-robin.
Tendo configurado o InnoDB Cluster com o MySQL Router, basta alterar o código da sua aplicação redirecionando comandos de escrita para a porta 6446/64460, e comandos de leitura para a porta 6647/66470.
Anterior O Gerente de TI que usou software livre e como ele matou sua galinha dos ovos de ouro
Próxima Log de Linux com o SystemD/Journald
Tags Alta DisponibilidadeInnoDB ClusterMySQL
O pgAdmin4 é a plataforma de administração e desenvolvimento open source mais popular para PostgreSQL. Neste post, vamos instalar e configurar esta ferramenta via Docker. DOCKER Compartilhe este post: Share