High-Availability-Cluster, auch Failover-Cluster (Aktiv-Passiv-Cluster) genannt, ist einer der am weitesten verbreiteten Cluster-Typen in der Produktionsumgebung. Diese Art von Cluster bietet Ihnen die kontinuierliche Verfügbarkeit von Diensten, selbst wenn einer der Cluster-Knoten ausfällt. Wenn die Anwendung auf dem Server aus irgendeinem Grund ausgefallen ist (Hardwarefehler), wird die Cluster-Software (Schrittmacher) die Anwendung auf einem anderen Knoten neu starten.
Hochverfügbarkeit wird hauptsächlich für Datenbanken, benutzerdefinierte Anwendungen und auch für die gemeinsame Nutzung von Dateien verwendet. Failover ist nicht nur das Starten einer Anwendung. Es hat eine Reihe von Operationen, die damit verbunden sind, wie das Mounten von Dateisystemen, das Konfigurieren von Netzwerken und das Starten abhängiger Anwendungen.
Umgebung
CentOS 7 / RHEL 7 unterstützt Failover-Cluster mit Pacemaker. Hier betrachten wir die Konfiguration des Apache-(Web-)Servers als hochverfügbare Anwendung.
Wie gesagt, Failover ist eine Reihe von Operationen, also müssten wir Dateisystem und Netzwerke als Ressource konfigurieren. Für ein Dateisystem würden wir einen gemeinsam genutzten Speicher vom iSCSI-Speicher verwenden.
Hostname | IP-Adresse | Betriebssystem | Zweck |
---|---|---|---|
node1.itzgeek.local | 192.168.1.11 | CentOS 7 | Clusterknoten 1 |
node2.itzgeek.local | 192.168.1.12 | Clusterknoten 1 | |
server.itzgeek.local | 192.168.1.20 | Gemeinsamer iSCSI-Speicher | |
192.168.1.100 | Virtuelle Cluster-IP (Apache) |
Alle laufen auf VMware Workstation.
Gemeinsamer Speicher
Gemeinsam genutzter Speicher ist eine der wichtigsten Ressourcen im Hochverfügbarkeitscluster, da er die Daten einer laufenden Anwendung enthält. Alle Knoten in einem Cluster haben Zugriff auf den gemeinsam genutzten Speicher für aktuelle Daten. SAN-Speicher ist der am weitesten verbreitete gemeinsam genutzte Speicher in der Produktionsumgebung. Für diese Demo konfigurieren wir zu Demonstrationszwecken einen Cluster mit iSCSI-Speicher.
Pakete installieren
iSCSI-Server
[root@server ~]# yum install targetcli -y
Clusterknoten
Es ist an der Zeit, Cluster-Knoten für die Verwendung von iSCSI-Speicher zu konfigurieren. Führen Sie die folgenden Schritte auf allen Ihren Cluster-Knoten aus.
# yum install iscsi-initiator-utils -y
Setup-Diskette
Hier erstellen wir 10 GB LVM-Festplatte auf dem iSCSI-Server, um sie als gemeinsam genutzten Speicher für unsere Cluster-Knoten zu verwenden. Lassen Sie uns die verfügbaren Festplatten auflisten, die mit dem Befehl.
an den Zielserver angeschlossen sind[root@server ~]# fdisk -l | grep -i sd
Ausgabe:
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
Aus der obigen Ausgabe können Sie ersehen, dass mein System über 10 GB Festplatte (/dev/sdb) verfügt. Erstellen Sie einen LVM mit /dev/sdb (ersetzen Sie /dev/sdb durch Ihren Festplattennamen)
[root@server ~]# pvcreate /dev/sdb [root@server ~]# vgcreate vg_iscsi /dev/sdb [root@server ~]# lvcreate -l 100%FREE -n lv_iscsi vg_iscsi
Gemeinsamen Speicher erstellen
Rufen Sie die Details des Knoteninitiators ab.
cat /etc/iscsi/initiatorname.iscsi
Knoten 1:
InitiatorName=iqn.1994-05.com.redhat:b11df35b6f75
Knoten 2:
InitiatorName=iqn.1994-05.com.redhat:119eaf9252a
Geben Sie den folgenden Befehl ein, um eine iSCSI-CLI für eine interaktive Eingabeaufforderung zu erhalten.
[root@server ~]# targetcli
Ausgabe:
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 ~]#
Aktivieren Sie den Zieldienst und starten Sie ihn neu.
[root@server ~]# systemctl enable target [root@server ~]# systemctl restart target
Konfigurieren Sie die Firewall, um iSCSI-Datenverkehr zuzulassen.
[root@server ~]# firewall-cmd --permanent --add-port=3260/tcp [root@server ~]# firewall-cmd --reload
Freigegebenen Speicher entdecken
Ermitteln Sie auf beiden Cluster-Knoten das Ziel mit dem folgenden Befehl.
# iscsiadm -m discovery -t st -p 192.168.1.20
Ausgabe:
192.168.1.20:3260,1 iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5
Melden Sie sich jetzt mit dem folgenden Befehl beim Ziel an.
# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5 -p 192.168.1.20 -l
Ausgabe:
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.
Starten Sie den Initiatordienst neu und aktivieren Sie ihn.
# systemctl restart iscsid # systemctl enable iscsid
Clusterknoten einrichten
Host-Eintrag
Machen Sie für alle Knoten auf jedem Knoten einen Host-Eintrag. Der Cluster verwendet den Hostnamen, um miteinander zu kommunizieren.
# vi /etc/hosts
Host-Einträge werden in etwa so aussehen.
192.168.1.11 node1.itzgeek.local node1 192.168.1.12 node2.itzgeek.local node2
Gemeinsamer Speicher
Gehen Sie zu allen Ihren Knoten und prüfen Sie, ob die neue Festplatte sichtbar ist oder nicht. In meinen Knoten ist /dev/sdb die Festplatte, die von unserem iSCSI-Speicher kommt.
# fdisk -l | grep -i sd
Ausgabe:
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
Erstellen Sie auf einem Ihrer Knoten (z. B. Knoten1) ein Dateisystem für den Apache-Webserver, um die Website-Dateien zu speichern. Wir werden ein Dateisystem mit LVM erstellen.
[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
Gehen Sie nun zu einem anderen Knoten und führen Sie die folgenden Befehle aus, um das neue Dateisystem zu erkennen.
[root@node2 ~]# pvscan [root@node2 ~]# vgscan [root@node2 ~]# lvscan
Überprüfen Sie schließlich den LVM, den wir auf node1 erstellt haben steht Ihnen auf einem anderen Knoten (z. B. Knoten2) mit dem folgenden Befehl zur Verfügung.
[root@node2 ~]# lvdisplay /dev/vg_apache/lv_apache
Ausgabe: Sie sollten /dev/vg_apache/lv_apache auf node2.itzgeek.local sehen
--- 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:3Wenn das System das logische Volume nicht anzeigt, ziehen Sie in Betracht, den zweiten Knoten neu zu starten.
Pakete installieren
Installieren Sie Cluster-Pakete (Schrittmacher) auf allen Knoten mit dem folgenden Befehl.
# yum install pcs fence-agents-all -y
Ermöglichen Sie allen Hochverfügbarkeitsanwendungen auf der Firewall eine ordnungsgemäße Kommunikation zwischen den Knoten. Sie können diesen Schritt überspringen, wenn auf dem System keine Firewall installiert ist.
# firewall-cmd --permanent --add-service=high-availability # firewall-cmd --add-service=high-availability
Verwenden Sie den folgenden Befehl, um die zulässigen Anwendungen in der Firewall aufzulisten.
# firewall-cmd --list-service
Ausgabe:
ssh dhcpv6-client high-availability
Legen Sie das Passwort für den Benutzer hacluster fest. Dieses Benutzerkonto ist ein Clusterverwaltungskonto. Wir empfehlen Ihnen, für alle Knoten dasselbe Passwort festzulegen.
# passwd hacluster
Starten Sie den Clusterdienst. Aktivieren Sie außerdem den automatischen Start beim Systemstart.
# systemctl start pcsd # systemctl enable pcsd
Denken Sie daran, die obigen Befehle auf allen Ihren Cluster-Knoten auszuführen.
Erstellen Sie einen Hochverfügbarkeitscluster
Autorisieren Sie die Knoten mit dem folgenden Befehl. Führen Sie den folgenden Befehl in einem der Knoten aus, um die Knoten zu autorisieren.
[root@node1 ~]# pcs cluster auth node1.itzgeek.local node2.itzgeek.local
Ausgabe:
Username: hacluster Password: << Enter Password node1.itzgeek.local: Authorized node2.itzgeek.local: Authorized
Cluster erstellen.
[root@node1 ~]# pcs cluster setup --start --name itzgeek_cluster node1.itzgeek.local node2.itzgeek.local
Ausgabe:
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
Ermöglichen Sie dem Cluster, beim Systemstart zu starten.
[root@node1 ~]# pcs cluster enable --all
Ausgabe:
node1.itzgeek.local: Cluster Enabled node2.itzgeek.local: Cluster Enabled
Verwenden Sie den folgenden Befehl, um den Status des Clusters abzurufen.
[root@node1 ~]# pcs cluster status
Ausgabe:
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
Führen Sie den folgenden Befehl aus, um detaillierte Informationen über den Cluster zu erhalten, einschließlich seiner Ressourcen, des Pacemaker-Status und der Knotendetails.
[root@node1 ~]# pcs status
Ausgabe:
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
Fechtgeräte
Das Fencing-Gerät ist ein Hardware-/Softwaregerät, das hilft, den problematischen Knoten zu trennen, indem es den Knoten zurücksetzt / den gemeinsamen Speicher vom Zugriff trennt. Mein Demo-Cluster läuft auf der VMware Virtual Machine, daher zeige ich Ihnen kein Fencing-Gerät-Setup, aber Sie können dieser Anleitung folgen, um ein Fencing-Gerät einzurichten.
Cluster-Ressourcen
Ressourcen vorbereiten
Apache-Webserver
Installieren Sie den Apache-Webserver auf beiden Knoten.
# yum install -y httpd wget
Bearbeiten Sie die Konfigurationsdatei.
# vi /etc/httpd/conf/httpd.conf
Fügen Sie den folgenden Inhalt am Ende der Datei auf beiden Cluster-Knoten hinzu.
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 </Location>
Jetzt müssen wir den gemeinsamen Speicher zum Speichern der Webinhaltsdatei (HTML) verwenden. Führen Sie den folgenden Vorgang in einem der Knoten aus.
[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
Apache-Dienst in der Firewall auf beiden Knoten zulassen.
# firewall-cmd --permanent --add-service=http # firewall-cmd --reload
Ressourcen erstellen
Erstellen Sie eine Dateisystemressource für den Apache-Server. Verwenden Sie den Speicher, der vom iSCSI-Server kommt.
# pcs resource create httpd_fs Filesystem device="/dev/mapper/vg_apache-lv_apache" directory="/var/www" fstype="ext4" --group apache
Ausgabe:
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
Erstellen Sie eine IP-Adressressource. Diese IP-Adresse fungiert als virtuelle IP-Adresse für den Apache, und Clients verwenden diese IP-Adresse für den Zugriff auf den Webinhalt anstelle der IP des einzelnen Knotens.
# pcs resource create httpd_vip IPaddr2 ip=192.168.1.100 cidr_netmask=24 --group apache
Ausgabe:
Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPaddr2')
Erstellen Sie eine Apache-Ressource, die den Status des Apache-Servers überwacht und die Ressource im Falle eines Fehlers auf einen anderen Knoten verschiebt.
# pcs resource create httpd_ser apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apache
Ausgabe:
Assumed agent name 'ocf:heartbeat:apache' (deduced from 'apache')
Da wir kein Fechten verwenden, deaktivieren Sie es (STONITH). Sie müssen die Cluster-Ressourcen zum Starten deaktivieren, aber das Deaktivieren von STONITH in der Produktionsumgebung wird nicht empfohlen.
# pcs property set stonith-enabled=false
Überprüfen Sie den Status des Clusters.
[root@node1 ~]# pcs status
Ausgabe:
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
Hochverfügbarkeitscluster überprüfen
Sobald der Cluster betriebsbereit ist, verweisen Sie einen Webbrowser auf die virtuelle IP-Adresse von Apache. Sie sollten eine Webseite wie unten sehen.
Hochverfügbarkeitscluster testen
Lassen Sie uns das Failover der Ressource des Knotens überprüfen, indem wir den Cluster auf dem aktiven Knoten stoppen.
[root@node1 ~]# pcs cluster stop node1.itzgeek.local
Schlussfolgerung
Das ist alles. In diesem Beitrag haben Sie gelernt, wie Sie einen High-Availability-Cluster unter CentOS 7 einrichten. Bitte teilen Sie uns Ihre Meinung im Kommentarbereich mit.