El clúster de alta disponibilidad, también conocido como clúster de conmutación por error (clúster activo-pasivo), es uno de los tipos de clúster más utilizados en el entorno de producción. Este tipo de clúster le brinda la disponibilidad continua de los servicios incluso si falla uno de los nodos del clúster. Si el servidor que ejecuta la aplicación falla por alguna razón (falla de hardware), el software del clúster (marcapasos) reiniciará la aplicación en otro nodo.
La alta disponibilidad se utiliza principalmente para bases de datos, aplicaciones personalizadas y también para compartir archivos. La conmutación por error no es solo iniciar una aplicación. Tiene una serie de operaciones asociadas, como montar sistemas de archivos, configurar redes e iniciar aplicaciones dependientes.
CentOS 7/RHEL 7 es compatible con el clúster de conmutación por error mediante el marcapasos. Aquí, veremos cómo configurar el servidor Apache (web) como una aplicación de alta disponibilidad.
Como dije, la conmutación por error es una serie de operaciones, por lo que necesitaríamos configurar el sistema de archivos y las redes como un recurso. Para un sistema de archivos, estaríamos usando un almacenamiento compartido del almacenamiento iSCSI.
Nombre de host | Dirección IP | SO | Propósito |
nodo1.itzgeek.local | 192.168.1.11 | CentOS 7 Nodo de clúster 1 |
nodo2.itzgeek.local | 192.168.1.12 | Nodo de clúster 1 |
servidor.itzgeek.local | 192.168.1.20 | Almacenamiento compartido iSCSI |
192.168.1.100 | IP de clúster virtual (Apache) |
Todos se ejecutan en VMware Workstation.
Almacenamiento compartido
El almacenamiento compartido es uno de los recursos importantes en el clúster de alta disponibilidad, ya que contiene los datos de una aplicación en ejecución. Todos los nodos de un clúster tendrán acceso al almacenamiento compartido para datos recientes. El almacenamiento SAN es el almacenamiento compartido más utilizado en el entorno de producción. Para esta demostración, configuraremos un clúster con almacenamiento iSCSI con fines demostrativos.
Instalar paquetes
Servidor iSCSI
[root@server ~]# yum install targetcli -y
Nodos de clúster
Es el momento de configurar los nodos del clúster para hacer uso del almacenamiento iSCSI, realice los pasos a continuación en todos los nodos del clúster.
# yum install iscsi-initiator-utils -y
Disco de configuración
Aquí, crearemos 10 GB de disco LVM en el servidor iSCSI para usarlo como almacenamiento compartido para nuestros nodos de clúster. Hagamos una lista de los discos disponibles conectados al servidor de destino usando el comando.
[root@server ~]# fdisk -l | grep -i sd
Salida:
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
En el resultado anterior, puede ver que mi sistema tiene 10 GB de disco duro (/dev/sdb). Cree un LVM con /dev/sdb (reemplace /dev/sdb con el nombre de su disco)
[root@server ~]# pvcreate /dev/sdb
[root@server ~]# vgcreate vg_iscsi /dev/sdb
[root@server ~]# lvcreate -l 100%FREE -n lv_iscsi vg_iscsi
Crear almacenamiento compartido
Obtenga los detalles del iniciador de los nodos.
cat /etc/iscsi/initiatorname.iscsi
Nodo 1:
InitiatorName=iqn.1994-05.com.redhat:b11df35b6f75
Nodo 2:
InitiatorName=iqn.1994-05.com.redhat:119eaf9252a
Ingrese el siguiente comando para obtener una CLI de iSCSI para un aviso interactivo.
[root@server ~]# targetcli
Salida:
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 ~]#
Habilite y reinicie el servicio de destino.
[root@server ~]# systemctl enable target
[root@server ~]# systemctl restart target
Configure el firewall para permitir el tráfico iSCSI.
[root@server ~]# firewall-cmd --permanent --add-port=3260/tcp
[root@server ~]# firewall-cmd --reload
Descubra el almacenamiento compartido
En ambos nodos del clúster, descubra el objetivo con el siguiente comando.
# iscsiadm -m discovery -t st -p 192.168.1.20
Salida:
192.168.1.20:3260,1 iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5
Ahora, inicie sesión en el objetivo con el siguiente comando.
# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.server.x8664:sn.518a1f561ad5 -p 192.168.1.20 -l
Salida:
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.
Reinicie y habilite el servicio de iniciador.
# systemctl restart iscsid
# systemctl enable iscsid
Configurar nodos de clúster
Entrada de anfitrión
Realice una entrada de host en cada nodo para todos los nodos. El clúster utilizará el nombre de host para comunicarse entre sí.
# vi /etc/hosts
Las entradas de host serán algo como lo que se muestra a continuación.
192.168.1.11 node1.itzgeek.local node1
192.168.1.12 node2.itzgeek.local node2
Almacenamiento compartido
Vaya a todos sus nodos y verifique si el nuevo disco está visible o no. En mis nodos, /dev/sdb es el disco que proviene de nuestro almacenamiento iSCSI.
# fdisk -l | grep -i sd
Salida:
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
En cualquiera de sus nodos (Ej., nodo1), cree un sistema de archivos para que el servidor web Apache contenga los archivos del sitio web. Crearemos un sistema de archivos 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
Ahora, vaya a otro nodo y ejecute los siguientes comandos para detectar el nuevo sistema de archivos.
[root@node2 ~]# pvscan
[root@node2 ~]# vgscan
[root@node2 ~]# lvscan
Finalmente, verifique el LVM que creamos en node1 está disponible para usted en otro nodo (Ej. nodo2) usando el siguiente comando.
[root@node2 ~]# lvdisplay /dev/vg_apache/lv_apache
Salida: Deberías ver /dev/vg_apache/lv_apache en 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:3
Si el sistema no muestra el volumen lógico, considere reiniciar el segundo nodo. Instalar paquetes
Instale paquetes de clúster (marcapasos) en todos los nodos usando el siguiente comando.
# yum install pcs fence-agents-all -y
Permita que todas las aplicaciones de alta disponibilidad en el firewall tengan una comunicación adecuada entre los nodos. Puede omitir este paso si el sistema no tiene firewalld instalado.
# firewall-cmd --permanent --add-service=high-availability
# firewall-cmd --add-service=high-availability
Use el siguiente comando para enumerar las aplicaciones permitidas en el firewall.
# firewall-cmd --list-service
Salida:
ssh dhcpv6-client high-availability
Establezca la contraseña para el usuario hacluster. Esta cuenta de usuario es una cuenta de administración de clúster. Le sugerimos que establezca la misma contraseña para todos los nodos.
# passwd hacluster
Inicie el servicio de clúster. Además, habilítelo para que se inicie automáticamente al iniciar el sistema.
# systemctl start pcsd
# systemctl enable pcsd
Recuerde ejecutar los comandos anteriores en todos los nodos de su clúster.
Crear un clúster de alta disponibilidad
Autorice los nodos usando el siguiente comando. Ejecute el siguiente comando en cualquiera de los nodos para autorizar los nodos.
[root@node1 ~]# pcs cluster auth node1.itzgeek.local node2.itzgeek.local
Salida:
Username: hacluster
Password: << Enter Password
node1.itzgeek.local: Authorized
node2.itzgeek.local: Authorized
Crea un clúster.
[root@node1 ~]# pcs cluster setup --start --name itzgeek_cluster node1.itzgeek.local node2.itzgeek.local
Salida:
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
Habilite el clúster para que se inicie al iniciar el sistema.
[root@node1 ~]# pcs cluster enable --all
Salida:
node1.itzgeek.local: Cluster Enabled
node2.itzgeek.local: Cluster Enabled
Use el siguiente comando para obtener el estado del clúster.
[root@node1 ~]# pcs cluster status
Salida:
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
Ejecute el siguiente comando para obtener información detallada sobre el clúster, incluidos sus recursos, el estado del marcapasos y los detalles de los nodos.
[root@node1 ~]# pcs status
Salida:
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
Dispositivos de vallado
El dispositivo de cercado es un dispositivo de hardware/software que ayuda a desconectar el nodo problemático reiniciando el nodo/desconectando el acceso al almacenamiento compartido. Mi clúster de demostración se ejecuta sobre la máquina virtual de VMware, por lo que no le mostraré la configuración de un dispositivo de protección, pero puede seguir esta guía para configurar un dispositivo de protección.
Recursos del clúster
Preparar recursos
Servidor Web Apache
Instale el servidor web Apache en ambos nodos.
# yum install -y httpd wget
Edite el archivo de configuración.
# vi /etc/httpd/conf/httpd.conf
Agregue el contenido a continuación al final del archivo en ambos nodos del clúster.
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
Ahora necesitamos usar el almacenamiento compartido para almacenar el archivo de contenido web (HTML). Realice la siguiente operación en cualquiera de los nodos.
[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
Permita el servicio de Apache en el firewall en ambos nodos.
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
Crear recursos
Cree un recurso de sistema de archivos para el servidor Apache. Utilice el almacenamiento procedente del servidor iSCSI.
# pcs resource create httpd_fs Filesystem device="/dev/mapper/vg_apache-lv_apache" directory="/var/www" fstype="ext4" --group apache
Salida:
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
Cree un recurso de dirección IP. Esta dirección IP actuará como una dirección IP virtual para Apache y los clientes usarán esta dirección IP para acceder al contenido web en lugar de la IP del nodo individual.
# pcs resource create httpd_vip IPaddr2 ip=192.168.1.100 cidr_netmask=24 --group apache
Salida:
Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPaddr2')
Cree un recurso Apache que monitoreará el estado del servidor Apache y moverá el recurso a otro nodo en caso de falla.
# pcs resource create httpd_ser apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apache
Salida:
Assumed agent name 'ocf:heartbeat:apache' (deduced from 'apache')
Ya que no estamos usando cercas, desactívelas (STONITH). Debe deshabilitar para iniciar los recursos del clúster, pero no se recomienda deshabilitar STONITH en el entorno de producción.
# pcs property set stonith-enabled=false
Verifique el estado del clúster.
[root@node1 ~]# pcs status
Salida:
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
Verificar clúster de alta disponibilidad
Una vez que el clúster esté en funcionamiento, apunte un navegador web a la dirección IP virtual de Apache. Debería obtener una página web como la siguiente.
Prueba de clúster de alta disponibilidad
Verifiquemos la conmutación por error del recurso del nodo deteniendo el clúster en el nodo activo.
[root@node1 ~]# pcs cluster stop node1.itzgeek.local
Conclusión
Eso es todo. En esta publicación, ha aprendido cómo configurar un clúster de alta disponibilidad en CentOS 7. Háganos saber sus opiniones en la sección de comentarios.