[ English | Deutsch | Indonesia | русский | English (United Kingdom) ]

Galera-Cluster-Wartung

Die routinemäßige Wartung umfasst das Hinzufügen oder Entfernen von Knoten aus dem Cluster ohne Auswirkungen auf den Betrieb und das Starten eines Clusters nach dem ordnungsgemäßen Herunterfahren aller Knoten.

MySQL-Instanzen werden beim Erstellen eines Clusters neu gestartet, wenn ein Knoten hinzugefügt wird, wenn der Dienst nicht ausgeführt wird oder wenn Änderungen an der Konfigurationsdatei /etc/mysql/my.cnf vorgenommen werden.

Überprüfen Sie den Clusterstatus

Vergleichen Sie die Ausgabe des folgenden Befehls mit der folgenden Ausgabe. Es sollte Ihnen Informationen über den Status Ihres Clusters geben.

# ansible galera_container -m shell -a "mariadb \
-e 'show status like \"%wsrep_cluster_%\";'"
node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (2)

node2_galera_container-49a47d25 | FAILED | rc=1 >>
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (2)

node4_galera_container-76275635 | success | rc=0 >>
Variable_name             Value
wsrep_cluster_conf_id     7
wsrep_cluster_size        1
wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
wsrep_cluster_status      Primary

In diesem Beispiel hat nur ein Knoten geantwortet.

Wenn der MariaDB-Dienst auf allen außer einem Knoten ordnungsgemäß heruntergefahren wird, kann der verbleibende operative Knoten SQL-Anforderungen weiter verarbeiten. Wenn Sie mehrere Knoten ordnungsgemäß herunterfahren, führen Sie die Aktionen nacheinander aus, um den Vorgang beizubehalten.

Starten Sie einen Cluster

Wenn Sie alle Knoten ordnungsgemäß herunterfahren, wird der Cluster zerstört. Das Starten oder Neustarten eines Clusters von null Knoten erfordert das Erstellen eines neuen Clusters auf einem der Knoten.

  1. Starten Sie einen neuen Cluster auf dem am weitesten fortgeschrittenen Knoten. Wechseln Sie in das Verzeichnis playbooks und überprüfen Sie den Wert seqno in der Datei grastate.dat auf allen Knoten:

    # ansible galera_container -m shell -a "cat /var/lib/mysql/grastate.dat"
    node2_galera_container-49a47d25 | success | rc=0 >>
    # GALERA saved state version: 2.1
    uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
    seqno:   31
    cert_index:
    
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    # GALERA saved state version: 2.1
    uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
    seqno:   31
    cert_index:
    
    node4_galera_container-76275635 | success | rc=0 >>
    # GALERA saved state version: 2.1
    uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
    seqno:   31
    cert_index:
    

    In diesem Beispiel enthalten alle Knoten im Cluster die gleichen positiven seqno-Werte wie sie vor dem ordnungsgemäßen Herunterfahren synchronisiert wurden. Wenn alle seqno-Werte gleich sind, kann jeder Knoten den neuen Cluster starten.

    ## for init
    # /etc/init.d/mariadb start --wsrep-new-cluster
    ## for systemd
    # systemctl set-environment _WSREP_NEW_CLUSTER='--wsrep-new-cluster'
    # systemctl start mariadb
    # systemctl set-environment _WSREP_NEW_CLUSTER=''
    

    Please also have a look at Starting the Cluster.

    This can also be done with the help of Ansible using the shell module:

    # ansible galera_container -m shell -a "/etc/init.d/mariadb start --wsrep-new-cluster" --limit galera_container[0]
    

    Dieser Befehl führt zu einem Cluster, das einen einzelnen Knoten enthält. Der Wert wsrep_cluster_size gibt die Anzahl der Knoten im Cluster an.

    node2_galera_container-49a47d25 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (2)
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     1
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  2. Restart MariaDB on the other nodes (replace [0] from previous Ansible command with [1:]) and verify that they rejoin the cluster.

    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     3
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     3
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     3
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    

Galera-Cluster-Wiederherstellung

Run the openstack.osa.galera_server playbook using the galera_force_bootstrap variable to automatically recover a node or an entire environment.

  1. Führen Sie den folgenden Ansible-Befehl aus, um die ausgefallenen Knoten anzuzeigen:

    # openstack-ansible openstack.osa.galera_server -e galera_force_bootstrap=True --tags galera_server-config
    

You can additionally define a different bootstrap node through galera_server_bootstrap_node variable, in case current bootstrap node is in desynced/broken state. You can check what node is currently selected for bootstrap using this ad-hoc:

root@aio1:/opt/openstack-ansible# ansible -m debug -a var="groups['galera_all'][0]" localhost

The cluster comes back online after completion of this command. If this fails, please review restarting the cluster and recovering the primary component in the Galera documentation as they’re invaluable for a full cluster recovery.

Wiederherstellen eines Einzelknotenfehlers

Wenn ein einzelner Knoten fehlschlägt, behalten die anderen Knoten das Quorum und verarbeiten weiterhin SQL-Anforderungen.

  1. Wechseln Sie in das Verzeichnis playbooks und führen Sie den folgenden Ansible-Befehl aus, um den ausgefallenen Knoten zu bestimmen:

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server through
    socket '/var/run/mysqld/mysqld.sock' (111)
    
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    

    In diesem Beispiel ist Knoten 3 fehlgeschlagen.

  2. Starten Sie MariaDB auf dem fehlgeschlagenen Knoten neu, und vergewissern Sie sich, dass es erneut dem Cluster beitritt.

  3. If MariaDB fails to start, run the mariadbd command and perform further analysis on the output. As a last resort, rebuild the container for the node.

Stellen Sie einen Fehler mit mehreren Knoten wieder her

Wenn alle Knoten bis auf einen Knoten fehlschlagen, kann der verbleibende Knoten das Quorum nicht erreichen und die Verarbeitung von SQL-Anfragen beendet werden. In diesem Fall können ausgefallene Knoten, die wiederhergestellt werden, dem Cluster nicht beitreten, da er nicht mehr vorhanden ist.

  1. Führen Sie den folgenden Ansible-Befehl aus, um die ausgefallenen Knoten anzuzeigen:

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node2_galera_container-49a47d25 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     18446744073709551615
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      non-Primary
    

    In diesem Beispiel sind die Knoten 2 und 3 fehlerhaft. Der verbleibende betriebsfähige Server zeigt non-Primary an, da er das Quorum nicht erreichen kann.

  2. Run the following command to rebootstrap the operational node into the cluster:

    # mariadb -e "SET GLOBAL wsrep_provider_options='pc.bootstrap=yes';"
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     15
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node2_galera_container-49a47d25 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    

    Der verbleibende operative Knoten wird zum primären Knoten und beginnt mit der Verarbeitung von SQL-Anfragen.

  3. Starten Sie MariaDB auf den ausgefallenen Knoten neu und vergewissern Sie sich, dass sie dem Cluster wieder beitreten:

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  4. If MariaDB fails to start on any of the failed nodes, run the mariadbd command and perform further analysis on the output. As a last resort, rebuild the container for the node.

Wiederherstellen eines vollständigen Umgebungsfehlers

Von der Sicherung wiederherstellen, wenn alle Knoten in einem Galera-Cluster fehlschlagen (nicht ordnungsgemäß herunterfahren). Wechseln Sie in das Verzeichnis playbook und führen Sie den folgenden Befehl aus, um festzustellen, ob alle Knoten im Cluster ausgefallen sind:

# ansible galera_container -m shell -a "cat /var/lib/mysql/grastate.dat"
node3_galera_container-3ea2cbd3 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno:   -1
cert_index:

node2_galera_container-49a47d25 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno:   -1
cert_index:

node4_galera_container-76275635 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno:   -1
cert_index:

All the nodes have failed if mariadbd is not running on any of the nodes and all of the nodes contain a seqno value of -1.

Wenn ein einzelner Knoten einen positiven Wert seqno hat, kann dieser Knoten zum Neustarten des Clusters verwendet werden. Da jedoch nicht garantiert werden kann, dass jeder Knoten über eine identische Kopie der Daten verfügt, wird nicht empfohlen, den Cluster mit dem Befehl --wsrep-new-cluster auf einem Knoten neu zu starten.

Erstellen Sie einen Container neu

Das Wiederherstellen bestimmter Fehler erfordert die Neuerstellung eines oder mehrerer Container.

  1. Deaktivieren Sie den ausgefallenen Knoten im Lastenausgleichsmodul.

    Bemerkung

    Verlassen Sie sich nicht auf die Systemüberprüfungen für den Lastenausgleich, um den Knoten zu deaktivieren. Wenn der Knoten nicht inaktiviert ist, sendet der Load Balancer SQL-Anforderungen an ihn, bevor er dem Cluster wieder beitritt und Dateninkonsistenzen verursacht.

  2. Zerstören Sie den Container und entfernen Sie MariaDB-Daten, die außerhalb des Containers gespeichert sind:

    # openstack-ansible openstack.osa.containers_lxc_destroy \
    -l node3_galera_container-3ea2cbd3
    

    In diesem Beispiel ist Knoten 3 fehlgeschlagen.

  3. Führen Sie das Host-Setup-Playbook aus, um den Container auf Knoten 3 neu zu erstellen:

    # openstack-ansible oopenstack.osa.containers_lxc_create -l node3 \
    -l node3_galera_container-3ea2cbd3
    

    Das Playbook startet alle anderen Container auf dem Knoten neu.

  4. Führen Sie das Infrastruktur-Playbook aus, um den Container speziell auf Knoten 3 zu konfigurieren:

    # openstack-ansible openstack.osa.setup_infrastructure \
    --limit node3_galera_container-3ea2cbd3
    

    Warnung

    Der neue Container führt einen Galera-Cluster mit einem einzelnen Knoten aus. Dies ist ein gefährlicher Zustand, da die Umgebung mehr als eine aktive Datenbank mit möglicherweise unterschiedlichen Daten enthält.

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     1
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  da078d01-29e5-11e4-a051-03d896dbdb2d
    wsrep_cluster_status      Primary
    
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     4
    wsrep_cluster_size        2
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     4
    wsrep_cluster_size        2
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  5. Starten Sie MariaDB in dem neuen Container neu, und vergewissern Sie sich, dass es erneut dem Cluster beitritt.

    Bemerkung

    In larger deployments, it may take some time for the MariaDB daemon to start in the new container. It will be synchronizing data from the other MariaDB servers during this time. You can monitor the status during this process by tailing the journalctl -f -u mariadb log file.

    Zeilen, die mit WSREP_SST beginnen, werden während des Synchronisationsprozesses angezeigt und Sie sollten eine Zeile mit WSREP: SST complete, seqno: <NUMBER> sehen, wenn die Synchronisierung erfolgreich war.

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     5
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     5
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     5
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  6. Aktivieren Sie den zuvor fehlgeschlagenen Knoten im Lastenausgleich.