GNU/Linux >> Linux Esercitazione >  >> Cent OS

Come configurare il cluster ad alta disponibilità su CentOS 8 / RHEL 8

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 Indirizzo IP OS Scopo
node1.itzgeek.local 192.168.0.11 CentOS 8 Nodo cluster 1
node2.itzgeek.local 192.168.0.12 Nodo cluster 2
storage.itzgeek.local 192.168.0.20 Archiviazione condivisa iSCSI
192.168.0.100 IP del cluster virtuale (Apache)

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     auto
Se 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:2224

Accedi 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.


Cent OS
  1. Come configurare il server SysLog su CentOS 7 / RHEL 7

  2. Come configurare il server NFS su CentOS 7 / RHEL 7

  3. Come configurare Icinga Web 2 su CentOS 7 / RHEL 7

  4. Come configurare il cluster ad alta disponibilità Nginx utilizzando Pacemaker su CentOS 7

  5. Come impostare mutt in CentOS/RHEL

Come configurare uno Chef 12 su CentOS 7 / RHEL 7

Come configurare il server SysLog centralizzato su CentOS 8 / RHEL 8

Come configurare un cluster Pacemaker per Linux ad alta disponibilità

Come impostare la replica MySQL in RHEL/Centos

Come configurare Redis per un'elevata disponibilità con Sentinel in CentOS 8 – Parte 2

Come configurare un cluster Redis in CentOS 8 – Parte 3