Mysql
 sql >> Database >  >> RDS >> Mysql

Come eseguire il bootstrap del cluster MySQL o MariaDB Galera - Aggiornato

A differenza del server MySQL standard e del cluster MySQL, il modo per avviare un cluster MySQL/MariaDB Galera è leggermente diverso. Galera richiede di avviare un nodo in un cluster come punto di riferimento, prima che i nodi rimanenti possano unirsi e formare il cluster. Questo processo è noto come bootstrap del cluster. Il bootstrapping è un passaggio iniziale per introdurre un nodo di database come componente principale, prima che altri lo vedano come punto di riferimento per sincronizzare i dati.

Come funziona?

Quando Galera inizia con il comando bootstrap su un nodo, quel particolare nodo raggiungerà lo stato primario (controlla il valore di wsrep_cluster_status). I nodi rimanenti richiederanno solo un normale comando di avvio e cercheranno automaticamente il componente primario (PC) esistente nel cluster e si uniranno per formare un cluster. La sincronizzazione dei dati avviene quindi tramite il trasferimento di stato incrementale (IST) o il trasferimento di stato snapshot (SST) tra il partecipante e il donatore.

Quindi, in pratica, dovresti eseguire il bootstrap del cluster solo se desideri avviare un nuovo cluster o quando nessun altro nodo nel cluster è nello stato PRIMARY. È necessario prestare attenzione quando si sceglie l'azione da intraprendere, altrimenti potresti ritrovarti con cluster divisi o perdita di dati.

I seguenti scenari di esempio illustrano quando eseguire il bootstrap di un cluster a tre nodi in base allo stato del nodo (wsrep_local_state_comment) e allo stato del cluster (wsrep_cluster_status):

Stato di Galera Flusso del cinturino
  1. Riavvia il nodo INITIALIZED.
  1. Riavvia il nodo INITIALIZED.
  2. Una volta terminato, avvia il nuovo nodo.
  1. Bootstrap il nodo più avanzato usando “pc.bootstrap=1”.
  2. Riavvia i nodi rimanenti, un nodo alla volta.
  1. Inizia il nuovo nodo.
  1. Inizia il nuovo nodo, un nodo alla volta.
  1. Avvia qualsiasi nodo.
  2. Avvia i nodi rimanenti, un nodo alla volta.

Come avviare Galera Cluster?

I 3 fornitori di Galera utilizzano diversi comandi di bootstrap (basati sull'ultima versione del software). Sul primo nodo, esegui:

  • Cluster MySQL Galera (codership):

    $ service mysql bootstrap # sysvinit
    $ galera_new_cluster # systemd
    $ mysqld_safe --wsrep-new-cluster # command line
  • Cluster Percona XtraDB (Percona):

    $ service mysql bootstrap-pxc # sysvinit
    $ systemctl start [email protected] # systemd
  • Cluster MariaDB Galera (MariaDB):

    $ service mysql bootstrap # sysvinit
    $ service mysql start --wsrep-new-cluster # sysvinit
    $ galera_new_cluster # systemd
    $ mysqld_safe --wsrep-new-cluster # command line

Il comando sopra è solo un wrapper e quello che fa effettivamente è avviare l'istanza MySQL su quel nodo con gcomm:// come variabile wsrep_cluster_address. Puoi anche definire manualmente le variabili all'interno di my.cnf ed eseguire il comando standard di avvio/riavvio. Tuttavia, non dimenticare di modificare nuovamente wsrep_cluster_address per contenere gli indirizzi di tutti i nodi dopo l'inizio.

Quando il primo nodo è attivo, esegui il seguente comando sui nodi successivi:

$ service mysql start
$ systemctl start mysql

Il nuovo nodo si connette ai membri del cluster come definito dal parametro wsrep_cluster_address. Ora recupererà automaticamente la mappa del cluster e si connetterà al resto dei nodi e formerà un cluster.

Avviso:non eseguire mai il bootstrap quando desideri ricollegare un nodo a un cluster esistente e NON eseguire MAI il bootstrap su più di un nodo.

Bandiera Safe-to-Bootstrap

Galera a partire dalla versione 3.19 viene fornito con un nuovo flag chiamato "safe_to_bootstrap" all'interno di grastate.dat. Questo flag facilita la decisione e previene scelte non sicure tenendo traccia dell'ordine in cui i nodi vengono chiusi. L'ultimo nodo che è stato spento verrà contrassegnato come "Safe-to-Bootstrap". Tutti gli altri nodi verranno contrassegnati come non sicuri da cui eseguire il bootstrap.

Osservando il contenuto di grastate.dat (l'impostazione predefinita è sotto MySQL datadir) dovresti notare il flag nell'ultima riga:

# GALERA saved state
version: 2.1
uuid:    8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno:   2575
safe_to_bootstrap: 0

Durante il bootstrap del nuovo cluster, Galera rifiuterà di avviare il primo nodo contrassegnato come non sicuro da cui eseguire il bootstrap. Vedrai il seguente messaggio nei log:

"Potrebbe non essere sicuro eseguire il bootstrap del cluster da questo nodo. Non è stato l'ultimo a lasciare il cluster e potrebbe non contenere tutti gli aggiornamenti.

Per forzare il bootstrap del cluster con questo nodo, modifica manualmente il file grastate.dat e imposta safe_to_bootstrap su 1 ."

In caso di arresto non pulito o arresto anomalo, tutti i nodi avranno "safe_to_bootstrap:0", quindi dobbiamo consultare il motore di archiviazione InnoDB per determinare quale nodo ha commesso l'ultima transazione nel cluster. Questo può essere ottenuto avviando mysqld con la variabile "--wsrep-recover" su ciascuno dei nodi, che produce un output come questo:

$ mysqld --wsrep-recover
...
2016-11-18 01:42:15 36311 [Note] InnoDB: Database was not shutdown normally!
2016-11-18 01:42:15 36311 [Note] InnoDB: Starting crash recovery.
...
2016-11-18 01:42:16 36311 [Note] WSREP: Recovered position: 8bcf4a34-aedb-14e5-bcc3-d3e36277729f:114428
...

Il numero dopo la stringa UUID nella riga "Posizione recuperata" è quello da cercare. Scegli il nodo con il numero più alto e modifica il suo grastate.dat per impostare "safe_to_bootstrap:1", come mostrato nell'esempio seguente:

# GALERA saved state
version: 2.1
uuid:    8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno:   -1
safe_to_bootstrap: 1

È quindi possibile eseguire il comando bootstrap standard sul nodo scelto.

E se i nodi si sono discostati?

In determinate circostanze, i nodi possono essersi discostati l'uno dall'altro. Lo stato di tutti i nodi potrebbe diventare non primario a causa della divisione della rete tra nodi, dell'arresto anomalo del cluster o se Galera ha riscontrato un'eccezione durante la determinazione del componente primario. Dovrai quindi selezionare un nodo e promuoverlo come componente principale.

Per determinare quale nodo deve essere avviato, confronta il valore wsrep_last_committed su tutti i nodi DB:

node1> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed | 10032       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node2> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed | 10348       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node3> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed |   997       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+

Dagli output precedenti, node2 ha i dati più aggiornati. In questo caso, tutti i nodi Galera sono già avviati, quindi non è necessario riavviare nuovamente il cluster. Abbiamo solo bisogno di promuovere node2 per essere un componente primario:

node2> SET GLOBAL wsrep_provider_options="pc.bootstrap=1";

I nodi rimanenti si ricollegheranno quindi al componente principale (nodo2) e risincroceranno i propri dati in base a questo nodo.

Se stai usando ClusterControl (provalo gratuitamente), puoi determinare wsrep_last_committed e wsrep_cluster_status direttamente da ClusterControl> Panoramica pagina:

Oppure da ClusterControl> Performance> Stato DB pagina: