Configurando Alta Disponibilidade com MySQL InnoDB Cluster e MySQL Router
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 update
# 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:
# mysqlsh
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:
MySQL JS > cluster.status()
Após alguns instantes, o resultado esperado é que o cluster esteja ONLINE:
{
"clusterName": "cluster_teste",
"defaultReplicaSet": {
"name": "default",
"primary": "node1:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"node1:3306": {
"address": "node1:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"node2:3306": {
"address": "node2:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"node3:3306": {
"address": "node3:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
},
"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.
Would you like to rejoin it to the cluster? [y/N]: y
The instance ‘node3:3306’ was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y
The cluster was successfully rebooted.
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
*************************** 1. row ***************************
cluster_id: 1
cluster_name: cluster_teste
default_replicaset: 1
description: Default Cluster
mysql_user_accounts: NULL
options: null
attributes: {"default": true}
1 row in set (0.00 sec)
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.
About author
Você pode gostar também
Melhore a performance do seu banco Postgres com o PGbadger
O seu banco Postgres está lento? Você já alterou diversas configurações e mesmo assim não conseguiu identificar os problemas de performance? Pois bem, há uma luz no fim do tunel!
Moodle – Descomplicando a instalação
Caro leitor, nesse artigo vamos tentar descomplicar a instalação do ambiente virtual de aprendizado Moodle para quem está iniciando o uso desta plataforma. Para isso, utilizaremos o Vagrant para provisionar
Pane em sistema apaga 16.500 processos do TCE-AM: 4Linux é contratada para recuperação
O TCE-AM (Tribunal de Contas do Estado do Amazonas) teve 16.500 processos apagados indevidamente devido a uma pane nos sistemas e-Contas e Spede (Sistema de Processos e Documentos Eletrônicos) depois