Sobes.tech
Senior

Aké máte skúsenosti s nastavením externého nástroja na hlasovanie za vodcu v klastre Galera?

sobes.tech AI

Odpoveď od AI

Skúsenosti s nastavovaním vonkajšieho nástroja na hlasovanie za lídra v Galera klastere neexistujú. V Galera nie je vedenie určené vonkajším nástrojom; všetky uzly v klasteri sú rovnoprávne a môžu súčasne spracovávať požiadavky na zápis (za dodržiavania pravidiel replikácie). Mechanizmus výberu "lídra" alebo primárneho uzla pre určité úlohy (napríklad monitoring alebo administratívne operácie) sa zvyčajne implementuje na úrovni aplikácie, load balanceru alebo pomocou externých nástrojov na monitoring a orchestráciu, nie ako vstavaný nástroj na hlasovanie za lídra v kontexte práce Galera.

Na správu Galera klastera a výber uzla pre špecifické úlohy môžu byť použité:

  • ProxySQL / HAProxy: Load balancery, ktoré môžu smerovať prenos na určitý uzol na základe jeho stavu.
  • Keepalived / Pacemaker: Nástroje na zabezpečenie vysokej dostupnosti, ktoré môžu prideliť virtuálnu IP adresu aktívnemu uzlu.
  • Nástroje na monitoring (napríklad Prometheus + Alertmanager): Umožňujú sledovať stav uzlov a prijímať rozhodnutia (napríklad prepínanie prenosu).

V kontexte Galera je dôležitejšie zabezpečiť:

  • Kvórum na zabránenie scénarov split-brain.
  • Správne nastavenie wsrep_cluster_address a wsrep_sst_auth.
  • SST (State Snapshot Transfer) pri pridávaní nových uzlov.

Ak je úlohou určiť "najzdravší" uzol pre administratívne operácie, ide skôr o otázku monitorovania a výberu na základe metrík, nie o hlasovanie za lídra v Galera.


Príklad použitia ProxySQL na smerovanie prenosu na jeden uzol (pre špecifické úlohy):

-- Pridanie všetkých uzlov Galera do ProxySQL
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (10, 'node1', 3306), (10, 'node2', 3306), (10, 'node3', 3306);

-- Vytvorenie pravidla na smerovanie požiadaviek na čítanie na všetky uzly (hostgroup 10)
INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (10, 10);

-- Vytvorenie samostatnej hostgroup pre "administratívny" uzol (napríklad, node1)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, 'node1', 3306);

-- Pravidlo na smerovanie určitých požiadaviek (napríklad, SHOW STATUS) na "administratívny" uzol (hostgroup 20)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup) VALUES (1, 1, 'SHOW STATUS', 20);

-- Načítanie zmien do runtime a uloženie
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;

V tomto príklade ne "hlasujeme" za lídra, ale používame ProxySQL na smerovanie prenosu na určitý (-é) uzol (-y), čo môže byť interpretované ako výber uzla na vykonanie určitých úloh.


Príklad použitia Keepalived na virtuálny IP:

#!/bin/bash
# Pseudo-kód pre skript na kontrolu zdravia s Keepalived
# Tento skript bude bežať na každom uzle v 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
  # Uzol je synchronizovaný (4) a v primárnom skupine
  exit 0 # Zdravý
else
  exit 1 # Nezdravý
fi
# Pseudo-kód pre konfiguráciu Keepalived (vrrp_script blok)
vrrp_script check_galera {
  script "/etc/keepalived/scripts/check_galera.sh"
  interval 2 # kontrola každé 2 sekundy
  timeout 3 # časový limit po 3 sekundách
  weight 50 # zvýši prioritu o 50 ak skript uspe
}

vrrp_instance VI_1 {
  state BACKUP # predvolené stav
  interface eth0 # sieťové rozhranie
  virtual_router_id 51 # jedinečný ID pre VRRP inštanciu
  priority 100 # priorita na tomto uzle (vyššia = pravdepodobnejšie MASTER)
  advert_int 1 # interval oznámení

  authentication {
    auth_type PASS
    auth_pass your_password
  }

  virtual_ipaddress {
    192.168.1.100 # virtuálna IP adresa
  }

  track_script {
    check_galera # sledovanie skriptu na kontrolu
  }
}

Tu Keepalived používa skript na kontrolu stavu Galera a prideľuje virtuálnu IP iba "zdravému" uzlu s najvyšším priorítom, čo umožňuje mať jednotný prístup k klastru pre zápis, ale to nie je systém hlasovania za lídra vnútri Galera. Toto je systém výberu aktívneho uzla pre virtuálnu IP.

Moje skúsenosti sú spojené s konfiguráciou a údržbou týchto mechanizmov na zabezpečenie vysokej dostupnosti a riadenia prevádzky v Galera klastroch.