Alta Disponibilidade do MySQL com InnoDB Cluster

Alta Disponibilidade do MySQL com InnoDB Cluster

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.

 

CURSOSCONSULTORIA    CONTATO

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

About author

Arlindo Neto
Arlindo Neto 7 posts

Arlindo Neto é administrador de banco de dados apaixonado por PostgreSQL. Cursa Ciência da Computação. Atua com foco em banco de dados open-source, possuindo 3 anos de experiência profissional em análise e engenharia de dados. Acumula experiência em projetos envolvendo PostgreSQL, MariaDB, MySQL e MongoDB. No momento vem atuando com Python, com ênfase em aplicações para Big Data. Possui expertise como professor, desenvolvendo e aplicando cursos sobre Linux e tecnologias Open Source, detém certificação EnterpriseDB PostgreSQL 9.6

View all posts by this author →

Você pode gostar também

Banco de Dados

Instalação do MySQL 8 em Debian e CentOS

Ao tentar instalar o MySQL – o banco de dados open-source mais popular do mundo – você pode ser surpreendido no final do processo ao obter o MariaDB. Este fork

Banco de Dados

Introdução ao CouchDB

CouchDB é um banco de dados NoSQL orientado a documentos. Utiliza JSON como formato de dados e JavaScript como linguagem de consulta. Diferente da maioria dos outros bancos de dados,

Banco de Dados

Como restaurar a senha de root do MySQL

Em muitas situações é necessário resgatar a senha para o usuário root no banco de dados MySQL. Entre elas, a mais comum é a necessidade de prestar manutenção a um