Il cluster ad alta disponibilità, noto anche come cluster di failover o cluster attivo-passivo, è uno dei tipi di cluster più utilizzati in un ambiente di produzione per avere una disponibilità continua dei servizi anche se uno dei nodi del cluster si guasta.
In termini tecnici, se il server che esegue l'applicazione si è guastato per qualche motivo (es:guasto hardware), il software del cluster (pacemaker) riavvierà l'applicazione sul nodo di lavoro.
Il failover non è solo il riavvio di un'applicazione; è una serie di operazioni ad esso associate, come il montaggio di filesystem, la configurazione di reti e l'avvio di applicazioni dipendenti.
Ambiente
Qui configureremo un cluster di failover con Pacemaker per rendere il server Apache (web) un'applicazione a disponibilità elevata.
Qui configureremo il server Web, il filesystem e le reti Apache come risorse per il nostro cluster.
Per una risorsa di filesystem, utilizzeremo l'archiviazione condivisa proveniente dall'archiviazione iSCSI.
Nome host |
---|
Tutti sono in esecuzione su VMware Workstation.
Archiviazione condivisa
L'archiviazione condivisa è una delle risorse critiche nel cluster ad alta disponibilità in quanto archivia i dati di un'applicazione in esecuzione. Tutti i nodi in un cluster avranno accesso allo storage condiviso per i dati più recenti.
Lo storage SAN è lo storage condiviso ampiamente utilizzato in un ambiente di produzione. A causa delle risorse limitate, per questa demo configureremo un cluster con storage iSCSI a scopo dimostrativo.
Installa pacchetti
Server iSCSI
[root@storage ~]# dnf install -y targetcli lvm2
Nodi cluster
dnf install -y iscsi-initiator-utils lvm2
Imposta disco condiviso
Elenchiamo i dischi disponibili nel server iSCSI utilizzando il comando seguente.
[root@storage ~]# fdisk -l | grep -i sd
Output: Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors /dev/sda1 * 2048 2099199 2097152 1G 83 Linux /dev/sda2 2099200 209715199 207616000 99G 8e Linux LVM Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Dall'output sopra, puoi vedere che il mio sistema ha un disco rigido da 10 GB (/dev/sdb).
Qui creeremo un LVM sul server iSCSI da utilizzare come storage condiviso per i nostri nodi cluster.
[root@storage ~]# pvcreate /dev/sdb
[root@storage ~]# vgcreate vg_iscsi /dev/sdb
[root@storage ~]# lvcreate -l 100%FREE -n lv_iscsi vg_iscsi
Crea spazio di archiviazione condiviso
Ottieni i dettagli dell'iniziatore di nodi.
cat /etc/iscsi/initiatorname.iscsi
Nodo 1:
InitiatorName=iqn.1994-05.com.redhat:121c93cbad3a
Nodo 2:
InitiatorName=iqn.1994-05.com.redhat:827e5e8fecb
Immettere il comando seguente per ottenere un'interfaccia a riga di comando iSCSI per un prompt interattivo.
[root@storage ~]# targetcli
Output: Warning: Could not load preferences file /root/.targetcli/prefs.bin. targetcli shell version 2.1.fb49 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> cd /backstores/block /backstores/block> create iscsi_shared_storage /dev/vg_iscsi/lv_iscsi Created block storage object iscsi_shared_storage using /dev/vg_iscsi/lv_iscsi. /backstores/block> cd /iscsi /iscsi> create Created target iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260. /iscsi> cd iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18/tpg1/acls << Change as per the output of previous command /iscsi/iqn.20...e18/tpg1/acls> create iqn.1994-05.com.redhat:121c93cbad3a << Node 1 Created Node ACL for iqn.1994-05.com.redhat:121c93cbad3a /iscsi/iqn.20...e18/tpg1/acls> create iqn.1994-05.com.redhat:827e5e8fecb << Node 2 Created Node ACL for iqn.1994-05.com.redhat:827e5e8fecb /iscsi/iqn.20...e18/tpg1/acls> cd /iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18/tpg1/luns /iscsi/iqn.20...e18/tpg1/luns> create /backstores/block/iscsi_shared_storage Created LUN 0. Created LUN 0->0 mapping in node ACL iqn.1994-05.com.redhat:827e5e8fecb Created LUN 0->0 mapping in node ACL iqn.1994-05.com.redhat:121c93cbad3a /iscsi/iqn.20...e18/tpg1/luns> cd / /> ls o- / ......................................................................................................................... [...] o- backstores .............................................................................................................. [...] | o- block .................................................................................................. [Storage Objects: 1] | | o- iscsi_shared_storage .............................................. [/dev/vg_iscsi/lv_iscsi (10.0GiB) write-thru activated] | | o- alua ................................................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized] | o- fileio ................................................................................................. [Storage Objects: 0] | o- pscsi .................................................................................................. [Storage Objects: 0] | o- ramdisk ................................................................................................ [Storage Objects: 0] o- iscsi ............................................................................................................ [Targets: 1] | o- iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18 ......................................................... [TPGs: 1] | o- tpg1 ............................................................................................... [no-gen-acls, no-auth] | o- acls .......................................................................................................... [ACLs: 2] | | o- iqn.1994-05.com.redhat:121c93cbad3a .................................................................. [Mapped LUNs: 1] | | | o- mapped_lun0 .................................................................. [lun0 block/iscsi_shared_storage (rw)] | | o- iqn.1994-05.com.redhat:827e5e8fecb ................................................................... [Mapped LUNs: 1] | | o- mapped_lun0 .................................................................. [lun0 block/iscsi_shared_storage (rw)] | o- luns .......................................................................................................... [LUNs: 1] | | o- lun0 ......................................... [block/iscsi_shared_storage (/dev/vg_iscsi/lv_iscsi) (default_tg_pt_gp)] | o- portals .................................................................................................... [Portals: 1] | o- 0.0.0.0:3260 ..................................................................................................... [OK] o- loopback ......................................................................................................... [Targets: 0] /> saveconfig Configuration saved to /etc/target/saveconfig.json /> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup/. Configuration saved to /etc/target/saveconfig.json
Abilita e riavvia il servizio Target.
[root@storage ~]# systemctl enable target
[root@storage ~]# systemctl restart target
Configura il firewall per consentire il traffico iSCSI.
[root@storage ~]# firewall-cmd --permanent --add-port=3260/tcp
[root@storage ~]# firewall-cmd --reload
Scopri spazio di archiviazione condiviso
Su entrambi i nodi del cluster, individua la destinazione utilizzando il comando seguente.
iscsiadm -m discovery -t st -p 192.168.0.20
Output: 192.168.0.20:3260,1 qn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18
Ora, accedi allo spazio di archiviazione di destinazione con il comando seguente.
iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18 -p 192.168.0.20 -l
Output: Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18, portal: 192.168.0.20,3260] Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18, portal: 192.168.0.20,3260] successful.
Riavvia e abilita il servizio iniziatore.
systemctl restart iscsid
systemctl enable iscsid
Imposta i nodi del cluster
Archiviazione condivisa
Vai a tutti i nodi del tuo cluster e controlla se il nuovo disco dal server iSCSI è visibile o meno.
Nei miei nodi, /dev/sdb è il disco condiviso dallo storage iSCSI.
fdisk -l | grep -i sd
Output: Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors /dev/sda1 * 2048 2099199 2097152 1G 83 Linux /dev/sda2 2099200 209715199 207616000 99G 8e Linux LVM Disk /dev/sdb: 10 GiB, 10733223936 bytes, 20963328 sectors
Su uno qualsiasi dei tuoi nodi (es, nodo1), crea un filesystem per il server web Apache per contenere i file del sito web. Creeremo un filesystem con LVM.
[root@node1 ~]# pvcreate /dev/sdb
[root@node1 ~]# vgcreate vg_apache /dev/sdb
[root@node1 ~]# lvcreate -n lv_apache -l 100%FREE vg_apache
[root@node1 ~]# mkfs.ext4 /dev/vg_apache/lv_apache
Ora vai su un altro nodo ed esegui i comandi seguenti per rilevare il nuovo filesystem.
[root@node2 ~]# pvscan
[root@node2 ~]# vgscan
[root@node2 ~]# lvscan
Infine, verifica l'LVM che abbiamo creato su node1 è disponibile su un altro nodo (Es. nodo2) utilizzando i comandi seguenti.
ls -al /dev/vg_apache/lv_apache
e
[root@node2 ~]# lvdisplay /dev/vg_apache/lv_apache
Output: _You should see /dev/vg_apache/lv_apache on node2.itzgeek.local_ --- Logical volume --- LV Path /dev/vg_apache/lv_apache LV Name lv_apache VG Name vg_apache LV UUID gXeaoB-VlN1-zWSW-2VnZ-RpmW-iDeC-kQOxZE LV Write Access read/write LV Creation host, time node1.itzgeek.local, 2020-03-30 08:08:17 -0400 LV Status NOT available LV Size 9.96 GiB Current LE 2551 Segments 1 Allocation inherit Read ahead sectors autoSe il sistema non visualizza il volume logico o il file del dispositivo non è stato trovato, valutare la possibilità di riavviare il secondo nodo.
Voce host
Crea una voce host su ogni nodo su tutti i nodi. Il cluster utilizzerà il nome host per comunicare tra loro.
vi /etc/hosts
Le voci dell'host saranno simili a quelle riportate di seguito.
192.168.0.11 node1.itzgeek.local node1
192.168.0.12 node2.itzgeek.local node2
Installa pacchetti
I pacchetti cluster sono disponibili nel repository High Availability. Quindi, configura il repository High Availability sul tuo sistema.
CentOS 8
dnf config-manager --set-enabled HighAvailability
RHEL 8
Abilita l'abbonamento a Red Hat su RHEL 8 e quindi abilita un repository High Availability per scaricare i pacchetti del cluster da Red Hat.
subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
Installa i pacchetti del cluster (pacemaker) con tutti gli agenti di fencing disponibili su tutti i nodi utilizzando il comando seguente.
dnf install -y pcs fence-agents-all pcp-zeroconf
Aggiungi una regola firewall per consentire a tutte le applicazioni ad alta disponibilità di avere una comunicazione adeguata tra i nodi. Puoi saltare questo passaggio se il sistema non ha il firewall abilitato.
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --add-service=high-availability
firewall-cmd --reload
Imposta una password per l'utente hacluster.
Questo account utente è un account di amministrazione del cluster. Ti consigliamo di impostare la stessa password per tutti i nodi.
passwd hacluster
Avvia il servizio cluster e abilitalo per l'avvio automatico all'avvio del sistema.
systemctl start pcsd
systemctl enable pcsd
Ricorda:devi eseguire i comandi precedenti su tutti i nodi del tuo cluster.
Crea un cluster ad alta disponibilità
Autorizza i nodi usando il comando seguente. Esegui il comando seguente in uno qualsiasi dei nodi per autorizzare i nodi.
[root@node1 ~]# pcs host auth node1.itzgeek.local node2.itzgeek.local
Output: Username: hacluster Password: << Enter Password node1.itzgeek.local: Authorized node2.itzgeek.local: Authorized
Crea un cluster. Modifica il nome del cluster itzgeek_cluster in base alle tue esigenze.
[root@node1 ~]# pcs cluster setup itzgeek_cluster --start node1.itzgeek.local node2.itzgeek.local
Output: No addresses specified for host 'node1.itzgeek.local', using 'node1.itzgeek.local' No addresses specified for host 'node2.itzgeek.local', using 'node2.itzgeek.local' Destroying cluster on hosts: 'node1.itzgeek.local', 'node2.itzgeek.local'... node1.itzgeek.local: Successfully destroyed cluster node2.itzgeek.local: Successfully destroyed cluster Requesting remove 'pcsd settings' from 'node1.itzgeek.local', 'node2.itzgeek.local' node1.itzgeek.local: successful removal of the file 'pcsd settings' node2.itzgeek.local: successful removal of the file 'pcsd settings' Sending 'corosync authkey', 'pacemaker authkey' to 'node1.itzgeek.local', 'node2.itzgeek.local' node1.itzgeek.local: successful distribution of the file 'corosync authkey' node1.itzgeek.local: successful distribution of the file 'pacemaker authkey' node2.itzgeek.local: successful distribution of the file 'corosync authkey' node2.itzgeek.local: successful distribution of the file 'pacemaker authkey' Sending 'corosync.conf' to 'node1.itzgeek.local', 'node2.itzgeek.local' node1.itzgeek.local: successful distribution of the file 'corosync.conf' node2.itzgeek.local: successful distribution of the file 'corosync.conf' Cluster has been successfully set up. Starting cluster on hosts: 'node1.itzgeek.local', 'node2.itzgeek.local'...
Abilita l'avvio del cluster all'avvio del sistema.
[root@node1 ~]# pcs cluster enable --all
Output: node1.itzgeek.local: Cluster Enabled node2.itzgeek.local: Cluster Enabled
Utilizza il comando seguente per ottenere lo stato del cluster.
[root@node1 ~]# pcs cluster status
Output: Cluster Status: Stack: corosync Current DC: node1.itzgeek.local (version 2.0.2-3.el8_1.2-744a30d655) - partition with quorum Last updated: Mon Mar 30 08:28:08 2020 Last change: Mon Mar 30 08:27:25 2020 by hacluster via crmd on node1.itzgeek.local 2 nodes configured 0 resources configured PCSD Status: node1.itzgeek.local: Online node2.itzgeek.local: Online
Esegui il comando seguente per ottenere informazioni dettagliate sul cluster che include le sue risorse, lo stato del pacemaker e i dettagli dei nodi.
[root@node1 ~]# pcs status
Output: Cluster name: itzgeek_cluster WARNINGS: No stonith devices and stonith-enabled is not false Stack: corosync Current DC: node1.itzgeek.local (version 2.0.2-3.el8_1.2-744a30d655) - partition with quorum Last updated: Mon Mar 30 08:33:37 2020 Last change: Mon Mar 30 08:27:25 2020 by hacluster via crmd on node1.itzgeek.local 2 nodes configured 0 resources configured Online: [ node1.itzgeek.local node2.itzgeek.local ] No resources Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
Dispositivi di scherma
Il dispositivo di scherma è un dispositivo hardware che aiuta a disconnettere il nodo problematico reimpostando il nodo / disconnettendo l'archiviazione condivisa dall'accesso. Questo cluster demo è in esecuzione su VMware e non ha alcun dispositivo di fencing esterno da configurare. Tuttavia, puoi seguire questa guida per configurare un dispositivo di scherma.
Dal momento che non stiamo usando la scherma, disabilitalo (STONITH). Devi disabilitare il fencing per avviare le risorse del cluster, ma non è consigliabile disabilitare STONITH nell'ambiente di produzione.
[root@node1 ~]# pcs property set stonith-enabled=false
Risorse cluster
Prepara risorse
Server Web Apache
Installa il server web Apache su entrambi i nodi.
dnf install -y httpd
Modifica il file di configurazione.
vi /etc/httpd/conf/httpd.conf
Aggiungi il contenuto di seguito alla fine del file su entrambi i nodi del cluster.
<Location /server-status>
SetHandler server-status
Require local
</Location>
Modifica la configurazione logrotate del server Web Apache per indicare di non utilizzare systemd poiché la risorsa cluster non utilizza systemd per ricaricare il servizio.
Modifica la riga sottostante.
DA:
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
A:
/usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd.pid" -k graceful > /dev/null 2>/dev/null || true
Ora utilizzeremo lo spazio di archiviazione condiviso per archiviare il file di contenuto Web (HTML). Eseguire l'operazione seguente in uno qualsiasi dei nodi.
[root@node1 ~]# mount /dev/vg_apache/lv_apache /var/www/
[root@node1 ~]# mkdir /var/www/html
[root@node1 ~]# mkdir /var/www/cgi-bin
[root@node1 ~]# mkdir /var/www/error
[root@node1 ~]# restorecon -R /var/www
[root@node1 ~]# cat <<-END >/var/www/html/index.html
<html>
<body>Hello, Welcome!. This Page Is Served By Red Hat Hight Availability Cluster</body>
</html>
END
[root@node1 ~]# umount /var/www
Consenti il servizio Apache nel firewall su entrambi i nodi.
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
Crea risorse
Crea una risorsa del filesystem per il server Apache. Usa lo spazio di archiviazione proveniente dal server iSCSI.
[root@node1 ~]# pcs resource create httpd_fs Filesystem device="/dev/mapper/vg_apache-lv_apache" directory="/var/www" fstype="ext4" --group apache
Output: Assumed agent name 'ocf:`heartbeat`:Filesystem' (deduced from 'Filesystem')
Crea una risorsa di indirizzo IP. Questo indirizzo IP fungerà da indirizzo IP virtuale per Apache e i client utilizzeranno questo indirizzo IP per accedere al contenuto Web anziché l'ip di un singolo nodo.
[root@node1 ~]# pcs resource create httpd_vip IPaddr2 ip=192.168.0.100 cidr_netmask=24 --group apache
Output: Assumed agent name 'ocf:`heartbeat`:IPaddr2' (deduced from 'IPaddr2')
Crea una risorsa Apache per monitorare lo stato del server Apache che sposterà la risorsa su un altro nodo in caso di errore.
[root@node1 ~]# pcs resource create httpd_ser apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apache
Output: Assumed agent name 'ocf:`heartbeat`:apache' (deduced from 'apache')
Controlla lo stato del cluster.
[root@node1 ~]# pcs status
Output: Cluster name: itzgeek_cluster Stack: corosync Current DC: node1.itzgeek.local (version 2.0.2-3.el8_1.2-744a30d655) - partition with quorum Last updated: Mon Mar 30 09:02:07 2020 Last change: Mon Mar 30 09:01:46 2020 by root via cibadmin on node1.itzgeek.local 2 nodes configured 3 resources configured Online: [ node1.itzgeek.local node2.itzgeek.local ] Full list of resources: Resource Group: apache httpd_fs (ocf:💓Filesystem): Started node1.itzgeek.local httpd_vip (ocf:💓IPaddr2): Started node1.itzgeek.local httpd_ser (ocf:💓apache): Started node1.itzgeek.local Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
Verifica cluster ad alta disponibilità
Una volta che il cluster è attivo e funzionante, punta un browser Web all'indirizzo IP virtuale di Apache. Dovresti ottenere una pagina web come quella di seguito.
Test del cluster ad alta disponibilità
Verifichiamo il failover delle risorse mettendo il nodo attivo (dove sono in esecuzione tutte le risorse) in modalità standby.
[root@node1 ~]# pcs node standby node1.itzgeek.local
Comandi cluster importanti
Elenca le risorse del cluster:
pcs resource status
Riavvia la risorsa del cluster:
pcs resource restart <resource_name>
Sposta la risorsa da un nodo:
pcs resource move <resource_group> <destination_node_name>
Metti il cluster in manutenzione:
pcs property set maintenance-mode=true
Rimuovere il cluster dalla manutenzione:
pcs property set maintenance-mode=false
Avvia il nodo del cluster:
pcs cluster start <node_name>
Arresta nodo cluster:
pcs cluster stop <node_name>
Avvia cluster:
pcs cluster start --all
Arresta cluster:
pcs cluster stop --all
Distruggi il gruppo:
pcs cluster destroy <cluster_name>
Interfaccia utente Web del cluster
L'interfaccia utente web di pcsd consente di creare, configurare e gestire i cluster Pacemaker.
L'interfaccia web sarà accessibile una volta avviato il servizio pcsd sul nodo ed è disponibile sulla porta numero 2224.
https://nome_nodo:2224Accedi con l'hacluster dell'utente amministrativo del cluster e la relativa password.
Poiché disponiamo già di un cluster, fare clic su Aggiungi esistente per aggiungere il cluster Pacemaker esistente. Nel caso in cui desideri configurare un nuovo cluster, puoi leggere la documentazione ufficiale.
Immettere uno qualsiasi di un nodo del cluster per rilevare un cluster esistente.
In un minuto o due vedrai il tuo cluster esistente nell'interfaccia utente web.
Seleziona il cluster per saperne di più sulle informazioni sul cluster.
Fare clic sul nome del cluster per visualizzare i dettagli del nodo.
Fai clic su risorse del cluster per visualizzare l'elenco delle risorse e i relativi dettagli.
Riferimento :Documentazione Red Hat.
Conclusione
È tutto. In questo post, hai imparato come configurare un cluster ad alta disponibilità su CentOS 8 / RHEL 8.