In questo articolo, ti mostrerò come configurare un cluster di database MySQL con tre nodi in una replica multi-master. La replica multi-master consente la scrittura di record in ciascun nodo, quindi se un nodo si guasta, possiamo lavorare sull'altro come se nulla fosse.
La documentazione ufficiale di Percona è reperibile sul sito ufficiale https://www.percona.com/
Innanzitutto perché scegliamo tre nodi e non solo due? In qualsiasi cluster, il numero di nodi dovrebbe essere dispari, quindi in caso di disconnessione di un nodo, assumiamo che il gruppo di server più alto abbia i dati aggiornati e dovrebbe essere replicato sul nodo inattivo per evitare la perdita di dati. Questo è correlato solo alla risoluzione dei conflitti nella replica dei dati, non perderemo i dati scritti solo sul nodo disconnesso.
Viene utilizzato per evitare una circostanza chiamata cervello diviso , in cui non possiamo scegliere automaticamente quale nodo ha dati corretti. Pensa ad esempio a un cluster a 2 nodi in cui entrambi i nodi sono disconnessi l'uno dall'altro e lo stesso record viene scritto su entrambi i nodi:chi vince quando tornano online? Non lo sappiamo, quindi si verifica la divisione del cervello e dobbiamo decidere manualmente quale record è quello giusto.
Il numero di nodi necessario per determinare quale parte del cluster ha i dati corretti si chiama QUORUM, nel nostro caso il quorum sarà 2. Quindi abbiamo bisogno che 2 server siano sempre collegati tra loro. Nel caso in cui tutti e tre i nodi si interrompano, abbiamo un cervello diviso e dobbiamo decidere quale server deve passare in modalità bootstrap manualmente, questa è la procedura per determinare quale sarà il server principale da riprendere dal cervello diviso.
Configurazione del cluster Percona XtraDB su Debian 8
Questo tutorial descrive come installare e configurare tre nodi Percona XtraDB Cluster su server Debian 8, useremo i pacchetti dai repository Percona.
- server 1
- Nome host:mysql1.local.vm
- Indirizzo IP:192.168.152.100
- Nodo 2
- Nome host: mysql2.local.vm
- Indirizzo IP:192.168.152.110
- Nodo 3
- Nome host: mysql3.local.vm
- Indirizzo IP:192.168.152.120
Su ciascun host, modifica il file /etc/hosts come segue per assicurarti che il DNS funzioni correttamente.
127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2
192.168.152.120 mysql3.local.vm mysql3
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Prerequisiti
La procedura descritta in questo tutorial richiede la seguente configurazione minima del server:
- Tutti e tre i nodi hanno Debian 8, ti consiglio di seguire questa guida https://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/
Passaggio 1. Installazione di Percona Xtradb Cluster
Su tutti i nodi, esegui i seguenti comandi come root:
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
apt-get update
apt-get -y install percona-xtradb-cluster-57
Ovviamente, inserisci la password mysql che desideri scegliere.
Dopo che i pacchetti sono stati installati, mysqld si avvierà automaticamente. Interrompi mysqld su tutti e tre i nodi usando /etc/init.d/mysql stop .
Fase 2. Configurazione del primo nodo
I singoli nodi devono essere configurati per essere in grado di eseguire il bootstrap del cluster. Per ulteriori informazioni sul bootstrap del cluster, vedere Bootstrapping del cluster .
-
Assicurati di aggiungere queste righe al file di configurazione /etc/mysql/my.cnf per il primo nodo (mysql1.local.vm) alla fine della sezione [mysqld]:
[mysqld]
... # Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #1 address
wsrep_node_address=192.168.152.100
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"Presta attenzione alla password che hai impostato lì nel mio caso "PASSW0RD".
-
Avvia il primo nodo con il seguente comando:
[email protected]:~# /etc/init.d/mysql bootstrap-pxc
Questo comando avvierà il primo nodo e avvierà il cluster, vedrai qualcosa del genere se tutto è a posto:
[email protected]:~# /etc/init.d/mysql bootstrap-pxc
[ ok ] Bootstrapping Percona XtraDB Cluster database server: mysqld ..
[email protected]:~# -
Dopo che il primo nodo è stato avviato, connettiti a mysql con il classico comando mysql -p, quindi lo stato del cluster può essere verificato eseguendo la query mostra lo stato come 'wsrep%'; come nell'esempio seguente:
mysql> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b | ... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | ... | wsrep_cluster_size | 1 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 59 rows in set (0.00 sec)
Questo output mostra che il cluster è stato avviato correttamente.
Per eseguire Trasferimento di istantanee di stato utilizzando XtraBackup , configura un nuovo utente con i privilegi appropriati:
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'PASSW0RD'; mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost'; mysql> FLUSH PRIVILEGES;
Nota
L'account root MySQL può essere utilizzato anche per eseguire SST, ma è più sicuro utilizzare un utente diverso (non root).
Fase 3. Configurazione del secondo nodo
-
Aggiungi le seguenti righe al file di configurazione /etc/mysql/my.cnf sul secondo nodo (mysql2.local.vm), in modo che contenga i seguenti dati:
[mysqld]
... # Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.152.110
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD" -
Avvia il secondo nodo con il seguente comando (attenzione questa volta come puoi vedere non è in modalità boostrap!!):
[email protected]:~# /etc/init.d/mysql start
-
Dopo che il server è stato avviato, dovrebbe ricevere SST automaticamente. Lo stato del cluster può ora essere verificato su entrambi i nodi. Quello che segue è un esempio dello stato del secondo nodo (mysql2.local.vm):
mysql> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b | ... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | ... | wsrep_cluster_size | 2 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 40 rows in set (0.01 sec)
Questo output mostra che il nuovo nodo è stato aggiunto correttamente al cluster. Nota la variabile wsrep_cluster_size che è diventata 2, invece di una delle prime query che abbiamo fatto.
Fase 4. Configurazione del terzo nodo
-
Aggiungi le seguenti righe al file di configurazione /etc/mysql/my.cnf sul secondo nodo (mysql3.local.vm), quindi contiene la seguente configurazione:
[mysqld]
... # Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.152.120
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD" -
Avvia il terzo nodo con il seguente comando:
[email protected]:~# /etc/init.d/mysql start
-
Dopo che il server è stato avviato, dovrebbe ricevere automaticamente SST. Lo stato del cluster può essere verificato su tutti i nodi. Quello che segue è un esempio di stato dal terzo nodo (mysql3.local.vm):
mysql> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b | ... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | ... | wsrep_cluster_size | 3 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 40 rows in set (0.01 sec)
Questo output conferma che il terzo nodo è entrato a far parte del cluster. Ancora una volta dai un'occhiata a wsrep_cluster_size che ora è diventato 3, invece di 2.
Se riscontri dei problemi, dai un'occhiata a /var/log/syslog per vedere se è tutto a posto
Oct 4 12:16:13 mysql3 mysql[2767]: Starting MySQL (Percona XtraDB Cluster) database server: mysqld . . .State transfer in progress, setting sleep higher: mysqld . ..
Oct 4 12:16:13 mysql3 systemd[1]: Started LSB: Start and stop the mysql (Percona XtraDB Cluster) daemon.
Oct 4 12:17:01 mysql3 CRON[3731]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
In questo esempio, tutto è andato bene e puoi vedere il Trasferimento di stato in corso, il che significa che i dati verranno trasferiti al nodo.
Test della replica
Per testare la replica, creiamo un nuovo database sul secondo nodo, creiamo una tabella per quel database sul terzo nodo e aggiungiamo alcuni record alla tabella sul primo nodo.
-
Crea un nuovo database sul secondo nodo:
mysql@mysql2> CREATE DATABASE percona; Query OK, 1 row affected (0.01 sec)
-
Crea una tabella sul terzo nodo:
mysql@mysql3> USE percona; Database changed mysql@pxc3> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30)); Query OK, 0 rows affected (0.05 sec)
-
Inserisci i record sul primo nodo:
mysql@mysql1> INSERT INTO percona.example VALUES (1, 'percona1'); Query OK, 1 row affected (0.02 sec)
-
Recupera tutte le righe da quella tabella sul secondo nodo:
mysql@mysql2> SELECT * FROM percona.example; +---------+-----------+ | node_id | node_name | +---------+-----------+ | 1 | percona1 | +---------+-----------+ 1 row in set (0.00 sec)
Per assicurarti che la tua applicazione possa sempre raggiungere il cluster, puoi aggiungere un loadbalancer davanti ai tre nodi.