Configuración de un clúster de Pacemaker para grupos de disponibilidad de SQL Server

Se aplica a: SQL Server - Linux

En este documento se explica cómo crear un clúster de tres nodos en Linux con Pacemaker y cómo agregar un grupo de disponibilidad creado anteriormente como un recurso en el clúster. Para lograr una alta disponibilidad, un grupo de disponibilidad en Linux necesita tres nodos (vea High availability and data protection for availability group configurations [Alta disponibilidad y protección de datos para configuraciones de grupos de disponibilidad]).

Nota

Comunicación sin prejuicios

Este artículo contiene referencias al término esclavo, que Microsoft considera ofensivo cuando se usa en este contexto. El término aparece en este artículo porque actualmente aparece en el software. Cuando se quite el término del software, se quitará también del artículo.

SQL Server no está tan estrechamente integrado con Pacemaker en Linux como lo está con los clústeres de conmutación por error de Windows Server (WSFC). Una instancia de SQL Server no es consciente del clúster y toda la orquestación procede del exterior. Pacemaker proporciona orquestación del recurso de clúster. Además, el nombre de red virtual es específico de los clústeres de conmutación por error de Windows Server (no hay equivalente en Pacemaker). Las vistas de administración dinámica (DMV) de los grupos de disponibilidad que consultan información del clúster devuelven filas vacías en los clústeres de Pacemaker. Para crear un cliente de escucha para la reconexión transparente tras una conmutación por error, registre de forma manual el nombre del cliente de escucha en DNS con la dirección IP empleada para crear el recurso de dirección IP virtual.

Aún así, puede crear un agente de escucha para usarlo en la reconexión transparente después de una conmutación por error, pero tendrá que registrar de forma manual el nombre del agente de escucha en el servidor DNS con la dirección IP que ha usado para crear el recurso de IP virtual (como se explica en las secciones siguientes).

En las siguientes secciones se siguen los pasos necesarios para configurar un clúster de Pacemaker y agregar un grupo de disponibilidad como recurso en el clúster de alta disponibilidad para cada distribución de Linux admitida.

La capa de agrupación en clústeres se basa en el complemento de alta disponibilidad de Red Hat Enterprise Linux (RHEL) sobre Pacemaker.

Nota

El acceso a toda la documentación de Red Hat exige una suscripción válida.

Para obtener más información sobre la configuración del clúster, las opciones de los agentes de recursos y la administración, vaya a la documentación de referencia de RHEL.

Plan de desarrollo

Los pasos necesarios para crear un grupo de disponibilidad en servidores con Linux de alta disponibilidad son distintos de los exigidos en un clúster de conmutación por error de Windows Server. En la lista siguiente, se describen los pasos generales:

  1. Configure SQL Server en los nodos del clúster.

  2. Cree el grupo de disponibilidad.

  3. Configure un administrador de recursos de clúster, como Pacemaker. Estas instrucciones se incluyen en este artículo.

    La manera de configurar un administrador de recursos de clúster depende de la distribución específica de Linux.

    Importante

    Para alcanzar una alta disponibilidad, los entornos de producción necesitan un agente de barrera. En los ejemplos de esta documentación no se usan agentes de barrera. Los ejemplos solo se proporcionan con fines de prueba y validación. Un clúster de Linux usa barreras para devolver el clúster a un estado conocido. La forma de configurar las barreras depende de la distribución y del entorno. Actualmente, las barreras no están disponibles en algunos entornos de nube. Para más información, vea Directivas de soporte para clústeres de alta disponibilidad de RHEL: plataformas de virtualización.

  4. Agregue el grupo de disponibilidad como un recurso en el clúster.

Configuración de la alta disponibilidad de RHEL

Para configurar la alta disponibilidad de RHEL, habilite la suscripción de alta disponibilidad y, luego, configure Pacemaker.

Habilitación de la suscripción de alta disponibilidad de RHEL

Cada nodo del clúster debe tener una suscripción adecuada de RHEL y el complemento de alta disponibilidad. Revise los requisitos de Cómo instalar paquetes de clúster de alta disponibilidad en Red Hat Enterprise Linux. Siga estos pasos para configurar la suscripción y los repositorios:

  1. Registre el sistema.

    sudo subscription-manager register
    

    Proporcione el nombre de usuario y la contraseña.

  2. Enumere los grupos disponibles para el registro.

    sudo subscription-manager list --available
    

    En la lista de grupos disponibles, anote el identificador de grupo de la suscripción de alta disponibilidad.

  3. Actualice el script siguiente. Reemplace <pool id> por el identificador de grupo de alta disponibilidad del paso anterior. Ejecute el script para asociar la suscripción.

    sudo subscription-manager attach --pool=<pool id>
    
  4. Habilite el repositorio.

    RHEL 7

    sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
    

    RHEL 8

    sudo subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
    

Para obtener más información, vea Pacemaker: el clúster de alta disponibilidad de código abierto.

Una vez configurada la suscripción, realice los pasos siguientes para configurar Pacemaker:

Configuración de Pacemaker

Una vez registrada la suscripción, realice los pasos siguientes para configurar Pacemaker:

  1. En todos los nodos de clúster, abra los puertos de firewall de Pacemaker. Para abrir estos puertos con firewalld, ejecute el comando siguiente:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    Si el firewall no tiene una configuración de alta disponibilidad integrada, abra los puertos siguientes para Pacemaker.

    • TCP: puertos 2224, 3121, 21064
    • UDP: puerto 5405
  2. Instale paquetes de Pacemaker en todos los nodos.

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  3. Establezca la contraseña para el usuario predeterminado que se crea al instalar paquetes de Pacemaker y Corosync. Use la misma contraseña en todos los nodos.

    sudo passwd hacluster
    
  4. Para permitir que los nodos vuelvan a unirse al clúster después del reinicio, habilite e inicie el servicio pcsd y Pacemaker. Ejecute el siguiente comando en todos los nodos.

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  5. Cree el clúster. Para crear el clúster, ejecute el comando siguiente:

    RHEL 7

    sudo pcs cluster auth <node1> <node2> <node3> -u hacluster -p <password for hacluster>
    sudo pcs cluster setup --name <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    RHEL 8

    Para RHEL 8, tendrá que autenticar los nodos por separado. Escriba manualmente el nombre de usuario y la contraseña de hacluster cuando se le solicite.

    sudo pcs host auth <node1> <node2> <node3>
    sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    Nota

    Si ya ha configurado un clúster en los mismos nodos, necesita usar la opción --force al ejecutar pcs cluster setup. Esta opción es equivalente a ejecutar pcs cluster destroy. Para volver a habilitar Pacemaker, ejecute sudo systemctl enable pacemaker.

  6. Instale el agente de recursos de SQL Server para SQL Server. Ejecute los siguientes comandos en todos los nodos.

    sudo yum install mssql-server-ha
    

Una vez configurado Pacemaker, use pcs para interactuar con el clúster. Ejecute todos los comandos en un nodo del clúster.

Consideraciones para varias interfaces de red (NIC)

Al configurar la alta disponibilidad con servidores que tienen varias NIC, siga estas sugerencias:

  • Asegúrese de que el archivo hosts está configurado para que las direcciones IP del servidor para las varias NIC se resuelvan en el nombre de host del servidor Linux en cada nodo.

  • Al configurar el clúster con Pacemaker, usar el nombre de host de los servidores debe configurar Corosync para establecer la configuración de todas las NIC. Solo queremos la comunicación de Pacemaker/Corosync a través de una sola NIC. Una vez configurado el clúster de Pacemaker, modifique la configuración en el archivo corosync.conf y actualice la dirección IP de la NIC dedicada que quiere usar para la comunicación de Pacemaker/Corosync.

  • El <hostname> especificado en el archivo corosync.conf debe ser el mismo que el resultado proporcionado al realizar una búsqueda inversa (ping -a <ip_address>) y debe ser el nombre corto configurado en el host. Asegúrese de que el archivo hosts también representa la dirección IP adecuada para la resolución de nombres.

Los cambios en archivo corosync.conf de ejemplo se resaltan a continuación:

  nodelist {
    node {
        ring0_addr: <ip_address_of_node1_NIC1>
        name: <hostname_of_node1>
        nodeid: 1
    }
    node {
        ring0_addr: <ip_address_of_node2_NIC1>
        name: <hostname_of_node2>
        nodeid: 2
    }
    node {
        ring0_addr: <ip_address_of_node3_NIC1>
        name: <hostname_of_node3>
        nodeid: 3
    }
  }

Configuración de un dispositivo de barrera

Para admitir la configuración del clúster, los proveedores de clústeres de Pacemaker requieren que se cree una barrera en un nodo erróneo y que se configure un dispositivo de barrera. Si el administrador de recursos de clúster no puede determinar el estado de un nodo o de un recurso de un nodo, las barreras devuelven al clúster a un estado conocido.

Un dispositivo de barrera proporciona un agente de barrera. En Configuración de Pacemaker en Red Hat Enterprise Linux en Azure se proporciona un ejemplo de cómo crear un dispositivo de barrera para este clúster en Azure. Modifique las instrucciones para el entorno.

Mediante la configuración de un recurso, la barrera de nivel de recurso garantiza que los datos no se dañen por una interrupción. Por ejemplo, puede usar la barrera de nivel de recurso para marcar el disco de un nodo como obsoleto cuando el vínculo de comunicación se interrumpe.

La barrera de nivel de nodo garantiza que un nodo no ejecute ningún recurso. Esto se hace mediante el restablecimiento del nodo. Pacemaker admite una gran variedad de dispositivos de barrera. Los ejemplos incluyen un sistema de alimentación ininterrumpida o tarjetas de interfaz de administración para servidores.

Para obtener información sobre la creación de barreras en un nodo con errores, vea los siguientes artículos:

Nota

Dado que la configuración de la barrera de nivel de nodo depende en gran medida del entorno, deshabilítela para este tutorial (se puede configurar más adelante). El siguiente script deshabilita la barrera de nivel de nodo:

sudo pcs property set stonith-enabled=false

Solo deshabilite las barreras con fines de prueba. Si tiene previsto usar Pacemaker en un entorno de producción, necesita planear una implementación de barrera basada en su entorno y mantenerla habilitada.

Establecer la propiedad del clúster cluster-recheck-interval

cluster-recheck-interval indica el intervalo de sondeo por el que el clúster comprueba los cambios en los parámetros de recursos, las restricciones u otras opciones del clúster. Si una réplica se interrumpe, el clúster intenta reiniciarla en un intervalo que depende de los valores failure-timeout y cluster-recheck-interval. Por ejemplo, si failure-timeout se establece en 60 segundos y cluster-recheck-interval se establece en 120 segundos, el reinicio se intenta en un intervalo mayor de 60 segundos pero menor de 120 segundos. Se recomienda establecer el valor de failure-timeout en 60 segundos y cluster-recheck-interval en un valor superior a 60 segundos. No se recomienda establecer cluster-recheck-interval en un valor pequeño.

Para actualizar el valor de la propiedad a 2 minutes, ejecute:

sudo pcs property set cluster-recheck-interval=2min

Si ya dispone de un recurso de grupo de disponibilidad administrado por un clúster de Pacemaker, el paquete de Pacemaker (1.1.18 -11.el7) introdujo un cambio de comportamiento para el valor de configuración del clúster start-failure-is-fatal cuando su valor es false. Este cambio afecta al flujo de trabajo de conmutación por error. Si una réplica principal deja de funcionar, se espera que el clúster conmute por error a una de las réplicas secundarias disponibles. En su lugar, los usuarios observan que el clúster sigue intentando iniciar la réplica principal que ha experimentado el error. Si esa réplica principal no vuelve a activarse (debido a un corte de luz permanente), el clúster nunca conmuta por error a otra réplica secundaria disponible. Debido a este cambio, la recomendación anterior de configurar start-failure-is-fatal ya no es válida y es necesario revertir a su valor predeterminado de true.

Además, el recurso de grupo de disponibilidad debe actualizarse para incluir la propiedad failure-timeout.

Para actualizar el valor de la propiedad a true, ejecute:

sudo pcs property set start-failure-is-fatal=true

Para actualizar la propiedad failure-timeout del recurso ag_cluster a 60s, ejecute:

pcs resource update ag_cluster meta failure-timeout=60s

Para obtener información sobre las propiedades de clúster de Pacemaker, vea Propiedades de clúster de Pacemaker.

Crear un inicio de sesión de SQL Server para Pacemaker

  1. En todas las instancias de SQL Server, cree un inicio de sesión en el servidor para Pacemaker.

    La siguiente instrucción Transact-SQL crea un inicio de sesión:

    USE [master]
    GO
    CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!';
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
    

    En el momento de crear el grupo de disponibilidad, el usuario de Pacemaker necesita permisos ALTER, CONTROL y VIEW DEFINITION en el grupo de disponibilidad, una vez creado, pero antes de que se le agreguen nodos.

  2. En todas las instancias de SQL Server, guarde las credenciales para el inicio de sesión de SQL Server.

    echo 'pacemakerLogin' >> ~/pacemaker-passwd
    echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
    sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
    

Crear un recurso de grupo de disponibilidad

Para crear el recurso de grupo de disponibilidad, use el comando pcs resource create y establezca las propiedades del recurso. El comando siguiente crea un recurso ocf:mssql:ag de tipo principal/secundario para el grupo de disponibilidad con el nombre ag1.

RHEL 7

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s master notify=true

RHEL 8

Con la disponibilidad de RHEL 8, la sintaxis de Create ha cambiado. Si usa RHEL 8, la terminología master ha cambiado a promotable. Use el comando CREATE siguiente en lugar del comando anterior:

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s promotable notify=true

Nota

Cuando crea el recurso, y posteriormente de forma periódica, el agente del recurso de Pacemaker establece automáticamente el valor de REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT en el grupo de disponibilidad según la configuración del grupo. Por ejemplo, si el grupo de disponibilidad tiene tres réplicas sincrónicas, el agente establecerá REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT en 1. Para detalles y opciones de configuración adicional, consulte el artículo sobre alta disponibilidad y protección de datos para configuraciones de grupos de disponibilidad.

Creación de un recurso de dirección IP virtual

Para crear el recurso de dirección IP virtual, ejecute el comando siguiente en un nodo. Use una dirección IP estática disponible de la red. Reemplace la dirección IP entre <10.128.16.240> por una dirección IP válida.

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<10.128.16.240>

No hay ningún nombre de servidor virtual equivalente en Pacemaker. Para usar una cadena de conexión que apunte a un nombre de servidor de cadena en lugar de a una dirección IP, registre la dirección de recurso de dirección IP virtual y el nombre de servidor virtual deseado en DNS. En el caso de las configuraciones de recuperación ante desastres, registre el nombre de servidor virtual que prefiera y la dirección IP con los servidores DNS en el sitio principal y en el sitio de recuperación ante desastres.

Agregar una restricción de ubicación

Casi todas las decisiones de un clúster de Pacemaker, por ejemplo elegir dónde se debe ejecutar un recurso, se toman mediante la comparación de puntuaciones. Las puntuaciones se calculan por recurso. El administrador de recursos de clúster elige el nodo con la puntuación más alta para un recurso determinado. Si un nodo tiene una puntuación negativa para un recurso, el recurso no se puede ejecutar en ese nodo.

En un clúster de Pacemaker, las decisiones del clúster se pueden manipular mediante restricciones. Las restricciones tienen una puntuación. Si una restricción tiene una puntuación inferior a INFINITY, Pacemaker la considera como una recomendación. Una puntuación de INFINITY es obligatoria.

Para garantizar que los recursos de réplica principal y dirección IP virtual se ejecutan en el mismo host, defina una restricción de ubicación con una puntuación de INFINITY. Para agregar la restricción de ubicación, ejecute el comando siguiente en un nodo.

RHEL 7

Cuando crea el recurso ag_cluster en RHEL 7, se crea el recurso como ag_cluster-master. Use el siguiente comando para RHEL 7:

sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master

RHEL 8

Cuando crea el recurso ag_cluster en RHEL 8, se crea el recurso como ag_cluster-clone. Use el siguiente comando para RHEL 8:

sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master

Agregar una restricción de ordenación

La restricción de ubicación tiene una restricción de orden implícita. Mueve el recurso de dirección IP virtual antes de mover el recurso de grupo de disponibilidad. La secuencia de eventos predeterminada es la siguiente:

  1. El usuario envía pcs resource move a la réplica principal del grupo de disponibilidad desde el nodo1 al nodo2.

  2. El recurso de dirección IP virtual se detiene en el nodo 1.

  3. El recurso de dirección IP virtual se inicia en el nodo 2.

    Nota

    En este punto, la dirección IP apunta temporalmente al nodo 2, mientras que el nodo 2 sigue siendo una réplica secundaria previa a la conmutación por error.

  4. La réplica principal del grupo de disponibilidad del nodo 1 se degrada a secundario.

  5. La réplica secundaria del grupo de disponibilidad del nodo 2 se asciende a principal.

Para evitar que la dirección IP apunte temporalmente al nodo con la réplica secundaria previa a la conmutación por error, agregue una restricción de ordenación.

Para agregar una restricción de orden, ejecute el siguiente comando en un nodo:

RHEL 7

sudo pcs constraint order promote ag_cluster-master then start virtualip

RHEL 8

sudo pcs constraint order promote ag_cluster-clone then start virtualip

Importante

Después de configurar el clúster y agregar el grupo de disponibilidad como un recurso de clúster, no puede usar Transact-SQL para conmutar por error los recursos del grupo de disponibilidad. Los recursos de clúster de SQL Server en Linux no están tan bien integrados con el sistema operativo como lo están en un clúster de conmutación por error de Windows Server (WSFC). El servicio SQL Server no reconoce la presencia del clúster. Toda la orquestación se realiza con las herramientas de administración de clústeres. En RHEL o Ubuntu, use pcs; en SLES, use las herramientas de crm.

Realice una conmutación por error manual del grupo de disponibilidad con pcs. No inicie la conmutación por error con Transact-SQL. Para obtener instrucciones, vea Conmutación por error.