Sobes.tech
Senior

Qual a sua experiência na configuração de uma ferramenta externa para votar no líder num cluster Galera?

sobes.tech IA

Resposta da IA

Não existe experiência na configuração de uma ferramenta externa para votar pelo líder num cluster Galera. No Galera, a liderança não é determinada por uma ferramenta externa; todos os nós do cluster são iguais e podem processar solicitações de escrita simultaneamente (respeitando as regras de replicação). O mecanismo para escolher um "líder" ou nó primário para tarefas específicas (como monitoramento ou operações administrativas) geralmente é implementado ao nível da aplicação, do balanceador ou usando ferramentas externas de monitoramento e orquestração, mas não como uma ferramenta incorporada para votar pelo líder no contexto do Galera.

Para gerir um cluster Galera e selecionar nós para tarefas específicas, podem ser usados:

  • ProxySQL / HAProxy: Balanceadores de carga que podem direcionar o tráfego para um nó específico com base no seu estado.
  • Keepalived / Pacemaker: Ferramentas para garantir alta disponibilidade, que podem atribuir um endereço IP virtual ao nó ativo.
  • Ferramentas de monitorização (por exemplo, Prometheus + Alertmanager): Permitem monitorizar o estado dos nós e tomar decisões (como alterar o tráfego).

No contexto do Galera, é mais importante garantir:

  • Quórum para evitar cenários de split-brain.
  • Configuração correta de wsrep_cluster_address e wsrep_sst_auth.
  • SST (State Snapshot Transfer) ao adicionar novos nós.

Se a tarefa for determinar o nó "mais saudável" para operações administrativas, isso é mais uma questão de monitorização e seleção com base em métricas, e não de votar pelo líder no Galera.


Exemplo de uso do ProxySQL para direcionar o tráfego para um nó (para tarefas específicas):

-- Adicionar todos os nós Galera no ProxySQL
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (10, 'node1', 3306), (10, 'node2', 3306), (10, 'node3', 3306);

-- Criar regra para direcionar consultas de leitura para todos os nós (hostgroup 10)
INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (10, 10);

-- Criar um hostgroup separado para o "nó administrativo" (por exemplo, node1)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, 'node1', 3306);

-- Regra para direcionar certas consultas (por exemplo, SHOW STATUS) para o "nó administrativo" (hostgroup 20)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup) VALUES (1, 1, 'SHOW STATUS', 20);

-- Carregar alterações em runtime e guardar
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
LOAD MYSQL REPLICATION HOSTGROUPS TO RUNTIME;
SAVE MYSQL REPLICATION HOSTGROUPS TO DISK;

Neste exemplo, não estamos a "votar" pelo líder, mas a usar o ProxySQL para encaminhar o tráfego para um nó específico, o que pode ser interpretado como a escolha de um nó para realizar tarefas específicas.


Exemplo de uso do Keepalived para IP virtual:

#!/bin/bash
# Pseudo-código para um script de verificação de saúde do Keepalived
# Este script seria executado em cada nó do Galera

GALERA_STATUS=$(mysql -h 127.0.0.1 -e "SHOW STATUS LIKE 'wsrep_local_state';" | grep wsrep_local_state | awk '{print $2}')
GALERA_QUORUM=$(mysql -h 127.0.0.1 -e "SHOW STATUS LIKE 'wsrep_cluster_status';" | grep wsrep_cluster_status | awk '{print $2}')

if [ "$GALERA_STATUS" -eq 4 ] && [ "$GALERA_QUORUM" == "Primary" ]; then
  # O nó está sincronizado (4) e numa componente primária
  exit 0 # Saudável
else
  exit 1 # Não saudável
fi
# Pseudo-código para a configuração do Keepalived (bloco vrrp_script)
vrrp_script check_galera {
  script "/etc/keepalived/scripts/check_galera.sh"
  interval 2 # verificar a cada 2 segundos
  timeout 3 # tempo limite de 3 segundos
  weight 50 # aumentar prioridade em 50 se o script tiver sucesso
}

vrrp_instance VI_1 {
  state BACKUP # Estado padrão
  interface eth0 # interface de rede
  virtual_router_id 51 # ID único para a instância VRRP
  priority 100 # Prioridade neste nó (mais alto = mais provável de ser MASTER)
  advert_int 1 # intervalo de anúncio

  authentication {
    auth_type PASS
    auth_pass your_password
  }

  virtual_ipaddress {
    192.168.1.100 # O endereço IP virtual
  }

  track_script {
    check_galera # Rastrear o script de verificação
  }
}

Aqui, o Keepalived usa um script para verificar o estado do Galera e atribui o IP virtual apenas ao nó "saudável" com a prioridade mais alta, permitindo ter um ponto de acesso único ao cluster para escrita, mas isto não é um sistema de votação pelo líder dentro do Galera. É um sistema de seleção do nó ativo para o IP virtual.