Hoje em dia o número de serviços que fazem escalabilidade do banco de dados está crescendo cada vez mais, porém para algumas empresas o alto custo desses serviços pode ser um impeditivo. Nesse passo a passo irei mostrar como fazer de uma forma simples um cluster de escalabilidade do banco de dados

É claro que existem inúmeras formas e caminhos de fazer o que irei descrever aqui, porém como tive dificuldade de encontrar um formato mais claro na internet, irei dar o passo a passo do cluster mais simples possível que consegui fazer através dos meus estudos

Foram utilizados as seguintes tecnologias para fazer os passos

  • Ubuntu 18.04
  • Mariadb 10.3.14 (Esse foi o usado na minha instalação mais pode ser o mais atual)
  • Galera Cluster
  • Haproxy 1.8.8 (Esse foi o usado na minha instalação mais pode ser o mais atual)

Passos para a instalação do mariadb a partir do repositório oficial (isso é importante para garantir uma versão do mariadb que de suporte ao Galera Cluster)

$ sudo apt-get install software-properties-common
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ sudo add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'
$ sudo apt update
$ sudo apt -y install mariadb-server mariadb-client

Durante essa instalação vai ser solicitada a criação da senha para o root, porém ela pode ser criada posteriormente não importa

Confirme se a instalação foi concluída com sucesso verificando a versão do mysql

$ mysql -v

Configurações necessárias em todos os servidores (nós)

Vamos configurar primeiro o firewall para permitir requisições nas seguintes portas

$ ufw allow 3306
$ ufw allow 4567
$ ufw allow 4568
$ ufw allow 4444

No arquivo a seguir:

$ sudo vim /etc/mysql/mariadb.cnf

descomente a linha

character-set-server = utf8

adicionamos agora o arquivo de configuração do galera cluster

“coloquei separado a configuração que é geral e a configuração única do servidor, onde o arquivo galera.cnf é o geral (igual para todos), e o arquivo galera-node.conf é único em cada nó”

vim /etc/mysql/mariadb.conf.d/galera.cnf

Neste arquivo é necessário incluir o ips que serão utilizados separados por vírgula

ex.: wsrep_cluster_address=”gcomm://10.10.10.1,10.10.10.2,10.10.10.3”

O primeiro IP DEVE ser o do master

[mysqld]
bind-address=0.0.0.0
default_storage_engine=InnoDB
binlog_format=row
innodb_autoinc_lock_mode=2

# Galera cluster configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://IP.node1,IP.node2,IP.node3"
wsrep_cluster_name="mariadb-galera-cluster"
wsrep_sst_method=rsync

Agora vamos configurar o arquivo especifico de cada nó, neste arquivo é necessário informar o hostname referente ao server e o seu ip

vim /etc/mysql/mariadb.conf.d/galera-node.conf
# Cluster node configuration
wsrep_node_address="10.10.10.2 (ip do servidor)"
wsrep_node_name="galera-no-01(hostname do servidor)"

Após fazer a configuração em todos os nós pare o serviço do mariadb em todos eles

$ systemctl stop mariadb

Configuração para inicialização do serviço de replicação

No servidor que vai ter a função master rode o seguinte comando

$ galera_new_cluster

após rodar o comando verifique se deu certo com esse comando

$ mysql -u root -p -e "show status like 'wsrep_%'";

se tudo deu certo até aqui vamos verificar os nós do nosso cluster, ainda no servidor master rode o comando

$ mysql -u root -p -e "show status like 'wsrep_cluster_size'";

esse comando retornará o número de nós do nosso cluster, nesse momento esse número precisa ser 1 pois todos os outros nós estão com o serviço do mariadb parado, podemos agora ir em cada nó e subir o serviço

$ service mariadb start

se rodarmos novamente o comando em qualquer um dos nós ele retornará o número total de nós do nosso cluster

$ mysql -u root -p -e "show status like 'wsrep_cluster_size'";

Para testar agora é só logar em qualquer um dos nós, criar um database por ex. e verificar se a mudança foi refletida nos outros nós, neste momento poderiamos fazer INSERTS, UPDATES, SELECTS em qualquer um dos ips dos nós que automagicamente o galera cluster se encarrega de replicar para os outros os nós, vale lembrar que o galera cluster cuida sozinho para que não aconteça ids repetidos que poderiam inviabilizar a escalabilidade

Porém para escalarmos precisamos de um ip unico para usarmos em nossa aplicação e automatizar a escalabilidade, para isso vou usar o HAProxy fazendo os seguintes passos

Configuração do HAProxy

Antes de instalarmos o haproxy vamos criar um usuário no mysql que o haproxy usará para verificar a saúde dos nossos nós sql

$ mysql - u root -p
CREATE USER 'haproxy'@'10.132.%';
FLUSH PRIVILEGES;
quit;

Agora sim instalamos o haproxy

$ sudo apt-get install haproxy

A configuração ficará no seguinte arquivo

$ sudo vim /etc/haproxy/haproxy.cfg

Adicionamos no final desse arquivo a seguinte configuração, modificando no frontend o bind para o ip do próprio loadbalancer, e adicionando os servers no backend (fique atento a identação)

# Galera Cluster Frontend configuration
frontend galera_cluster_frontend
    bind 10.10.10.1(ip do load balancer):3306
    mode tcp
    option tcplog
    default_backend galera_cluster_backend

# Galera Cluster Backend configuration
backend galera_cluster_backend
    mode tcp
    option tcpka
    balance leastconn
    option mysql-check user haproxy
    server db-server-01 ip-do-no-01:3306  check weight 1
    server db-server-02 ip-do-no-02:3306  check weight 1
    server db-server-03 ip-do-no-03:3306  check weight 1

Obs. Na linha balancer também pode ser modificado o tipo de balanceamento entre os servidores, os valores permitidos são:

  • roundrobin
  • static-rr
  • first
  • source
  • leastconn

No meu caso utilizei o ‘leastconn’ que faz a requisição para o nó que tiver menos conexões ativas mais pode ser o que você preferir

Reinicie o serviço haproxy

$ service haproxy restart

Observações finais

  • Após a realização dessas configurações o acesso pode ser configurado normalmente com qualquer usuário existente utilizando o ip do loadbalancer
  • Mesmo a criação/edição de usuários e permissões é replicada, ou seja, só é preciso configurar em um server, e eles serão replicados
  • Para incluir um server temporário é só fazer a configuração do cluster dele mesmo e adicioná-lo ao haproxy (não é necessário o ajuste nos outros nós)