Heartbeat e DRBD vengono entrambi utilizzati per una soluzione cluster per qualsiasi applicazione che utilizza due server. Entrambi i server funzionano in modalità attiva e passiva, un server funzionerà contemporaneamente e un altro server come server di backup. DRBD (Distributed Replicated Block Device) è un servizio a livello di kernel che sincronizza i dati tra due server in tempo reale. Heartbeat è un programma open source che consente a un server Linux primario e uno di backup di determinare se l'altro è "vivo" e se il primario non lo è, eseguire il failover delle risorse sul backup. Gestirà anche l'alta disponibilità IP e altri servizi nei tuoi server.
In questo tutorial impareremo come ottenere un'elevata disponibilità di MariaDB utilizzando Heartbeat e DRBD sul server Ubuntu 16.04.
Requisiti
- Due nodi con installato il server Ubuntu 16.04.
- Due schede di rete installate su ciascun nodo.
- Disco rigido aggiuntivo non partizionato installato su ciascun nodo.
- Utente non root con configurazione dei privilegi sudo su ogni nodo.
Per iniziare
Prima di iniziare, dovrai impostare l'indirizzo IP su ciascun nodo. Utilizza il seguente indirizzo IP su ciascun nodo:
Nodo1 :
172.16.0.1 su eth0 e 192.168.0.101 su eth1
Nodo2 :
172.16.0.2 su eth0 e 192.168.0.102 su eth1
IP 192.168.0.103 sarà l'IP ad alta disponibilità.
Successivamente, dovrai anche impostare il nome host e la risoluzione del nome host su ciascun nodo. Quindi ogni nodo può comunicare tra loro. Sul primo nodo, apri il file /etc/hosts e il file /etc/hostname:
sudo nano /etc/hosts
Aggiungi le seguenti righe alla fine del file:
172.16.0.1 Node1 172.16.0.2 Node2
sudo nano /etc/hostname
Modifica il file come mostrato di seguito:
Node1
Salva e chiudi il file quando hai finito.
Sul secondo nodo, apri il file /etc/hosts e il file /etc/hostname:
sudo nano /etc/hosts
Aggiungi le seguenti righe alla fine del file:
172.16.0.1 Node1 172.16.0.2 Node2
sudo nano /etc/hostname
Modifica il file come mostrato di seguito:
Node2
Salva e chiudi il file quando hai finito.
Successivamente, aggiorna ogni nodo con l'ultima versione con il seguente comando:
sudo apt-get update -y
sudo apt-get upgrade -y
Una volta aggiornato il sistema, riavvia il sistema per applicare queste modifiche.
Installa DRBD e Heartbeat
Successivamente, dovrai installare DRBD e Heartbeat su entrambi i nodi. Per impostazione predefinita, entrambi sono disponibili nel repository predefinito di Ubuntu 16.04. Puoi installarli semplicemente eseguendo il seguente comando su entrambi i nodi:
sudo apt-get install drbd8-utils heartbeat -y
Quindi, avvia il servizio DRBD e Heartbeat e consenti loro di avviarsi all'avvio:
sudo systemctl start drbd
sudo systemctl start heartbeat
systemctl enable drbd
systemctl enable heartbeat
Configura DRBD e Heartbeat
Successivamente, dovrai configurare il dispositivo DRBD su ciascun nodo. Crea una singola partizione sulla seconda unità non partizionata /dev/sdb su ciascun nodo.
Puoi farlo semplicemente eseguendo il seguente comando su ciascun nodo:
sudo echo -e 'n\np\n1\n\n\nw' | fdisk /dev/sdb
Successivamente, dovrai configurare DRBD su entrambi i nodi. Puoi farlo creando il file /etc/drbd.d/r0.res su ciascun nodo.
sudo nano /etc/drbd.d/r0.res
Aggiungi le seguenti righe:
global { usage-count no; } resource r0 { protocol C; startup { degr-wfc-timeout 60; } disk { } syncer { rate 100M; } net { cram-hmac-alg sha1; shared-secret "aBcDeF"; } on Node1 { device /dev/drbd0; disk /dev/sdb1; address 172.16.0.1:7789; meta-disk internal; } on Node2 { device /dev/drbd0; disk /dev/sdb1; address 172.16.0.2:7789; meta-disk internal; } }
Salva e chiudi il file al termine, quindi apri un altro file di configurazione su ciascun nodo:
sudo nano /etc/ha.d/ha.cf
Aggiungi le seguenti righe:
# Check Interval keepalive 1 # Time before server declared dead deadtime 10 # Secondary wait delay at boot initdead 60 # Auto-failback auto_failback off # Heartbeat Interface bcast eth1 # Nodes to monitor node Node1 node Node2
Salva e chiudi il file.
Quindi, apri il file di risorse /etc/ha.d/haresources su ciascun nodo:
sudo nano /etc/ha.d/haresources
Aggiungi le seguenti righe:
Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime
Qui, Node1 è il nome host del tuo nodo attivo principale, 192.168.0.103 è l'indirizzo IP in virgola mobile, /var/lib/mysql è un punto di montaggio e /dev/drbd0 è un dispositivo DRBD.
Successivamente, sarà necessario definire e archiviare chiavi di autorizzazione identiche su entrambi i nodi. Puoi farlo tramite il file /etc/ha.d/authkeys su ciascun nodo:
sudo nano /etc/ha.d/authkeys
Aggiungi le seguenti righe:
auth1 1 sha1 your-secure-password
Qui, la tua password sicura è la tua password sicura. Usa la stessa password su entrambi i nodi.
Quindi, crea e avvia DRBD eseguendo il seguente comando su Node1:
sudo drbdadm create-md r0
sudo systemctl restart drbd
sudo drbdadm outdate r0
sudo drbdadm -- --overwrite-data-of-peer primary all
sudo drbdadm primary r0
sudo mkfs.ext4 /dev/drbd0
sudo chmod 600 /etc/ha.d/authkeys
sudo mkdir /var/lib/mysql
Una volta creato il disco DRBD su Node1, crea il disco DRBD su Node2 con il seguente comando:
sudo drbdadm create-md r0
sudo systemctl restart drbd
sudo chmod 600 /etc/ha.d/authkeys
sudo mkdir /var/lib/mysql
Ora puoi verificare che il disco DRBD sia connesso e si stia sincronizzando correttamente eseguendo il seguente comando:
sudo cat /proc/drbd
Se tutto va bene, dovresti vedere il seguente output:
version: 8.4.5 (api:1/proto:86-101) srcversion: F446E16BFEBS8B115AJB14H 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:210413 nr:0 dw:126413 dr:815311 al:35 bm:0 lo:0 pe:11 ua:0 ap:0 ep:1 wo:f oos:16233752 [>....................] sync'ed: 3.3% (14752/14350)M finish: 0:12:23 speed: 12,156 (16,932) K/sec
Quindi, avvia l'heartbeat su entrambi i nodi per abilitare la parte di failover della tua configurazione.
sudo systemctl start heartbeat
Quindi, verifica la partizione DRBD montata con il seguente comando su Node1:
sudo mount | grep drbd
Dovresti vedere il seguente output:
/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)
Successivamente, verifica che l'IP mobile sia associato solo a Node1 con il comando seguente:
sudo ip addr show | grep 192.168.0.103
Dovresti vedere il seguente output:
inet 192.168.0.103/24 brd 192.168.0.255 scope global secondary eth1:0
Installa e configura MariaDB
Una volta che tutto è configurato correttamente su entrambi i nodi, è il momento di installare il server MariaDB su entrambi i nodi.
Esegui il seguente comando su entrambi i nodi per installare il server MariaDB:
sudo apt-get install mariadb-server -y
Successivamente, dovrai disabilitare il servizio MariaDB su entrambi i nodi:
sudo systemctl disable mysql
Qui useremo Node1 come primario e i database su Node2 dovrebbero essere creati e popolati tramite la sincronizzazione con Node1. Quindi dovrai interrompere il servizio MariaDB e rimuovere il contenuto all'interno di /var/lib/mysql su Node2. Puoi farlo con il seguente comando:
sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*
Successivamente, dovrai copiare il file di configurazione di MySQL Maintenance da Node1 a Node2. Puoi farlo eseguendo il seguente comando:
sudo scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf
Successivamente, dovrai creare un utente root per la gestione remota e l'accesso ai database sull'istanza MySQL ad alta disponibilità.
Puoi farlo eseguendo il seguente comando su Node1:
mysql -u root -p
Inserisci la tua password di root, quindi crea un utente root con il seguente comando:
MariaDB [(none)]> CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0..%' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> QUIT;
Quindi, imposta l'indirizzo di collegamento per MySQL su entrambi i nodi con il seguente comando:
sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mariadb.conf.d/*.cnf
Avvia Heartbeat per il servizio MariaDB
Successivamente, dovrai aggiungere il servizio MariaDB nelle tue istanze heartbeat su entrambi i nodi. Puoi farlo modificando il file /etc/ha.d/haresources:
sudo nano /etc/ha.d/haresources
Modifica le seguenti righe:
Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql
Salva e chiudi il file, quando hai finito.
Una volta configurato l'heartbeat, sarà necessario riavviarlo su entrambi i nodi.
Innanzitutto, riavvia Heartbea su Node1:
sudo systemctl restart heartbeat
Quindi, attendi 50 secondi, quindi riavvia il servizio heartbeat su Node2:
sudo systemctl restart heartbeat
Test Heartbeat e DRBD
Ora, tutto è configurato correttamente, è il momento di eseguire una serie di test per verificare che l'heartbeat attiverà effettivamente un trasferimento dal server attivo al server passivo quando il server attivo si guasta in qualche modo.
Innanzitutto, verifica che Node1 sia il nodo drbd primario con il seguente comando su Node1:
sudo cat /proc/drbd
Dovresti vedere il seguente output:
version: 8.4.5 (api:1/proto:86-101) srcversion: F446E16BFEBS8B115AJB14H O cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:22764644 nr:256 dw:529232 dr:22248299 al:111 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Successivamente, verificheremo che il disco DRBD sia montato con il seguente comando:
sudo mount | grep drbd
/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)
Successivamente, verifica il servizio MariaDB con il seguente comando:
sudo systemctl status mysql
Quindi, accedi al server MariaDB dalla macchina remota utilizzando l'IP mobile e crea un database di prova:
mysql -h 192.168.0.103 -u root -p
MariaDB [(none)]> create database test;
MariaDB [(none)]> quit
Quindi, riavvia Heartbeat su Node1:
sudo systemctl restart heartbeat
Ora, heartbeat interpreterà questo riavvio come un errore di MariaDB su Node1 e dovrebbe attivare il failover per rendere Node2 il server primario.
Puoi verificare che DRBD stia ora trattando Node1 come server secondario con il seguente comando su Node1:
sudo cat /proc/drbd
Dovresti vedere il seguente output:
version: 8.4.5 (api:1/proto:86-101) srcversion: F446E16BFEBS8B115AJB14H 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ns:22764856 nr:388 dw:529576 dr:22248303 al:112 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Ora, verifica che Node2 sia il nodo drbd primario eseguendo il seguente comando su Node2:
sudo cat /proc/drbd
Dovresti vedere il seguente output:
version: 8.4.5 (api:1/proto:86-101) srcversion: F446E16BFEBS8B115AJB14H 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:412 nr:20880892 dw:20881304 dr:11463 al:7 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Quindi, verifica che MariaDB sia in esecuzione su Node2:
sudo systemctl status mysql
Ora, connettiti al server MariaDB utilizzando l'IP mobile su Node2 dall'utente remoto.
mysql -h 192.168.0.103 -u root -p
Quindi, visualizza il database di test che abbiamo creato in precedenza mentre Node1 era il server primario.
MariaDB [(none)]> show databases;
Dovresti vedere il seguente output:
+--------------------+ | Database | +--------------------+ | test | | information_schema | | lost+found | | mysql | | performance_schema | +--------------------+ 5 rows in set (0.04 sec)