Sobes.tech
Senior

Ποια εμπειρία έχετε στη ρύθμιση ενός εξωτερικού εργαλείου για την ψηφοφορία για τον ηγέτη σε ένα cluster Galera;

sobes.tech AI

Απάντηση από AI

Δεν υπάρχει εμπειρία στη ρύθμιση εξωτερικού εργαλείου για ψηφοφορία για τον ηγέτη σε cluster Galera. Στο Galera, η ηγεσία δεν καθορίζεται από εξωτερικό εργαλείο· όλοι οι κόμβοι του cluster είναι ισότιμοι και μπορούν ταυτόχρονα να επεξεργάζονται αιτήματα εγγραφής (υπό την προϋπόθεση τήρησης των κανόνων αναπαραγωγής). Ο μηχανισμός επιλογής "ηγέτη" ή πρωτεύοντος κόμβου για συγκεκριμένες εργασίες (π.χ. παρακολούθηση ή εκτέλεση διοικητικών λειτουργιών) υλοποιείται συνήθως σε επίπεδο εφαρμογής, φορτιστή ή με τη χρήση τρίτων εργαλείων παρακολούθησης και ορχήστρωσης, αλλά όχι ως ενσωματωμένο εργαλείο για ψηφοφορία για τον ηγέτη στο πλαίσιο του Galera.

Για τη διαχείριση του cluster Galera και την επιλογή κόμβου για συγκεκριμένες εργασίες μπορούν να χρησιμοποιηθούν:

  • ProxySQL / HAProxy: Φορτιστές που μπορούν να κατευθύνουν την κυκλοφορία σε συγκεκριμένο κόμβο βάσει της κατάστασής του.
  • Keepalived / Pacemaker: Εργαλεία για την εξασφάλιση υψηλής διαθεσιμότητας, που μπορούν να αναθέσουν μια εικονική διεύθυνση IP σε ενεργό κόμβο.
  • Εργαλεία παρακολούθησης (π.χ. Prometheus + Alertmanager): Επιτρέπουν την παρακολούθηση της κατάστασης των κόμβων και τη λήψη αποφάσεων (π.χ. μεταφορά κυκλοφορίας).

Στο πλαίσιο του Galera, είναι πιο σημαντικό να διασφαλιστεί:

  • Το quorum για την αποφυγή σεναρίων split-brain.
  • Η σωστή ρύθμιση του wsrep_cluster_address και του wsrep_sst_auth.
  • Η SST (State Snapshot Transfer) κατά την προσθήκη νέων κόμβων.

Εάν ο στόχος είναι ο προσδιορισμός του "πιο υγιούς" κόμβου για διοικητικές εργασίες, αυτό είναι περισσότερο θέμα παρακολούθησης και επιλογής βάσει μετρικών, και όχι ψηφοφορίας για τον ηγέτη στο Galera.


Παράδειγμα χρήσης ProxySQL για κατεύθυνση κυκλοφορίας σε έναν κόμβο (για συγκεκριμένες εργασίες):

-- Προσθήκη όλων των κόμβων Galera στο ProxySQL
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (10, 'node1', 3306), (10, 'node2', 3306), (10, 'node3', 3306);

-- Δημιουργία κανόνα για κατεύθυνση ανάγνωσης σε όλους τους κόμβους (hostgroup 10)
INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (10, 10);

-- Δημιουργία ξεχωριστής ομάδας κόμβων για "διοικητικό" κόμβο (π.χ., node1)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, 'node1', 3306);

-- Κανόνας για κατεύθυνση συγκεκριμένων ερωτημάτων (π.χ., SHOW STATUS) στον "διοικητικό" κόμβο (hostgroup 20)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup) VALUES (1, 1, 'SHOW STATUS', 20);

-- Φόρτωση αλλαγών σε runtime και αποθήκευση
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;

Σε αυτό το παράδειγμα, δεν "ψηφίζουμε" για ηγέτη, αλλά χρησιμοποιούμε το ProxySQL για δρομολόγηση της κυκλοφορίας σε συγκεκριμένο κόμβο, που μπορεί να ερμηνευθεί ως επιλογή κόμβου για την εκτέλεση συγκεκριμένων εργασιών.


Παράδειγμα χρήσης Keepalived για εικονική IP:

#!/bin/bash
# Ψευδοκώδικας για ένα script ελέγχου υγείας Keepalived
# Αυτό το script θα τρέχει σε κάθε κόμβο 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
  # Düyü sinxronizasiya olunub (4) və əsas hissədədir
  exit 0 # Sağlam
else
  exit 1 # Sağlam deyil
fi
# Keepalived konfiqurasiyası üçün pseudo-kod (vrrp_script bloku)
vrrp_script check_galera {
  script "/etc/keepalived/scripts/check_galera.sh"
  interval 2 # hər 2 saniyədə bir yoxlama
  timeout 3 # 3 saniyə sonra timeout
  weight 50 # skript uğurlu olarsa prioriteti 50 artır
}

vrrp_instance VI_1 {
  state BACKUP # Standart vəziyyət
  interface eth0 # Şəbəkə interfeysi
  virtual_router_id 51 # VRRP instansiyası üçün unikal ID
  priority 100 # Bu nodun prioriteti (yüksək = daha çox MASTER olma ehtimalı)
  advert_int 1 # Elan intervalı

  authentication {
    auth_type PASS
    auth_pass your_password
  }

  virtual_ipaddress {
    192.168.1.100 # Virtual IP ünvanı
  }

  track_script {
    check_galera # Sağlamlıq yoxlama skriptini izləyir
  }
}

Burada Keepalived, Galera vəziyyətini yoxlayan skript istifadə edir və yalnız "sağlam" nodu ən yüksək prioritetlə virtual IP ilə təyin edir, bu da yazma üçün tək giriş nöqtəsi təmin edir, lakin bu, Galera daxilində lider üçün səsvermə sistemi deyil. Bu, virtual IP üçün aktiv nodu seçmək sistemidir.