Il cluster ad alta disponibilità, noto anche come cluster di failover (cluster attivo-passivo), è uno dei tipi di cluster più utilizzati nell'ambiente di produzione. Questo tipo di cluster fornisce la disponibilità continua dei servizi anche se uno dei nodi del cluster si guasta. Se il server che esegue l'applicazione si è guastato per qualche motivo (guasto hardware), il software del cluster (pacemaker) riavvierà l'applicazione su un altro nodo.
High-Availability viene utilizzato principalmente per database, applicazioni personalizzate e anche per la condivisione di file. Il failover non è solo l'avvio di un'applicazione. Ha alcune serie di operazioni ad esso associate come il montaggio di filesystem, la configurazione di reti e l'avvio di applicazioni dipendenti.
Ambiente
CentOS 7 / RHEL 7 supporta il cluster di failover utilizzando il pacemaker. Qui esamineremo la configurazione del server Apache (web) come applicazione ad alta disponibilità.
Come ho detto, il failover è una serie di operazioni, quindi avremmo bisogno di configurare il filesystem e le reti come risorsa. Per un filesystem, utilizzeremmo una memoria condivisa dalla memoria iSCSI.
Nome host | Indirizzo IP | OS | Scopo |
---|---|---|---|
node1.itzgeek.local | 192.168.1.11 | CentOS 7 | Nodo cluster 1 |
node2.itzgeek.local | 192.168.1.12 | Nodo cluster 1 | |
server.itzgeek.local | 192.168.1.20 | Archiviazione condivisa iSCSI | |
192.168.1.100 | IP del cluster virtuale (Apache) |
Tutti sono in esecuzione su VMware Workstation.
Archiviazione condivisa
L'archiviazione condivisa è una delle risorse importanti nel cluster ad alta disponibilità in quanto contiene i dati di un'applicazione in esecuzione. Tutti i nodi in un cluster avranno accesso all'archiviazione condivisa per i dati recenti. Lo storage SAN è lo storage condiviso più utilizzato nell'ambiente di produzione. Per questa demo, configureremo un cluster con storage iSCSI a scopo dimostrativo.
Installa pacchetti
Server iSCSI
[root@server ~]# yum install targetcli -y
Nodi cluster
È il momento di configurare i nodi del cluster per utilizzare l'archiviazione iSCSI, eseguire i passaggi seguenti su tutti i nodi del cluster.
# yum install iscsi-initiator-utils -y
Disco di installazione
Qui creeremo 10 GB di disco LVM sul server iSCSI da utilizzare come memoria condivisa per i nostri nodi del cluster. Elenchiamo i dischi disponibili collegati al server di destinazione utilizzando il comando.
[root@server ~]# fdisk -l | grep -i sd
Risultato:
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 209715199 104344576 8e Linux LVM Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Dall'output sopra, puoi vedere che il mio sistema ha 10 GB di disco rigido (/dev/sdb). Crea un LVM con /dev/sdb (sostituisci /dev/sdb con il nome del tuo disco)
[root@server ~]# pvcreate /dev/sdb [root@server ~]# vgcreate vg_iscsi /dev/sdb [root@server ~]# 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:b11df35b6f75
Nodo 2:
InitiatorName=iqn.1994-05.com.redhat:119eaf9252a
Immettere il comando seguente per ottenere un'interfaccia a riga di comando iSCSI per un prompt interattivo.
[root@server ~]# targetcli
Risultato:
targetcli shell version 2.1.fb46 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.server.x8664:sn.518a1f561ad5. 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.server.x8664:sn.518a1f561ad5/tpg1/acls /iscsi/iqn.20...ad5/tpg1/acls> create iqn.1994-05.com.redhat:b11df35b6f75 << Initiator of Node 1 Created Node ACL for iqn.1994-05.com.redhat:b11df35b6f75 /iscsi/iqn.20...ad5/tpg1/acls> create iqn.1994-05.com.redhat:119eaf9252a << Initiator of Node 1 Created Node ACL for iqn.1994-05.com.redhat:119eaf9252a /iscsi/iqn.20...ad5/tpg1/acls> cd /iscsi/iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5/tpg1/luns /iscsi/iqn.20...ad5/tpg1/luns> create /backstores/block/iscsi_shared_storage Created LUN 0. Created LUN 0->0 mapping in node ACL iqn.1994-05.com.redhat:119eaf9252a Created LUN 0->0 mapping in node ACL iqn.1994-05.com.redhat:b11df35b6f75 /iscsi/iqn.20...ad5/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.server.x8664:sn.518a1f561ad5 ....................................... [TPGs: 1] | o- tpg1 ............................................................................ [no-gen-acls, no-auth] | o- acls ....................................................................................... [ACLs: 2] | | o- iqn.1994-05.com.redhat:119eaf9252a ................................................ [Mapped LUNs: 1] | | | o- mapped_lun0 ............................................... [lun0 block/iscsi_shared_storage (rw)] | | o- iqn.1994-05.com.redhat:b11df35b6f75 ............................................... [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 [root@server ~]#
Abilita e riavvia il servizio di destinazione.
[root@server ~]# systemctl enable target [root@server ~]# systemctl restart target
Configura il firewall per consentire il traffico iSCSI.
[root@server ~]# firewall-cmd --permanent --add-port=3260/tcp [root@server ~]# firewall-cmd --reload
Scopri lo 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.1.20
Risultato:
192.168.1.20:3260,1 iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5
Ora, accedi alla destinazione con il comando seguente.
# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5 -p 192.168.1.20 -l
Risultato:
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5, portal: 192.168.1.20,3260] (multiple) Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5, portal: 192.168.1.20,3260] successful.
Riavvia e abilita il servizio iniziatore.
# systemctl restart iscsid # systemctl enable iscsid
Imposta i nodi del cluster
Inserimento host
Crea una voce host su ogni nodo per 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.1.11 node1.itzgeek.local node1 192.168.1.12 node2.itzgeek.local node2
Archiviazione condivisa
Vai a tutti i tuoi nodi e controlla se il nuovo disco è visibile o meno. Nei miei nodi, /dev/sdb è il disco proveniente dal nostro storage iSCSI.
# fdisk -l | grep -i sd
Risultato:
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 209715199 104344576 8e Linux LVM Disk /dev/sdb: 10.7 GB, 10733223936 bytes, 20963328 sectors
Su uno qualsiasi dei tuoi nodi (es, node1), 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 il comando seguente.
[root@node2 ~]# lvdisplay /dev/vg_apache/lv_apache
Risultato: Dovresti vedere /dev/vg_apache/lv_apache su node2.itzgeek.local
--- Logical volume --- LV Path /dev/vg_apache/lv_apache LV Name lv_apache VG Name vg_apache LV UUID mFUyuk-xTtK-r7PV-PLPq-yoVC-Ktto-TcaYpS LV Write Access read/write LV Creation host, time node1.itzgeek.local, 2019-07-05 08:57:33 +0530 LV Status available # open 0 LV Size 9.96 GiB Current LE 2551 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3Se il sistema non visualizza il volume logico, prendere in considerazione il riavvio del secondo nodo.
Installa pacchetti
Installa i pacchetti del cluster (pacemaker) su tutti i nodi usando il comando seguente.
# yum install pcs fence-agents-all -y
Consenti a tutte le applicazioni ad alta disponibilità sul firewall di avere una comunicazione adeguata tra i nodi. Puoi saltare questo passaggio se il sistema non ha firewalld installato.
# firewall-cmd --permanent --add-service=high-availability # firewall-cmd --add-service=high-availability
Utilizzare il comando seguente per elencare le applicazioni consentite nel firewall.
# firewall-cmd --list-service
Risultato:
ssh dhcpv6-client high-availability
Imposta la 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. Inoltre, abilita l'avvio automatico all'avvio del sistema.
# systemctl start pcsd # systemctl enable pcsd
Ricorda di eseguire i comandi precedenti su tutti i nodi del tuo cluster.
Crea un cluster ad alta disponibilità
Autorizza i nodi usando il comando sotto. Esegui il comando seguente in uno qualsiasi dei nodi per autorizzare i nodi.
[root@node1 ~]# pcs cluster auth node1.itzgeek.local node2.itzgeek.local
Risultato:
Username: hacluster Password: << Enter Password node1.itzgeek.local: Authorized node2.itzgeek.local: Authorized
Crea un cluster.
[root@node1 ~]# pcs cluster setup --start --name itzgeek_cluster node1.itzgeek.local node2.itzgeek.local
Risultato:
Destroying cluster on nodes: node1.itzgeek.local, node2.itzgeek.local... node1.itzgeek.local: Stopping Cluster (pacemaker)... node2.itzgeek.local: Stopping Cluster (pacemaker)... node2.itzgeek.local: Successfully destroyed cluster node1.itzgeek.local: Successfully destroyed cluster Sending 'pacemaker_remote authkey' to 'node1.itzgeek.local', 'node2.itzgeek.local' node1.itzgeek.local: successful distribution of the file 'pacemaker_remote authkey' node2.itzgeek.local: successful distribution of the file 'pacemaker_remote authkey' Sending cluster config files to the nodes... node1.itzgeek.local: Succeeded node2.itzgeek.local: Succeeded Starting cluster on nodes: node1.itzgeek.local, node2.itzgeek.local... node1.itzgeek.local: Starting Cluster (corosync)... node2.itzgeek.local: Starting Cluster (corosync)... node1.itzgeek.local: Starting Cluster (pacemaker)... node2.itzgeek.local: Starting Cluster (pacemaker)... Synchronizing pcsd certificates on nodes node1.itzgeek.local, node2.itzgeek.local... node1.itzgeek.local: Success node2.itzgeek.local: Success Restarting pcsd on the nodes in order to reload the certificates... node1.itzgeek.local: Success node2.itzgeek.local: Success
Abilita l'avvio del cluster all'avvio del sistema.
[root@node1 ~]# pcs cluster enable --all
Risultato:
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
Risultato:
Cluster Status: Stack: corosync Current DC: node2.itzgeek.local (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum Last updated: Fri Jul 5 09:14:57 2019 Last change: Fri Jul 5 09:13:12 2019 by hacluster via crmd on node2.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, comprese le sue risorse, lo stato del pacemaker e i dettagli dei nodi.
[root@node1 ~]# pcs status
Risultato:
Cluster name: itzgeek_cluster WARNINGS: No stonith devices and stonith-enabled is not false Stack: corosync Current DC: node2.itzgeek.local (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum Last updated: Fri Jul 5 09:15:37 2019 Last change: Fri Jul 5 09:13:12 2019 by hacluster via crmd on node2.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 recinzione è un dispositivo hardware/software che aiuta a disconnettere il nodo problematico reimpostando il nodo/scollegando l'archiviazione condivisa dall'accesso. Il mio cluster demo è in esecuzione sulla macchina virtuale VMware, quindi non ti sto mostrando una configurazione del dispositivo di scherma, ma puoi seguire questa guida per configurare un dispositivo di scherma.
Risorse del cluster
Prepara risorse
Server Web Apache
Installa il server web Apache su entrambi i nodi.
# yum install -y httpd wget
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 Order deny,allow Deny from all Allow from 127.0.0.1 </Location>
Ora è necessario utilizzare l'archiviazione condivisa per archiviare il file di contenuto Web (HTML). Eseguire l'operazione seguente in uno qualsiasi dei nodi.
[root@node2 ~]# mount /dev/vg_apache/lv_apache /var/www/ [root@node2 ~]# mkdir /var/www/html [root@node2 ~]# mkdir /var/www/cgi-bin [root@node2 ~]# mkdir /var/www/error [root@node2 ~]# restorecon -R /var/www [root@node2 ~]# 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@node2 ~]# 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.
# pcs resource create httpd_fs Filesystem device="/dev/mapper/vg_apache-lv_apache" directory="/var/www" fstype="ext4" --group apache
Risultato:
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 del singolo nodo.
# pcs resource create httpd_vip IPaddr2 ip=192.168.1.100 cidr_netmask=24 --group apache
Risultato:
Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPaddr2')
Crea una risorsa Apache che monitorerà lo stato del server Apache e sposterà la risorsa su un altro nodo in caso di errore.
# pcs resource create httpd_ser apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apache
Risultato:
Assumed agent name 'ocf:heartbeat:apache' (deduced from 'apache')
Dal momento che non stiamo usando la scherma, disabilitalo (STONITH). Devi disabilitare per avviare le risorse del cluster, ma non è consigliabile disabilitare STONITH nell'ambiente di produzione.
# pcs property set stonith-enabled=false
Controlla lo stato del cluster.
[root@node1 ~]# pcs status
Risultato:
Cluster name: itzgeek_cluster Stack: corosync Current DC: node2.itzgeek.local (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum Last updated: Fri Jul 5 09:26:04 2019 Last change: Fri Jul 5 09:25:58 2019 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::heartbeat:Filesystem): Started node1.itzgeek.local httpd_vip (ocf::heartbeat:IPaddr2): Started node1.itzgeek.local httpd_ser (ocf::heartbeat: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 della risorsa del nodo arrestando il cluster sul nodo attivo.
[root@node1 ~]# pcs cluster stop node1.itzgeek.local
Conclusione
È tutto. In questo post, hai imparato come configurare un cluster ad alta disponibilità su CentOS 7. Facci sapere cosa ne pensi nella sezione commenti.