GNU/Linux >> Tutoriales Linux >  >> Cent OS

Cómo configurar un clúster de alta disponibilidad en CentOS 7/RHEL 7

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.

Medio ambiente

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.

CentOS 7

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.


Cent OS
  1. Cómo configurar una interfaz de red virtual en RHEL 8/CentOS 8

  2. CentOS/RHEL 7:Cómo configurar un servidor de nombres de solo caché

  3. CentOS / RHEL 6,7:Cómo configurar páginas gigantes

  4. Cómo configurar el proxy en CentOS/RHEL/Fedora

  5. Cómo configurar el inicio de sesión de firewalld en CentOS/RHEL 8

Cómo configurar la dirección IP estática en CentOS 8 / RHEL 8

Cómo instalar y configurar Ansible en CentOS 8 / RHEL 8

Cómo configurar el servidor DNS (BIND) en CentOS 8 / RHEL 8

Cómo instalar y configurar Jenkins en CentOS 8 / RHEL 8

Configurar VCS en CentOS 8 | RHEL 8 paso a paso

Cómo configurar el servidor VNC en CentOS/RHEL 6

    Nombre de host Dirección IP SO Propósito
    nodo1.itzgeek.local 192.168.1.11 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)