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

Pemeliharaan klaster Galera

Pemeliharaan rutin termasuk menambahkan atau menghapus node dari cluster tanpa mengurangi operasi dan juga memulai cluster setelah secara anggun menutup semua node.

Instance MySQL di-restart ketika membuat cluster, ketika menambahkan node, ketika layanan tidak berjalan, atau ketika perubahan dilakukan ke file konfigurasi /etc/mysql/my.cnf.

Verifikasi status kluster

Bandingkan output dari perintah berikut dengan output berikut. Ini seharusnya memberi Anda informasi tentang status kluster Anda.

# 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

Dalam contoh ini, hanya satu simpul yang merespons.

Dengan halus menutup layanan MariaDB di semua kecuali satu node memungkinkan node operasional yang tersisa untuk melanjutkan pemrosesan permintaan SQL. Ketika secara halus mematikan beberapa node, lakukan tindakan secara berurutan untuk mempertahankan operasi.

Mulai kluster

Secara halus mematikan semua node akan menghancurkan cluster. Memulai atau memulai kembali kluster dari nol node membutuhkan pembuatan kluster baru di salah satu node.

  1. Mulai kluster baru di node paling canggih. Ubah ke direktori playbook dan periksa nilai seqno di file grastate.dat pada semua node:

    # 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:
    

    Dalam contoh ini, semua node dalam kluster mengandung nilai positif seqno yang sama karena disinkronkan sesaat sebelum shutdown yang anggun. Jika semua nilai seqno sama, setiap node dapat memulai kluster baru.

    ## 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]
    

    Perintah ini menghasilkan kluster yang berisi single node. Nilai wsrep_cluster_size menunjukkan jumlah node dalam kluster.

    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
    

Pemulihan klaster Galera

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

  1. Jalankan perintah Ansible berikut untuk menunjukkan node yang gagal:

    # 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.

Pulihkan kegagalan single-node

Jika satu simpul gagal, simpul lainnya mempertahankan kuorum dan terus memproses permintaan SQL.

  1. Ubah ke direktori playbooks dan jalankan perintah Ansible berikut untuk menentukan node gagal:

    # 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
    

    Dalam contoh ini, node 3 telah gagal.

  2. Restart MariaDB pada node gagal dan verifikasi bahwa itu bergabung kembali dengan cluster.

  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.

Memulihkan kegagalan multi-node

Ketika semua kecuali satu node gagal, node yang tersisa tidak dapat mencapai quorum dan berhenti memproses permintaan SQL. Dalam situasi ini, node gagal yang pulih tidak dapat bergabung dengan kluster karena tidak ada lagi.

  1. Jalankan perintah Ansible berikut untuk menunjukkan node yang gagal:

    # 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
    

    Dalam contoh ini, node 2 dan 3 gagal. Server operasional yang tersisa menunjukkan non-Primer karena tidak dapat mencapai kuorum.

  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)
    

    Node operasi yang tersisa menjadi simpul utama dan mulai memproses permintaan SQL.

  3. Restart MariaDB pada node gagal dan verifikasi bahwa mereka bergabung kembali dengan cluster:

    # 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.

Memulihkan kegagalan environment yang lengkap

Kembalikan dari backup jika semua node dalam gugus Galera gagal (jangan mematikan dengan perlahan). Ubah ke direktori playbook dan jalankan perintah berikut untuk menentukan apakah semua node dalam gugus telah gagal:

# 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.

Jika ada node tunggal yang memiliki nilai seqno positif, maka node tersebut dapat digunakan untuk me-restart klaster. Namun, karena tidak ada jaminan bahwa setiap node memiliki salinan data yang identik, kami tidak menyarankan untuk me-restart klaster menggunakan perintah --wsrep-new-cluster pada satu node.

Buat kembali sebuah kontainer

Memulihkan dari kegagalan tertentu memerlukan pembangunan kembali satu atau lebih kontainer.

  1. Nonaktifkan node gagal pada load balancer.

    Catatan

    Jangan mengandalkan pemeriksaan kesehatan penyeimbang beban (load balancer) untuk menonaktifkan node. Jika node tidak dinonaktifkan, load balancer mengirim permintaan SQL ke dalamnya sebelum bergabung kembali dengan cluster dan menyebabkan inkonsistensi data.

  2. Hancurkan kontainer dan hapus data MariaDB yang disimpan di luar kontainer:

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

    Dalam contoh ini, node 3 gagal.

  3. Jalankan host setup playbook untuk membangun kembali kontainer pada node 3:

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

    Playbook ini me-restart semua kontainer lain di node.

  4. Jalankan playbook infrastruktur untuk mengonfigurasi kontainer secara spesifik di node 3:

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

    Peringatan

    Kontainer baru menjalankan kluster single-node Galera, yang merupakan keadaan berbahaya karena environment berisi lebih dari satu database aktif dengan data yang berpotensi berbeda.

    # 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. Mulai ulang MariaDB di kontainer baru dan verifikasi bahwa ini bergabung kembali dengan kluster.

    Catatan

    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.

    Baris yang dimulai dengan WSREP_SST akan muncul selama proses sinkronisasi dan Anda akan melihat baris dengan WSREP: SST complete, seqno: <NUMBER> jika sinkronisasi berhasil.

    # 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. Aktifkan node yang gagal sebelumnya pada load balancer.