Configurer un cluster Pacemaker pour des groupes de disponibilité SQL Server

S’applique à :SQL Server - Linux

Cet article décrit comment créer un cluster à trois nœuds sur Linux en utilisant Pacemaker et comment ajouter un groupe de disponibilité précédemment créé en tant que ressource dans le cluster. Pour une haute disponibilité, un groupe de disponibilité sur Linux nécessite trois nœuds, consultez Haute disponibilité et protection des données pour les configurations de groupes de disponibilité.

Notes

Communication sans stéréotype

Cet article contient des références au terme esclave, un terme que Microsoft considère comme choquant lorsqu’il est utilisé dans ce contexte. Le terme apparaît dans cet article, car il apparaît actuellement dans le logiciel. Lorsque le terme sera supprimé du logiciel, nous le supprimerons de l’article.

SQL Server n’est pas aussi étroitement intégré à Pacemaker sur Linux qu’au clustering de basculement Windows Server (WSFC). Une instance de SQL Server n’a pas connaissance du cluster et toute l’orchestration se fait de l’extérieur vers l’intérieur. Pacemaker fournit une orchestration des ressources de cluster. En outre, le nom du réseau virtuel est spécifique au clustering de basculement Windows Server : il n’y a pas d’équivalent dans Pacemaker. Les vues de gestion dynamique (DMV) du groupe de disponibilité qui interrogent les informations de cluster renvoient des lignes vides sur les clusters de Pacemaker. Pour créer un écouteur pour une reconnexion transparente après le basculement, enregistrez manuellement le nom de l’écouteur dans DNS avec l’adresse IP utilisée pour créer la ressource d’adresse IP virtuelle.

Vous pouvez toujours créer un écouteur et pour une reconnexion transparente après le basculement, mais vous devrez inscrire manuellement le nom de l’écouteur sur le serveur DNS avec l’adresse IP utilisée pour créer la ressource IP virtuelle (comme expliqué dans les sections suivantes).

Les sections suivantes décrivent les étapes à suivre pour configurer un cluster Pacemaker et ajouter un groupe de disponibilité en tant que ressource dans le cluster pour la haute disponibilité, pour chacune des distributions Linux prises en charge.

La couche de clustering est basée sur le module complémentaire haute disponibilité Red Hat Enterprise Linux (RHEL) basé sur Pacemaker.

Notes

L’accès à la documentation complète de Red Hat requiert un abonnement valide.

Pour plus d’informations sur la configuration du cluster, les options des agents de ressources et la gestion, consultez la documentation de référence de RHEL.

Feuille de route

Les étapes de création d’un groupe de disponibilité sur des serveurs Linux pour la haute disponibilité diffèrent de celles d’un cluster de basculement Windows Server. La liste suivante décrit les différentes étapes de haut niveau :

  1. Configurez SQL Server sur les nœuds du cluster.

  2. Créez le groupe de disponibilité.

  3. Configurez un gestionnaire de ressources de cluster, comme Pacemaker. Ces instructions se trouvent dans cet article.

    La façon de configurer un gestionnaire de ressources de cluster dépend de la distribution Linux spécifique.

    Important

    Les environnements de production nécessitent un agent de clôturage pour la haute disponibilité. Les démonstrations de cette documentation n’utilisent pas les agents de clôturage. Elles sont destinées uniquement à des fins de test et de validation. Un cluster Linux utilise l’isolation pour ramener le cluster à un état connu. La façon de configurer l’isolation dépend de la distribution et de l’environnement. À ce stade, l’isolation n’est pas disponible dans certains environnements cloud. Pour plus d’informations, consultez Stratégies de support pour les clusters à haute disponibilité RHEL - Plateformes de virtualisation.

  4. Ajoutez le groupe de disponibilité en tant que ressource dans le cluster.

Configurer la haute disponibilité pour RHEL

Pour configurer la haute disponibilité pour RHEL, activez l’abonnement à haute disponibilité, puis configurez Pacemaker.

Activer l’abonnement haute disponibilité pour RHEL

Chaque nœud du cluster doit avoir un abonnement approprié pour RHEL et le module complémentaire haute disponibilité. Consultez les exigences sur Comment installer des packages de cluster haute disponibilité dans Red Hat Enterprise Linux. Procédez comme suit pour configurer l’abonnement et les référentiels :

  1. Enregistrez le système.

    sudo subscription-manager register
    

    Fournissez vos nom d’utilisateur et mot de passe.

  2. Répertoriez les pools disponibles pour l’inscription.

    sudo subscription-manager list --available
    

    Dans la liste des pools disponibles, notez l’ID de pool pour l’abonnement à haute disponibilité.

  3. Mettez à jour le script suivant. Remplacez <pool id> par l’ID de pool pour la haute disponibilité de l’étape précédente. Exécutez le script pour joindre l’abonnement.

    sudo subscription-manager attach --pool=<pool id>
    
  4. Activez le référentiel.

    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
    

Pour plus d’informations, consultez Pacemaker - Open source, cluster haute disponibilité.

Après avoir configuré l’abonnement, procédez comme suit pour configurer Pacemaker :

Configurer Pacemaker

Après avoir inscrit l’abonnement, procédez comme suit pour configurer Pacemaker :

  1. Sur tous les nœuds du cluster, ouvrez les ports de pare-feu de Pacemaker. Pour ouvrir ces ports avec firewalld, exécutez la commande suivante :

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

    Si le pare-feu n’a pas de configuration de haute disponibilité intégrée, ouvrez les ports suivants pour Pacemaker.

    • TCP : Ports 2224, 3121, 21064
    • UDP : Port 5405
  2. Installez les packages Pacemaker sur tous les nœuds.

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  3. Définissez le mot de passe pour l’utilisateur par défaut qui est créé pendant l’installation des packages Pacemaker et Corosync. Utilisez le même mot de passe sur tous les nœuds.

    sudo passwd hacluster
    
  4. Pour autoriser les nœuds à rejoindre le cluster après le redémarrage, activez et démarrez le service pcsd et Pacemaker. Exécutez la commande suivante sur tous les nœuds.

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  5. Créez le cluster. Pour ce faire, exécutez la commande suivante :

    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
    

    RHEL8

    Pour RHEL 8, vous devez authentifier les nœuds séparément. Entrez manuellement le nom d’utilisateur et le mot de passe pour hacluster lorsque vous y êtes invité.

    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
    

    Notes

    Si vous avez précédemment configuré un cluster sur les mêmes nœuds, vous devez utiliser l’option --force pendant l’exécution de pcs cluster setup. Cette option revient à exécuter pcs cluster destroy. Pour réactiver Pacemaker, exécutez sudo systemctl enable pacemaker.

  6. Installez l’agent de ressources SQL Server pour SQL Server. Exécutez les commandes suivantes sur tous les nœuds.

    sudo yum install mssql-server-ha
    

Une fois Pacemaker configuré, utilisez pcs pour interagir avec le cluster. Exécutez toutes les commandes sur un nœud à partir du cluster.

Considérations dans le cas où il y a plusieurs interfaces réseau

Lors de la configuration de la haute disponibilité avec des serveurs ayant plusieurs cartes réseau, suivez ces suggestions :

  • Vérifiez que le fichier hosts est configuré de sorte que les adresses IP du serveur pour les multiples cartes réseau sont résolues en nom d’hôte du serveur Linux sur chaque nœud.

  • Lors de la configuration du cluster en utilisant Pacemaker, l’utilisation du nom d’hôte des serveurs doit configurer Corosync pour définir la configuration de toutes les cartes réseau. Nous voulons une communication Pacemaker/Corosync sur une seule carte réseau. Une fois le cluster Pacemaker configuré, modifiez la configuration dans le fichier corosync.conf et mettez à jour l’adresse IP de la carte réseau dédiée que vous voulez utiliser pour la communication Pacemaker/Corosync.

  • Le corosync.conf donné dans le fichier <hostname> doit être identique à la sortie donnée lors d’une recherche inversée (ping -a <ip_address>) et doit être le nom court configuré sur l’hôte. Vérifiez que le fichier hosts représente également l’adresse IP appropriée pour la résolution de noms.

Les modifications apportées à l’exemple de fichier corosync.conf sont mises en surbrillance ci-dessous :

  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
    }
  }

Configurer un appareil d’isolation

Les fournisseurs de cluster Pacemaker nécessitent l’isolation d’un nœud défaillant, à l’aide d’un appareil d’isolation configuré pour une configuration de cluster prise en charge. Lorsque le gestionnaire des ressources de cluster ne peut pas déterminer l’état d’un nœud ou d’une ressource sur un nœud, l’isolation est utilisée pour ramener le cluster à un état connu.

Un appareil d’isolation fournit un agent d’isolation. Configuration de Pacemaker sur Red Hat Entreprise Linux dans Azure fournit un exemple de création d’un appareil d’isolation pour ce cluster dans Azure. Modifiez les instructions pour votre environnement.

L’isolation au niveau des ressources garantit qu’il n’y a pas d’altération des données lors d’une interruption pendant la configuration d’une ressource. Par exemple, vous pouvez utiliser l’isolation au niveau des ressources pour marquer le disque d’un nœud comme obsolète lorsque la liaison de communication tombe en panne.

Le clôturage au niveau du nœud garantit qu’un nœud n’exécute aucune ressource. Pour ce faire, réinitialisez le nœud. Pacemaker prend en charge un grand nombre d’appareils d’isolation. Les exemples incluent une alimentation sans coupure ou des cartes d’interface de gestion pour les serveurs.

Pour plus d’informations sur l’isolation d’un noeud défaillant, consultez les articles suivants :

Notes

Étant donné que la configuration d’isolation au niveau du nœud dépend fortement de votre environnement, désactivez-la pour ce didacticiel (il peut être configurer ultérieurement). Le script suivant désactive l’isolation au niveau du nœud :

sudo pcs property set stonith-enabled=false

La désactivation de l’isolation est uniquement à des fins de test. Si vous envisagez d’utiliser Pacemaker dans un environnement de production, vous devez planifier une implémentation de l’isolation en fonction de votre environnement et la garder activée.

Définir l’intervalle de revérification du cluster de la propriété du cluster

cluster-recheck-interval indique l’intervalle d’interrogation selon lequel le cluster vérifie les modifications dans les paramètres de ressource, les contraintes ou d’autres options de cluster. Si un réplica tombe en panne, le cluster tente de redémarrer le réplica à un intervalle qui est lié par la valeur failure-timeout et la valeur cluster-recheck-interval. Par exemple, si failure-timeout a la valeur de 60 secondes et cluster-recheck-interval est défini sur 120 secondes, le redémarrage est tenté à un intervalle supérieur à 60 secondes, mais inférieur à 120 secondes. Nous vous recommandons de définir le délai d’expiration des défaillances sur 60 secondes et cluster-recheck-interval sur une valeur supérieure à 60 secondes. Définir cluster-recheck-interval sur une valeur plus petite n’est pas recommandé.

Pour mettre à jour la valeur de la propriété sur une exécution de 2 minutes :

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

Si vous disposez déjà d’une ressource de groupe de disponibilité gérée par un cluster Pacemaker, notez que le package Pacemaker 1.1.18-11.el7 a introduit un changement de comportement pour le paramètre de cluster start-failure-is-fatal quand sa valeur est false. Cette modification affecte le workflow de basculement. Si un réplica principal subit une interruption, le cluster est censé basculer vers l’un des réplicas secondaires disponibles. Au lieu de cela, les utilisateurs remarquent que le cluster continue d’essayer de démarrer le réplica principal qui a échoué. Si ce principal ne passe jamais en ligne (en raison d’une interruption permanente), le cluster ne bascule jamais vers un autre réplica secondaire disponible. En raison de cette modification, une configuration précédemment recommandée pour définir start-failure-is-fatal n’est plus valide et le paramètre doit être rétabli à la valeur par défaut true.

En outre, la ressource du groupe de disponibilité doit être mise à jour pour inclure la propriété failure-timeout.

Pour mettre à jour la valeur de la propriété sur une exécution de true :

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

Pour mettre à jour la propriété failure-timeout de la ressource ag_cluster sur 60s, exécutez :

pcs resource update ag_cluster meta failure-timeout=60s

Pour plus d’informations sur les propriétés de cluster de Pacemaker, consultez Propriétés des clusters de Pacemaker.

Créer une connexion SQL Server pour Pacemaker

  1. Sur toutes les instances SQL Server, créez un compte de connexion Server pour Pacemaker. Le code Transact-SQL ci-dessous a pour effet de créer un compte de connexion :

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

    Au moment de la création du groupe de disponibilité, l’utilisateur Pacemaker requiert des autorisations ALTER, CONTROL et VIEW DEFINITION sur le groupe de disponibilité, une fois qu’il a été créé mais avant l’ajout de nœuds à celui-ci.

  2. Sur toutes les instances SQL Server, enregistrez les informations d’identification pour le compte de connexion 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
    

Créer une ressource de groupe de disponibilité

Pour créer la ressource de groupe de disponibilité, utilisez la commande pcs resource create et définissez les propriétés de la ressource. La commande suivante crée une ressource de type maître/subordonné ocf:mssql:ag pour le groupe de disponibilité nommé ag1.

RHEL 7

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

RHEL 8

Avec la disponibilité de RHEL 8, la syntaxe de création a changé. Si vous utilisez RHEL 8, la terminologie master a été remplacée par promotable. Utilisez la commande de création suivante à la place de la commande ci-dessus :

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

Notes

Quand vous créez la ressource et régulièrement par la suite, l’agent de ressource Pacemaker définit automatiquement la valeur de REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT sur le groupe de disponibilité selon la configuration de celui-ci. Par exemple, si le groupe de disponibilité a trois réplicas synchrones, l’agent affecte à REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT la valeur 1. Pour obtenir plus d’informations et d’options de configuration, consultez Haute disponibilité et protection des données pour les configurations des groupes de disponibilité.

Créer une ressource d’adresse IP virtuelle

Pour créer la ressource d’adresse IP virtuelle, exécutez la commande suivante sur un nœud. Utilisez une adresse IP statique disponible à partir du réseau. Remplacez l’adresse IP entre <10.128.16.240> par une adresse IP valide.

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

Il n’y a aucun nom de serveur virtuel équivalent dans Pacemaker. Pour utiliser une chaîne de connexion qui pointe vers un nom de serveur de chaîne au lieu d’une adresse IP, enregistrez l’adresse de ressource IP et le nom de serveur virtuel souhaité dans DNS. Pour les configurations de récupération d’urgence, enregistrez le nom de serveur virtuel et l’adresse IP souhaités auprès des serveurs DNS sur le site principal et le site de récupération d’urgence.

Ajouter une contrainte de colocalisation

Presque toutes les décisions d’un cluster Pacemaker, comme le choix de l’emplacement dans lequel une ressource doit s’exécuter, s’effectuent en comparant les scores. Les scores sont calculés par ressource. Le gestionnaire de ressources de cluster choisit le nœud avec le score le plus élevé pour une ressource particulière. Si un nœud a un score négatif pour une ressource, la ressource ne peut pas être exécutée sur ce nœud.

Sur un cluster Pacemaker, vous pouvez manipuler les décisions du cluster avec les contraintes. Les contraintes ont un score. Si une contrainte a un score inférieur à INFINITY, Pacemaker la considère comme une suggestion. Un score de INFINITY est obligatoire.

Pour vous assurer que le réplica principal et les ressources d’adresse IP virtuelle sont exécutés sur le même hôte, définissez une contrainte de colocalisation avec un score INFINITY. Pour ajouter une contrainte de colocalisation, exécutez la commande suivante sur un nœud.

RHEL 7

Lorsque vous créez la ressource ag_cluster dans RHEL 7, la ressource est créée en tant que ag_cluster-master. Utilisez la commande suivante pour RHEL 7 :

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

RHEL 8

Lorsque vous créez la ressource ag_cluster dans RHEL 8, la ressource est créée en tant que ag_cluster-clone. Utilisez la commande suivante pour RHEL 8 :

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

Ajouter une contrainte de classement

La contrainte de colocalisation a une contrainte de classement implicite. Elle déplace la ressource IP virtuelle avant de déplacer la ressource de groupe de disponibilité. La séquence des événements par défaut est la suivante :

  1. L’utilisateur émet pcs resource move sur le groupe de disponibilité principal, de nœud1 à nœud2.

  2. La ressource d’adresse IP virtuelle s’arrête sur le nœud 1.

  3. La ressource d’adresse IP virtuelle démarre sur le nœud 2.

    Notes

    À ce stade, l’adresse IP pointe temporairement vers le nœud 2, tandis que le nœud 2 est toujours un secondaire de pré-basculement.

  4. Le groupe de disponibilité principal sur nœud 1 est rétrogradé en secondaire.

  5. Le groupe de disponibilité secondaire sur nœud 2 est promu en principal.

Pour empêcher l’adresse IP de pointer temporairement vers le nœud avec le secondaire antérieur au basculement, ajoutez une contrainte de classement.

Pour ajouter une contrainte de classement, exécutez la commande suivante sur un nœud :

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

Important

Après avoir configuré le cluster et ajouté le groupe de disponibilité en tant que ressource de cluster, vous ne pouvez pas utiliser Transact-SQL pour basculer les ressources du groupe de disponibilité. Les ressources de cluster SQL Server sur Linux ne sont pas couplées aussi étroitement au système d’exploitation, car elles se trouvent sur un cluster de basculement Windows Server (WSFC). SQL Server service n’est pas informé de la présence du cluster. Toutes les orchestrations sont effectuées via les outils d’administration de cluster. Dans RHEL ou Ubuntu utilisez pcs et dans SLES, utilisez les outils crm.

Basculez manuellement le groupe de disponibilité avec pcs. N’initialisez pas le basculement avec Transact-SQL. Pour obtenir des instructions, consultez Basculement.