Há diferentes motivos para adicionar um balanceador de carga entre seu aplicativo e seu banco de dados. Se você tem alto tráfego (e deseja balancear o tráfego entre diferentes nós de banco de dados) ou deseja usar o load balancer como um único endpoint (portanto, em caso de failover, esse load balancer lidará com esse problema enviando o tráfego para o nó disponível/íntegro.) Também pode ser que você queira usar portas diferentes para gravar e ler dados do seu banco de dados.
Em todos esses casos, um balanceador de carga será útil para você, e se você tiver um cluster MariaDB, uma opção para isso é usar o MaxScale que é um proxy de banco de dados para bancos de dados MariaDB.
Neste blog, mostraremos como instalá-lo e configurá-lo manualmente e como o ClusterControl pode ajudá-lo nessa tarefa. Para este exemplo, usaremos um cluster de replicação MariaDB com 1 nó mestre e 1 nó escravo e CentOS8 como sistema operacional.
Como instalar o MaxScale
Vamos supor que você tenha seu banco de dados MariaDB funcionando e também uma máquina (virtual ou física) para instalar o MaxScale. Recomendamos que você use um host diferente, portanto, em caso de falha do mestre, o MaxScale pode fazer failover para o nó escravo, caso contrário, o MaxScale não poderá executar nenhuma ação se o servidor em que está sendo executado ficar inativo.
Existem diferentes maneiras de instalar o MaxScale, neste caso, usaremos os repositórios MariaDB. Para adicioná-lo ao servidor MaxScale, você deve executar:
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
[info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo
[info] Adding trusted package signing keys...
[info] Successfully added trusted package signing keys
Agora, instale o pacote MaxScale:
$ yum install maxscale
Agora que você tem seu nó MaxScale instalado, antes de começar, você precisa configurá-lo.
Como configurar o MaxScale
Como o MaxScale executa tarefas como autenticação, monitoramento e muito mais, você precisa criar um usuário de banco de dados com alguns privilégios específicos:
MariaDB [(none)]> CREATE USER 'maxscaleuser'@'%' IDENTIFIED BY 'maxscalepassword';
MariaDB [(none)]> GRANT SELECT ON mysql.user TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SELECT ON mysql.db TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SELECT ON mysql.tables_priv TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SELECT ON mysql.roles_mapping TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SHOW DATABASES ON *.* TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT REPLICATION CLIENT on *.* to 'maxscaleuser'@'%';
Lembre-se de que as versões 10.2.2 a 10.2.10 do MariaDB também requerem:
MariaDB [(none)]> GRANT SELECT ON mysql.* TO 'maxscaleuser'@'%';
Agora que você tem o usuário do banco de dados pronto, vamos ver os arquivos de configuração. Ao instalar o MaxScale, o arquivo maxscale.cnf será criado em /etc/. Existem várias variáveis e diferentes formas de configurá-lo, então vamos ver um exemplo:
$ cat /etc/maxscale.cnf
# Global parameters
[maxscale]
threads = auto
log_augmentation = 1
ms_timestamp = 1
syslog = 1
# Server definitions
[server1]
type=server
address=192.168.100.126
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=192.168.100.127
port=3306
protocol=MariaDBBackend
# Monitor for the servers
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=maxscaleuser
password=maxscalepassword
monitor_interval=2000
# Service definitions
[Read-Only-Service]
type=service
router=readconnroute
servers=server2
user=maxscaleuser
password=maxscalepassword
router_options=slave
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1
user=maxscaleuser
password=maxscalepassword
# Listener definitions for the services
[Read-Only-Listener]
type=listener
service=Read-Only-Service
protocol=MariaDBClient
port=4008
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
Nesta configuração, temos 2 nós de banco de dados, 192.168.100.126 (Mestre) e 192.168.100.127 (Escravo), como você pode ver na seção Definição de Servidores.
Temos também 2 serviços diferentes, um para somente leitura, onde há o nó escravo, e outro para leitura-gravação, onde há o nó mestre.
Finalmente, temos 2 ouvintes, um para cada serviço. O listener somente leitura, escutando na porta 4008, e o read-write escutando na porta 4006.
Este é um arquivo de configuração básico. Se você precisar de algo mais específico, pode seguir a documentação oficial do MariaDB.
Agora você está pronto para iniciá-lo, então basta executar:
$ systemctl start maxscale.service
E verifique:
$ maxctrl list services
ff $ maxctrl list servers
Você pode encontrar uma lista de comandos maxctrl aqui, ou você pode até usar maxadmin para gerenciá-lo.
Agora vamos testar a conexão. Para isso, você pode tentar acessar seu banco de dados usando o endereço IP MaxScale e a porta que deseja testar. No nosso caso, o tráfego na porta 4006 deve ser enviado para o servidor1 e o tráfego na porta 4008 para o servidor2.
$ mysql -h 192.168.100.128 -umaxscaleuser -pmaxscalepassword -P4006 -e 'SELECT @@hostname;'
+------------+
| @@hostname |
+------------+
| server1 |
+------------+
$ mysql -h 192.168.100.128 -umaxscaleuser -pmaxscalepassword -P4008 -e 'SELECT @@hostname;'
+------------+
| @@hostname |
+------------+
| server2 |
+------------+
Funciona!
Como implantar MaxScale com ClusterControl
Vamos ver agora, como você pode usar o ClusterControl para simplificar essa tarefa. Para isso, vamos supor que você tenha seu cluster MariaDB adicionado ao ClusterControl.
Vá para ClusterControl -> Selecione o cluster MariaDB -> Cluster Actions -> Add Load Balancer -> MaxScale.
Aqui você pode implantar um novo nó MaxScale ou também importar um nó existente 1. Se você estiver implantando, precisará adicionar o endereço IP ou o nome do host, as credenciais MaxScale de administrador e usuário, quantidade de threads e portas (gravação e somente leitura). Você também pode especificar qual nó de banco de dados deseja adicionar à configuração MaxScale.
Você pode monitorar a tarefa na seção ClusterControl Activity. Quando terminar, você terá um novo nó MaxScale em seu cluster MariaDB.
E executando os comandos MaxScale da interface do usuário do ClusterControl sem a necessidade de acessar o servidor via SSH.
Parece mais fácil do que implantá-lo manualmente, certo?
Conclusão
Ter um Load Balancer é uma boa solução se você deseja balancear ou dividir seu tráfego, ou mesmo para ações de failover, e o MaxScale, como produto MariaDB, é uma boa opção para bancos de dados MariaDB.
A instalação é fácil, mas a configuração e o uso podem ser difíceis se for algo novo para você. Nesse caso, você pode usar o ClusterControl para implantá-lo, configurá-lo e gerenciá-lo de maneira mais fácil.