Configurando Alta Disponibilidade com MySQL InnoDB Cluster e MySQL Router

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.

 

CURSOSCONSULTORIA    CONTATO

Anterior Gerente de TI: Como o uso de software livre pode reduzir custos
Próxima Entenda o poder do SystemD e Journald no gerenciamento de sistemas Linux

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

Como resolver o problema de deadlock em aplicações Java com PostgreSQL

Eis que o log da sua aplicação, num determinado INSERT, por exemplo em Java, mostra o seguinte erro: org.postgresql.util.PSQLException: ERROR: deadlock detected Trata-se do famoso e conhecido “deadlock”,mas aqui falaremos

Banco de Dados

Migrando dados do Moodle de PostgreSQL para Elasticsearch: um guia passo a passo

Recebi a missão de gerar relatórios e estatísticas com os dados do Moodle. Porém, o LMS trabalha somente com bancos de dados relacionais como PostgreSQL e MySQL. O ambiente que

Infraestrutura TI

Gerando Dados Aleatórios com Paralelização no Shell: Guia Prático

Gerar dados aleatórios com paralelização no shell. Falando assim parece até alguma coisa muito importante ou difícil, mas vamos entender sua utilidade na prática. Vez ou outra preciso de uma