Tutoriel : configurer des groupes de disponibilité pour SQL Server sur des machines virtuelles SLES dans Azure
S’applique à : SQL Server sur machine virtuelle Azure
Remarque
Nous utilisons SQL Server 2022 (16.x) avec SUSE Linux Enterprise Server (SLES) v15 dans ce tutoriel. Toutefois, il est possible d'utiliser SQL Server 2019 (15.x) avec SLES v12 ou SLES v15, pour configurer la haute disponibilité.
Dans ce tutoriel, vous allez apprendre à :
- Créer un groupe de ressources, un groupe à haute disponibilité et des machines virtuelles Linux
- Activer la haute disponibilité
- Créez un cluster Pacemaker
- Configurer un agent d’isolation en créant un appareil STONITH
- Installer SQL Server et mssql-tools sur SLES
- Configurer un groupe de disponibilité SQL Server AlwaysOn
- Configurer les ressources de groupe de disponibilité dans le cluster Pacemaker
- Tester un basculement et l’agent d’isolation
Ce tutoriel utilise Azure CLI pour déployer des ressources dans Azure.
Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
Prérequis
Utilisez l’environnement Bash dans Azure Cloud Shell. Pour plus d’informations, consultez Démarrage rapide pour Bash dans Azure Cloud Shell.
Si vous préférez exécuter les commandes de référence de l’interface de ligne de commande localement, installez l’interface Azure CLI. Si vous exécutez sur Windows ou macOS, envisagez d’exécuter Azure CLI dans un conteneur Docker. Pour plus d’informations, consultez Guide pratique pour exécuter Azure CLI dans un conteneur Docker.
Si vous utilisez une installation locale, connectez-vous à Azure CLI à l’aide de la commande az login. Pour finir le processus d’authentification, suivez les étapes affichées dans votre terminal. Pour connaître les autres options de connexion, consultez Se connecter avec Azure CLI.
Lorsque vous y êtes invité, installez l’extension Azure CLI lors de la première utilisation. Pour plus d’informations sur les extensions, consultez Utiliser des extensions avec Azure CLI.
Exécutez az version pour rechercher la version et les bibliothèques dépendantes installées. Pour effectuer une mise à niveau vers la dernière version, exécutez az upgrade.
- Cet article nécessite la version 2.0.30 ou ultérieure de l’interface Azure CLI. Si vous utilisez Azure Cloud Shell, la version la plus récente est déjà installée.
Créer un groupe de ressources
Si vous avez plusieurs abonnements, sélectionnez l’abonnement dans lequel vous souhaitez déployer ces ressources.
Utilisez la commande suivante pour créer un groupe de ressources <resourceGroupName>
dans une région. Remplacez <resourceGroupName>
par le nom de votre choix. Ce didacticiel utilise East US 2
. Pour plus d’informations, consultez ce guide de démarrage rapide.
az group create --name <resourceGroupName> --location eastus2
Créer un groupe à haute disponibilité
L’étape suivante consiste à créer un groupe à haute disponibilité. Exécutez la commande suivante dans Azure Cloud Shell et remplacez <resourceGroupName>
par le nom de votre groupe de ressources. Choisissez un nom pour <availabilitySetName>
.
az vm availability-set create \
--resource-group <resourceGroupName> \
--name <availabilitySetName> \
--platform-fault-domain-count 2 \
--platform-update-domain-count 2
Une fois l’exécution de la commande terminée, vous devez obtenir les résultats suivants :
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/availabilitySets/<availabilitySetName>",
"location": "eastus2",
"name": "<availabilitySetName>",
"platformFaultDomainCount": 2,
"platformUpdateDomainCount": 2,
"proximityPlacementGroup": null,
"resourceGroup": "<resourceGroupName>",
"sku": {
"capacity": null,
"name": "Aligned",
"tier": null
},
"statuses": null,
"tags": {},
"type": "Microsoft.Compute/availabilitySets",
"virtualMachines": []
}
Créer un réseau virtuel et un sous-réseau
Créez un sous-réseau nommé avec une plage d’adresses IP prédéfinie. Remplacez ces valeurs dans la commande suivante :
<resourceGroupName>
<vNetName>
<subnetName>
az network vnet create \ --resource-group <resourceGroupName> \ --name <vNetName> \ --address-prefix 10.1.0.0/16 \ --subnet-name <subnetName> \ --subnet-prefix 10.1.1.0/24
La commande précédente crée un réseau virtuel et un sous-réseau contenant une plage d’adresses IP personnalisée.
Créer des machines virtuelles SLES dans le groupe à haute disponibilité
Obtenez la liste des images de machine virtuelle qui offrent SLES v15 SP4 avec BYOS (apportez votre propre abonnement). Vous pouvez également utiliser la machine virtuelle SUSE Enterprise Linux 15 SP4 + Patching (
sles-15-sp4-basic
).az vm image list --all --offer "sles-15-sp3-byos" # if you want to search the basic offers you could search using the command below az vm image list --all --offer "sles-15-sp3-basic"
Vous devez voir les résultats suivants lorsque vous recherchez les images BYOS :
[ { "offer": "sles-15-sp3-byos", "publisher": "SUSE", "sku": "gen1", "urn": "SUSE:sles-15-sp3-byos:gen1:2022.05.05", "version": "2022.05.05" }, { "offer": "sles-15-sp3-byos", "publisher": "SUSE", "sku": "gen1", "urn": "SUSE:sles-15-sp3-byos:gen1:2022.07.19", "version": "2022.07.19" }, { "offer": "sles-15-sp3-byos", "publisher": "SUSE", "sku": "gen1", "urn": "SUSE:sles-15-sp3-byos:gen1:2022.11.10", "version": "2022.11.10" }, { "offer": "sles-15-sp3-byos", "publisher": "SUSE", "sku": "gen2", "urn": "SUSE:sles-15-sp3-byos:gen2:2022.05.05", "version": "2022.05.05" }, { "offer": "sles-15-sp3-byos", "publisher": "SUSE", "sku": "gen2", "urn": "SUSE:sles-15-sp3-byos:gen2:2022.07.19", "version": "2022.07.19" }, { "offer": "sles-15-sp3-byos", "publisher": "SUSE", "sku": "gen2", "urn": "SUSE:sles-15-sp3-byos:gen2:2022.11.10", "version": "2022.11.10" } ]
Ce didacticiel utilise
SUSE:sles-15-sp3-byos:gen1:2022.11.10
.Important
Pour la configuration du groupe de disponibilité, les noms de machines doivent comporter moins de 15 caractères. Les noms d'utilisateur ne peuvent pas contenir de caractères en majuscules et les mots de passe doivent comporter entre 12 et 72 caractères.
Créez trois machines virtuelles dans le groupe à haute disponibilité. Remplacez ces valeurs dans la commande suivante :
<resourceGroupName>
<VM-basename>
<availabilitySetName>
<VM-Size>
- Par exemple, « Standard_D16s_v3 »<username>
<adminPassword>
<vNetName>
<subnetName>
for i in `seq 1 3`; do az vm create \ --resource-group <resourceGroupName> \ --name <VM-basename>$i \ --availability-set <availabilitySetName> \ --size "<VM-Size>" \ --os-disk-size-gb 128 \ --image "SUSE:sles-15-sp3-byos:gen1:2022.11.10" \ --admin-username "<username>" \ --admin-password "<adminPassword>" \ --authentication-type all \ --generate-ssh-keys \ --vnet-name "<vNetName>" \ --subnet "<subnetName>" \ --public-ip-sku Standard \ --public-ip-address "" done
La commande précédente crée les machines virtuelles à l’aide du réseau virtuel défini précédemment. Pour plus d’informations sur les différentes configurations, consultez l’article az vm create.
La commande inclut également le paramètre --os-disk-size-gb
permettant de créer une taille de lecteur de système d’exploitation personnalisée de 128 Go. Si vous augmentez cette taille ultérieurement, développez les volumes de dossiers appropriés pour prendre en charge votre installation, configurez le Gestionnaire de volumes logiques (LVM).
Une fois la commande exécutée sur chaque machine virtuelle, vous devez obtenir des résultats similaires à ce qui suit :
{
"fqdns": "",
"id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/sles1",
"location": "westus",
"macAddress": "<Some MAC address>",
"powerState": "VM running",
"privateIpAddress": "<IP1>",
"resourceGroup": "<resourceGroupName>",
"zones": ""
}
Tester la connexion aux machines virtuelles créées
Connectez-vous à chaque machine virtuelle à l’aide de la commande suivante dans Azure Cloud Shell. Si vous ne parvenez pas à trouver les adresses IP de vos machines virtuelles, suivez ce Démarrage rapide sur Azure Cloud Shell.
ssh <username>@<publicIPAddress>
Si la connexion a réussi, vous devez voir la sortie suivante qui représente le terminal Linux :
[<username>@sles1 ~]$
Tapez exit
pour quitter la session SSH.
S’inscrire auprès de SUSEConnect et installer des packages à haute disponibilité
Pour suivre ce tutoriel, vos machines virtuelles doivent être inscrites auprès de SUSEConnect pour recevoir des mises à jour et un support. Vous pouvez ensuite installer le module d’extension de haute disponibilité ou le modèle, qui est un ensemble de packages qui active la haute disponibilité.
Il est plus facile d'ouvrir simultanément une session SSH sur chacune des machines virtuelles (nœuds), car dans cet article, les mêmes commandes doivent être exécutées sur toutes les machines virtuelles.
Si vous copiez-collez plusieurs commandes sudo
et êtes invité à entrer un mot de passe, seule une commande sera exécutée. Vous devez exécuter chaque commande séparément.
Connectez-vous à chaque nœud de machine virtuelle pour exécuter les étapes suivantes.
Inscrire la machine virtuelle auprès de SUSEConnect
Pour inscrire votre nœud de machine virtuelle auprès de SUSEConnect, remplacez ces valeurs dans la commande suivante, sur tous les nœuds :
<subscriptionEmailAddress>
<registrationCode>
sudo SUSEConnect
--url=https://scc.suse.com
-e <subscriptionEmailAddress> \
-r <registrationCode>
Installer l’extension de haute disponibilité
Pour installer l’extension haute disponibilité, exécutez la commande suivante sur tous les nœuds :
sudo SUSEConnect -p sle-ha/15.3/x86_64 -r <registration code for Partner Subscription for High Availability Extension>
Configurer l’accès SSH sans mot de passe entre les nœuds
L’accès SSH sans mot de passe permet à vos machines virtuelles de communiquer entre elles à l’aide de clés publiques SSH. Vous devez configurer des clés SSH sur chaque nœud et copier ces clés sur chaque nœud.
Générer de nouvelles clés SSH
La taille de clé SSH requise est de 4 096 bits. Sur chaque machine virtuelle, accédez au dossier /root/.ssh
et exécutez la commande suivante :
ssh-keygen -t rsa -b 4096
Au cours de cette étape, vous pourriez être invité à remplacer un fichier SSH existant. Vous devez accepter cette invite. Vous n’avez pas besoin d’entrer une phrase secrète.
Copiez les clés SSH publiques
Sur chaque nœud managé, vous devez copier la clé publique à partir du nœud que vous venez de créer, à l’aide de la commande ssh-copy-id
. Si vous souhaitez spécifier le répertoire cible sur le nœud managé, vous pouvez utiliser le paramètre -i
.
Dans la commande suivante, le compte <username>
peut être le même que celui que vous avez configuré pour chaque nœud lors de la création de la machine virtuelle. Vous pouvez également utiliser le compte root
, mais cela n’est pas recommandé dans un environnement de production.
sudo ssh-copy-id <username>@sles1
sudo ssh-copy-id <username>@sles2
sudo ssh-copy-id <username>@sles3
Vérifier l’accès sans mot de passe à partir de chaque nœud
Pour vérifier que la clé publique SSH a été copiée sur chaque nœud, utilisez la commande ssh
à partir du nœud de contrôleur. Si vous avez copié correctement les clés, vous ne serez pas invité à entrer de mot de passe et la connexion aboutira.
Dans cet exemple, nous nous connectons aux deuxième et troisième nœuds à partir de la première machine virtuelle (sles1
). De nouveau, le compte <username>
peut être le même que celui que vous avez configuré pour chaque nœud lors de la création de la machine virtuelle
ssh <username>@sles2
ssh <username>@sles3
Répétez ce processus à partir des trois nœuds, afin que chaque nœud puisse communiquer avec les autres sans nécessiter de mots de passe.
Configurer la résolution de noms
Vous pouvez configurer la résolution de noms à l’aide de DNS ou en modifiant manuellement le fichier etc/hosts
sur chaque nœud.
Pour plus d’informations sur DNS et Active Directory, consultez Joindre SQL Server sur un hôte Linux à un domaine Active Directory.
Important
Nous vous recommandons d’utiliser votre adresse IP privée dans l’exemple précédent. L’utilisation de l’adresse IP publique dans cette configuration entraînera l’échec de l’installation et exposera votre machine virtuelle à des réseaux externes.
Les machines virtuelles et leur adresse IP utilisées dans cet exemple sont répertoriées comme suit :
sles1
: 10.0.0.85sles2
: 10.0.0.86sles3
: 10.0.0.87
Configurer le cluster
Pour ce tutoriel, votre première machine virtuelle (sles1
) est nœud 1, votre deuxième machine virtuelle (sles2
) est nœud 2 et votre troisième machine virtuelle (sles3
) est nœud 3. Pour plus d’informations sur l’installation de clusters, consultez Configurer Pacemaker sur SUSE Linux Enterprise Server dans Azure.
Installation du cluster
Exécutez la commande suivante pour installer le package
ha-cluster-bootstrap
sur le nœud 1, puis redémarrez le nœud. Dans cet exemple, il s'agit de la machine virtuellesles1
.sudo zypper install ha-cluster-bootstrap
Une fois le nœud redémarré, exécutez la commande suivante pour déployer le cluster :
sudo crm cluster init --name sqlcluster
Vous verrez un résultat similaire à ce qui suit :
Do you want to continue anyway (y/n)? y Generating SSH key for root The user 'hacluster' will have the login shell configuration changed to /bin/bash Continue (y/n)? y Generating SSH key for hacluster Configuring csync2 Generating csync2 shared key (this may take a while)...done csync2 checking files...done Detected cloud platform: microsoft-azure Configure Corosync (unicast): This will configure the cluster messaging layer. You will need to specify a network address over which to communicate (default is eth0's network, but you can use the network address of any active interface). Address for ring0 [10.0.0.85] Port for ring0 [5405] Configure SBD: If you have shared storage, for example a SAN or iSCSI target, you can use it avoid split-brain scenarios by configuring SBD. This requires a 1 MB partition, accessible to all nodes in the cluster. The device path must be persistent and consistent across all nodes in the cluster, so /dev/disk/by-id/* devices are a good choice. Note that all data on the partition you specify here will be destroyed. Do you wish to use SBD (y/n)? n WARNING: Not configuring SBD - STONITH will be disabled. Hawk cluster interface is now running. To see cluster status, open: https://10.0.0.85:7630/ Log in with username 'hacluster', password 'linux' WARNING: You should change the hacluster password to something more secure! Waiting for cluster..............done Loading initial cluster configuration Configure Administration IP Address: Optionally configure an administration virtual IP address. The purpose of this IP address is to provide a single IP that can be used to interact with the cluster, rather than using the IP address of any specific cluster node. Do you wish to configure a virtual IP address (y/n)? y Virtual IP []10.0.0.89 Configuring virtual IP (10.0.0.89)....done Configure Qdevice/Qnetd: QDevice participates in quorum decisions. With the assistance of a third-party arbitrator Qnetd, it provides votes so that a cluster is able to sustain more node failures than standard quorum rules allow. It is recommended for clusters with an even number of nodes and highly recommended for 2 node clusters. Do you want to configure QDevice (y/n)? n Done (log saved to /var/log/crmsh/ha-cluster-bootstrap.log)
Vérifiez l’état du cluster sur le nœud 1 à l’aide de la commande suivante :
sudo crm status
Votre sortie doit inclure le texte suivant s’il a réussi :
1 node configured 1 resource instance configured
Sur tous les nœuds, remplacez le mot de passe pour
hacluster
par quelque chose de plus sécurisé à l’aide de la commande suivante. Vous devez également modifier votre mot de passe utilisateurroot
:sudo passwd hacluster
sudo passwd root
Exécutez la commande suivante sur les nœud 2 et nœud 3 pour d’abord installer le package
crmsh
:sudo zypper install crmsh
À présent, exécutez la commande pour rejoindre le cluster :
sudo crm cluster join
Voici quelques-unes des interactions à attendre :
Join This Node to Cluster: You will be asked for the IP address of an existing node, from which configuration will be copied. If you have not already configured passwordless ssh between nodes, you will be prompted for the root password of the existing node. IP address or hostname of existing node (e.g.: 192.168.1.1) []10.0.0.85 Configuring SSH passwordless with root@10.0.0.85 root@10.0.0.85's password: Configuring SSH passwordless with hacluster@10.0.0.85 Configuring csync2...done Merging known_hosts WARNING: scp to sles2 failed (Exited with error code 1, Error output: The authenticity of host 'sles2 (10.1.1.5)' can't be established. ECDSA key fingerprint is SHA256:UI0iyfL5N6X1ZahxntrScxyiamtzsDZ9Ftmeg8rSBFI. Are you sure you want to continue connecting (yes/no/[fingerprint])? lost connection ), known_hosts update may be incomplete Probing for new partitions...done Address for ring0 [10.0.0.86] Hawk cluster interface is now running. To see cluster status, open: https://10.0.0.86:7630/ Log in with username 'hacluster', password 'linux' WARNING: You should change the hacluster password to something more secure! Waiting for cluster.....done Reloading cluster configuration...done Done (log saved to /var/log/crmsh/ha-cluster-bootstrap.log)
Une fois que vous avez joint toutes les machines au cluster, vérifiez votre ressource pour voir si toutes les machines virtuelles sont en ligne :
sudo crm status
Vous devez normalement voir la sortie suivante.
Stack: corosync Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum Last updated: Mon Mar 6 18:01:17 2023 Last change: Mon Mar 6 17:10:09 2023 by root via cibadmin on sles1 3 nodes configured 1 resource instance configured Online: [ sles1 sles2 sles3 ] Full list of resources: admin-ip (ocf::heartbeat:IPaddr2): Started sles1
Installez le composant de ressources de cluster. Exécutez la commande suivante sur tous les nœuds.
sudo zypper in socat
Installez le composant
azure-lb
. Exécutez la commande suivante sur tous les nœuds.sudo zypper in resource-agents
Configurez le système d’exploitation. Suivez les étapes suivantes sur tous les nœuds.
Modifiez le fichier config :
sudo vi /etc/systemd/system.conf
Remplacez la valeur
DefaultTasksMax
par4096
:#DefaultTasksMax=512 DefaultTasksMax=4096
Enregistrez et quittez l’éditeur vi.
Pour activer ce paramètre, exécutez la commande suivante :
sudo systemctl daemon-reload
Testez si la modification a réussi :
sudo systemctl --no-pager show | grep DefaultTasksMax
Réduisez la taille du cache d’intégrité. Suivez les étapes suivantes sur tous les nœuds.
Modifiez le fichier config du contrôle système :
sudo vi /etc/sysctl.conf
Ajoutez les deux lignes suivantes au fichier :
vm.dirty_bytes = 629145600 vm.dirty_background_bytes = 314572800
Enregistrez et quittez l’éditeur vi.
Installez le Kit de développement logiciel (SDK) Azure Python sur tous les nœuds avec les commandes suivantes :
sudo zypper install fence-agents # Install the Azure Python SDK on SLES 15 or later: # You might need to activate the public cloud extension first. In this example, the SUSEConnect command is for SLES 15 SP1 SUSEConnect -p sle-module-public-cloud/15.1/x86_64 sudo zypper install python3-azure-mgmt-compute sudo zypper install python3-azure-identity
Configurer l’agent d’isolation
Un appareil STONITH fournit un agent d’isolation. Les instructions ci-dessous ont été modifiées pour ce tutoriel. Pour plus d’informations, consultez Créer un appareil STONITH de l’agent de clôture Azure.
Vérifiez la version de l’agent de clôture Azure pour vous assurer qu’il a été mis à jour. Utilisez la commande suivante :
sudo zypper info resource-agents
Vous devez voir une sortie similaire à celle de l’exemple ci-dessous.
Information for package resource-agents:
----------------------------------------
Repository : SLE-Product-HA15-SP3-Updates
Name : resource-agents
Version : 4.8.0+git30.d0077df0-150300.8.37.1
Arch : x86_64
Vendor : SUSE LLC <https://www.suse.com/>
Support Level : Level 3
Installed Size : 2.5 MiB
Installed : Yes (automatically)
Status : up-to-date
Source package : resource-agents-4.8.0+git30.d0077df0-150300.8.37.1.src
Upstream URL : http://linux-ha.org/
Summary : HA Reusable Cluster Resource Scripts
Description : A set of scripts to interface with several services
to operate in a High Availability environment for both
Pacemaker and rgmanager service managers.
Inscrivez une nouvelle application dans Microsoft Entra ID
Pour inscrire une nouvelle application dans Microsoft Entra ID (anciennement Azure Active Directory), procédez comme suit :
- Accédez à https://portal.azure.com.
- Ouvrez le volet des propriétés de Microsoft Entra ID et relevez le
Tenant ID
. - Sélectionnez Inscriptions d’applications.
- Sélectionnez Nouvelle inscription.
- Entrez un Nom tel que
<resourceGroupName>-app
. Concernant les Types de compte pris en charge, sélectionnez Comptes dans cet annuaire d’organisation uniquement (Microsoft uniquement : locataire unique). - Sélectionnez Web pour l’URI de redirection, puis entrez une URL (par example, http://localhost)), puis sélectionnez Ajouter. L’URL de connexion peut être n’importe quelle URL valide. Une fois terminé, sélectionnez Inscrire.
- Sélectionnez Certificats et secrets pour votre nouvelle inscription d’application, puis sélectionnez Nouvelle clé secrète client.
- Entrez une description pour la nouvelle clé (clé secrète client), puis sélectionnez Ajouter.
- Notez la valeur du secret. Elle est utilisée comme mot de passe du principal de service.
- Sélectionnez Vue d’ensemble. Notez l’ID de l’application. Cet identifiant est utilisé en tant que nom d'utilisateur (ID de connexion dans les étapes ci-dessous) du principal de service.
Créer un rôle personnalisé pour l’agent de clôture
Suivez le tutoriel Créer un rôle personnalisé Azure à l’aide d’Azure CLI.
Votre fichier JSON doit être semblable à l'exemple suivant.
- Remplacez
<username>
par un nom de votre choix. Cela permet d’éviter toute duplication lors de la création de cette définition de rôle. - Remplacez
<subscriptionId>
par l’identifiant de votre abonnement Azure.
{
"Name": "Linux Fence Agent Role-<username>",
"Id": null,
"IsCustom": true,
"Description": "Allows to power-off and start virtual machines",
"Actions": [
"Microsoft.Compute/*/read",
"Microsoft.Compute/virtualMachines/powerOff/action",
"Microsoft.Compute/virtualMachines/start/action"
],
"NotActions": [
],
"AssignableScopes": [
"/subscriptions/<subscriptionId>"
]
}
Pour ajouter le rôle, exécutez la commande suivante :
- Remplacez
<filename>
par le nom du fichier. - Si vous exécutez la commande à partir d’un chemin autre que celui du dossier dans lequel est enregistré le fichier, incluez dans la commande le chemin du dossier où se trouve le fichier.
az role definition create --role-definition "<filename>.json"
Vous devez normalement voir la sortie suivante.
{
"assignableScopes": [
"/subscriptions/<subscriptionId>"
],
"description": "Allows to power-off and start virtual machines",
"id": "/subscriptions/<subscriptionId>/providers/Microsoft.Authorization/roleDefinitions/<roleNameId>",
"name": "<roleNameId>",
"permissions": [
{
"actions": [
"Microsoft.Compute/*/read",
"Microsoft.Compute/virtualMachines/powerOff/action",
"Microsoft.Compute/virtualMachines/start/action"
],
"dataActions": [],
"notActions": [],
"notDataActions": []
}
],
"roleName": "Linux Fence Agent Role-<username>",
"roleType": "CustomRole",
"type": "Microsoft.Authorization/roleDefinitions"
}
Attribuer le rôle personnalisé au principal de service
Attribuez au principal de service le rôle personnalisé Linux Fence Agent Role-<username>
qui a été créé à l’étape précédente. Répétez ces étapes pour tous les nœuds.
Avertissement
N’utilisez pas le rôle Propriétaire à partir de là.
- Accédez à https://portal.azure.com
- Ouvrez le volet Toutes les ressources
- Sélectionnez la machine virtuelle du premier nœud de cluster.
- Sélectionnez Contrôle d’accès (IAM)
- Sélectionnez Ajouter des attributions de rôle.
- Sélectionnez le rôle
Linux Fence Agent Role-<username>
dans la liste Rôle. - Laissez Attribuer l’accès à comme valeur par défaut
Users, group, or service principal
. - Dans la liste Sélectionner, entrez le nom de l’application que vous avez créée précédemment, par exemple
<resourceGroupName>-app
. - Sélectionnez Enregistrer.
Créer les appareils STONITH
Exécutez les commandes suivantes sur le nœud 1 :
- Remplacez
<ApplicationID>
par la valeur d’ID obtenue lors de l’inscription de votre application. - Remplacez
<servicePrincipalPassword>
par la valeur du secret client. - Remplacez
<resourceGroupName>
par le groupe de ressources de l’abonnement que vous utilisez pour ce tutoriel. - Remplacez
<tenantID>
et<subscriptionId>
par ceux de votre abonnement Azure.
- Remplacez
Exécutez
crm configure
pour ouvrir l’invite crm :sudo crm configure
Dans l’invite crm, exécutez la commande suivante pour configurer les propriétés de la ressource, ce qui crée la ressource appelée
rsc_st_azure
comme indiqué dans l’exemple suivant :primitive rsc_st_azure stonith:fence_azure_arm params subscriptionId="subscriptionID" resourceGroup="ResourceGroup_Name" tenantId="TenantID" login="ApplicationID" passwd="servicePrincipalPassword" pcmk_monitor_retries=4 pcmk_action_limit=3 power_timeout=240 pcmk_reboot_timeout=900 pcmk_host_map="sles1:sles1;sles2:sles2;sles3:sles3" op monitor interval=3600 timeout=120 commit quit
Exécutez les commandes suivantes pour configurer l’agent de clôture :
sudo crm configure property stonith-timeout=900 sudo crm configure property stonith-enabled=true sudo crm configure property concurrent-fencing=true
Vérifiez l’état de votre cluster pour voir que STONITH a été activé :
sudo crm status
Vous devez obtenir une sortie similaire à la suivante :
Stack: corosync Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum Last updated: Mon Mar 6 18:20:17 2023 Last change: Mon Mar 6 18:10:09 2023 by root via cibadmin on sles1 3 nodes configured 2 resource instances configured Online: [ sles1 sles2 sles3 ] Full list of resources: admin-ip (ocf::heartbeat:IPaddr2): Started sles1 rsc_st_azure (stonith:fence_azure_arm): Started sles2
Installer SQL Server et mssql-tools
Utilisez la section ci-dessous pour installer SQL Server et mssql-tools. Pour plus d’informations, consultez Installer SQL Server sur SUSE Linux Enterprise Server.
Effectuez ces étapes sur tous les nœuds de cette section.
Installer SQL Server sur des machines virtuelles
Exécutez les commandes suivantes pour installer SQL Server :
Téléchargez le fichier config du référentiel Microsoft SQL Server 2019 SLES :
sudo zypper addrepo -fc https://packages.microsoft.com/config/sles/15/mssql-server-2022.repo
Actualisez vos référentiels.
sudo zypper --gpg-auto-import-keys refresh
Pour vous assurer que la clé de signature du package Microsoft est installée sur votre système, utilisez la commande suivante pour importer la clé :
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
Exécutez les commandes suivantes pour installer SQL Server :
sudo zypper install -y mssql-server
Une fois l'installation du package terminée, lancez
mssql-conf setup
et suivez les invites pour définir le mot de passe AS et choisir votre édition.sudo /opt/mssql/bin/mssql-conf setup
Notes
Assurez-vous de spécifier un mot de passe fort pour le compte AS (longueur minimale de 8 caractères, lettres majuscules et minuscules comprises, chiffres de la base 10 et/ou symboles non alphanumériques).
Une fois la configuration terminée, vérifiez que le service est en cours d'exécution :
systemctl status mssql-server
Installer des outils de ligne de commande SQL Server
Les étapes suivantes installent les outils de ligne de commande SQL Server, nommés sqlcmd et bcp.
Ajoutez le référentiel Microsoft SQL Server à Zypper.
sudo zypper addrepo -fc https://packages.microsoft.com/config/sles/15/prod.repo
Actualisez vos référentiels.
sudo zypper --gpg-auto-import-keys refresh
Installez mssql-tools avec le package pour développeur
unixODBC
. Pour plus d’informations, consultez Installer le pilote Microsoft ODBC pour SQL Server (Linux).sudo zypper install -y mssql-tools unixODBC-devel
Par commodité, vous pouvez ajouter /opt/mssql-tools/bin/
à votre variable d'environnement PATH
. Vous pourrez ainsi exécuter les outils sans spécifier le chemin complet. Exécutez les commandes suivantes afin de modifier la variable PATH pour les sessions de connexion et les sessions interactives ou sans connexion :
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
Installer l’agent à haute disponibilité de SQL Server
Exécutez la commande suivante sur tous les nœuds pour installer le package d’agent à haute disponibilité pour SQL Server :
sudo zypper install mssql-server-ha
Ouvrir des ports pour les services à haute disponibilité
Vous pouvez ouvrir les ports de pare-feu suivants sur tous les nœuds pour les services de SQL Server et haute disponibilité : 1433, 2224, 3121, 5022, 5405, 21064.
sudo firewall-cmd --zone=public --add-port=1433/tcp --add-port=2224/tcp --add-port=3121/tcp --add-port=5022/tcp --add-port=5405/tcp --add-port=21064 --permanent sudo firewall-cmd --reload
Configurer un groupe de disponibilité
Effectuez les étapes suivantes pour configurer un groupe de disponibilité AlwaysOn SQL Server sur vos machines virtuelles. Pour plus d’informations, consultez Configurer des groupes de disponibilité AlwaysOn SQL Server pour la haute disponibilité sur Linux.
Activer les groupes de disponibilité et redémarrer SQL Server
Activez les groupes de disponibilité sur chaque nœud qui héberge une instance SQL. Ensuite, redémarrez le service mssql-server
. Exécutez les commandes suivantes sur chaque nœud :
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
Créer un certificat
Microsoft ne prend pas en charge l’authentification Active Directory sur le point de terminaison du groupe de disponibilité. Par conséquent, nous devons utiliser un certificat pour le chiffrement du point de terminaison du groupe de disponibilité.
Connectez-vous à tous les nœuds à l’aide de SQL Server Management Studio (SSMS) ou de sqlcmd. Exécutez les commandes suivantes pour activer une session AlwaysOn_health et créer une clé principale :
Important
Si vous vous connectez à distance à votre instance SQL Server, le port 1433 doit être ouvert dans votre pare-feu. Vous devez également autoriser les connexions entrantes sur le port 1433 de votre groupe de sécurité réseau pour chaque machine virtuelle. Pour plus d’informations sur la création d’une règle de sécurité de trafic entrant, consultez Créer une règle de sécurité.
- Remplacez
<MasterKeyPassword>
par votre propre mot de passe.
ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE = ON); GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<MasterKeyPassword>'; GO
- Remplacez
Connectez-vous au réplica principal à l’aide de SSMS ou de sqlcmd. Les commandes ci-dessous créent un certificat dans
/var/opt/mssql/data/dbm_certificate.cer
et une clé privée dansvar/opt/mssql/data/dbm_certificate.pvk
sur votre réplica de SQL Server principal :- Remplacez
<PrivateKeyPassword>
par votre propre mot de passe.
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm'; GO BACKUP CERTIFICATE dbm_certificate TO FILE = '/var/opt/mssql/data/dbm_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk', ENCRYPTION BY PASSWORD = '<PrivateKeyPassword>' ); GO
- Remplacez
Quittez la session sqlcmd en exécutant la commande exit
, puis revenez à votre session SSH.
Copier le certificat sur les réplicas secondaires et créer les certificats sur le serveur
Copiez les deux fichiers qui ont été créés au même emplacement sur tous les serveurs qui hébergeront les réplicas de disponibilité.
Sur le serveur principal, exécutez la commande
scp
suivante pour copier le certificat sur les serveurs cibles :- Remplacez
<username>
etsles2
par le nom d’utilisateur et le nom de la machine virtuelle cible que vous utilisez. - Exécutez cette commande pour tous les réplicas secondaires.
Notes
Vous n’êtes pas obligé d’exécuter
sudo -i
, qui vous indique l’environnement racine. Vous pouvez exécuter la commandesudo
devant chaque commande à la place.# The below command allows you to run commands in the root environment sudo -i
scp /var/opt/mssql/data/dbm_certificate.* <username>@sles2:/home/<username>
- Remplacez
Sur le serveur cible, exécutez la commande suivante :
- Remplacez
<username>
par votre ID d’utilisateur. - La commande
mv
permet de déplacer les fichiers ou le répertoire. - La commande
chown
est utilisée pour modifier le propriétaire ainsi que le groupe de fichiers, de répertoires ou de liens. - Exécutez ces commandes pour tous les réplicas secondaires.
sudo -i mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/ cd /var/opt/mssql/data chown mssql:mssql dbm_certificate.*
- Remplacez
Le script Transact-SQL suivant crée un certificat à partir de la sauvegarde que vous avez créée sur le réplica SQL Server principal. Mettez à jour le script avec des mots de passe forts. Le mot de passe de déchiffrement est le même que celui que vous avez utilisé pour créer le fichier .pvk à l’étape précédente. Pour créer le certificat, exécutez le script suivant à l’aide de sqlcmd ou de SSMS sur tous les serveurs secondaires :
CREATE CERTIFICATE dbm_certificate FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk', DECRYPTION BY PASSWORD = '<PrivateKeyPassword>' ); GO
Créer les points de terminaison de mise en miroir de bases de données sur tous les réplicas
Exécutez le script suivant sur toutes les instances SQL à l’aide de sqlcmd ou de SSMS :
CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (
ROLE = ALL,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
GO
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO
Créez le groupe de disponibilité
Connectez-vous à l’instance SQL qui héberge le réplica principal à l’aide de sqlcmd ou de SSMS. Exécutez la commande suivante pour créer le groupe de disponibilité :
- Remplacez
ag1
par le nom désiré pour votre groupe de disponibilité. - Remplacez les valeurs
sles1
,sles2
etsles3
par les noms des instances SQL Server qui hébergent les réplicas.
CREATE AVAILABILITY
GROUP [ag1]
WITH (
DB_FAILOVER = ON,
CLUSTER_TYPE = EXTERNAL
)
FOR REPLICA
ON N'sles1'
WITH (
ENDPOINT_URL = N'tcp://sles1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'sles2'
WITH (
ENDPOINT_URL = N'tcp://sles2:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'sles3'
WITH (
ENDPOINT_URL = N'tcp://sles3:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
);
GO
ALTER AVAILABILITY GROUP [ag1]
GRANT CREATE ANY DATABASE;
GO
Créer une connexion SQL Server pour Pacemaker
Sur toutes les instances SQL Server, créez un compte de connexion SQL Server pour Pacemaker. Le code Transact-SQL ci-dessous a pour effet de créer un compte de connexion.
- Remplacez
<password>
par votre propre mot de passe complexe.
USE [master]
GO
CREATE LOGIN [pacemakerLogin]
WITH PASSWORD = N'<password>';
GO
ALTER SERVER ROLE [sysadmin]
ADD MEMBER [pacemakerLogin];
GO
Sur toutes les instances SQL Server, enregistrez les informations d’identification utilisées pour le compte de connexion SQL Server.
Créez le fichier :
sudo vi /var/opt/mssql/secrets/passwd
Ajoutez les deux lignes suivantes au fichier :
pacemakerLogin <password>
Pour quitter l’éditeur vi, appuyez d’abord sur la touche Echap, puis entrez la commande
:wq
pour écrire le fichier et quitter.Rendez le fichier lisible uniquement par la racine :
sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 400 /var/opt/mssql/secrets/passwd
Joindre les réplicas secondaires au groupe de disponibilité
Sur vos réplicas secondaires, exécutez les commandes suivantes pour les joindre au groupe de disponibilité :
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL); GO ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE; GO
Exécutez le script Transact-SQL suivant sur le réplica principal et sur chaque réplica secondaire :
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin; GO GRANT VIEW SERVER STATE TO pacemakerLogin; GO
Une fois les réplicas secondaires joints, vous pouvez les afficher dans l’Explorateur d’objets de SSMS en développant le nœud Haute disponibilité Always On :
Ajouter une base de données au groupe de disponibilité
Cette section suit l’article relatif à l’ajout d’une base de données à un groupe de disponibilité.
Les commandes Transact-SQL suivantes sont utilisées dans cette étape. Exécutez les commandes suivantes sur le réplica principal :
CREATE DATABASE [db1]; -- creates a database named db1
GO
ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery model
GO
BACKUP DATABASE [db1] -- backs up the database to disk
TO DISK = N'/var/opt/mssql/data/db1.bak';
GO
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1]; -- adds the database db1 to the AG
GO
Vérifier que la base de données est créée sur les serveurs secondaires
Sur chaque réplica SQL Server secondaire, exécutez la requête suivante pour déterminer si la base de données db1 a été créée et si son état indique « SYNCHRONIZED » :
SELECT * FROM sys.databases
WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database',
synchronization_state_desc
FROM sys.dm_hadr_database_replica_states;
GO
Si synchronization_state_desc
indique SYNCHRONIZED pour db1
, cela signifie que les réplicas sont synchronisés. Les réplicas secondaires indiquent db1
dans le réplica principal.
Créer les ressources de groupe de disponibilité dans le cluster Pacemaker
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.
Cet article fait référence au guide permettant de créer les ressources de groupe de disponibilité dans le cluster Pacemaker.
Activer Pacemaker
Activez Pacemaker afin qu’il démarre automatiquement.
Exécutez la commande suivante sur tous les nœuds dans le cluster.
sudo systemctl enable pacemaker
Créer la ressource de cluster du groupe de disponibilité
Exécutez
crm configure
pour ouvrir l’invite crm :sudo crm configure
Dans l’invite crm, exécutez la commande suivante pour configurer les propriétés de la ressource. Les commandes suivantes créent la ressource
ag_cluster
dans le groupe de disponibilitéag1
.primitive ag_cluster ocf:mssql:ag params ag_name="ag1" meta failure-timeout=60s op start timeout=60s op stop timeout=60s op promote timeout=60s op demote timeout=10s op monitor timeout=60s interval=10s op monitor timeout=60s interval=11s role="Master" op monitor timeout=60s interval=12s role="Slave" op notify timeout=60s ms ms-ag_cluster ag_cluster meta master-max="1" master-node-max="1" clone-max="3" clone-node-max="1" notify="true" commit quit
Conseil
Tapez
quit
pour quitter l’invite crm.Définissez la contrainte de co-localisation pour l’adresse IP virtuelle afin d’exécuter le même nœud comme nœud principal :
sudo crm configure colocation vip_on_master inf: admin-ip ms-ag_cluster: Master commit quit
Ajoutez la contrainte de tri pour empêcher l’adresse IP de pointer temporairement vers le nœud avec le secondaire antérieur au basculement. Exécutez la commande suivante pour créer une contrainte de tri :
sudo crm configure order ag_first inf: ms-ag_cluster:promote admin-ip:start commit quit
Vérifiez l’état du cluster à l’aide de la commande :
sudo crm status
La sortie doit ressembler à celle de l’exemple suivant :
Cluster Summary: * Stack: corosync * Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum * Last updated: Mon Mar 6 18:38:17 2023 * Last change: Mon Mar 6 18:38:09 2023 by root via cibadmin on sles1 * 3 nodes configured * 5 resource instances configured Node List: * Online: [ sles1 sles2 sles3 ] Full List of Resources: * admin-ip (ocf::heartbeat:IPaddr2): Started sles1 * rsc_st_azure (stonith:fence_azure_arm): Started sles2 * Clone Set: ms-ag_cluster [ag_cluster] (promotable): * Masters: [ sles1 ] * Slaves: [ sles2 sles3 ]
Exécutez la commande suivante pour passer en revue les contraintes :
sudo crm configure show
La sortie doit ressembler à celle de l’exemple suivant :
node 1: sles1 node 2: sles2 node 3: sles3 primitive admin-ip IPaddr2 \ params ip=10.0.0.93 \ op monitor interval=10 timeout=20 primitive ag_cluster ocf:mssql:ag \ params ag_name=ag1 \ meta failure-timeout=60s \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 \ op promote timeout=60s interval=0 \ op demote timeout=10s interval=0 \ op monitor timeout=60s interval=10s \ op monitor timeout=60s interval=11s role=Master \ op monitor timeout=60s interval=12s role=Slave \ op notify timeout=60s interval=0 primitive rsc_st_azure stonith:fence_azure_arm \ params subscriptionId=xxxxxxx resourceGroup=amvindomain tenantId=xxxxxxx login=xxxxxxx passwd="******" cmk_monitor_retries=4 pcmk_action_limit=3 power_timeout=240 pcmk_reboot_timeout=900 pcmk_host_map="sles1:sles1;les2:sles2;sles3:sles3" \ op monitor interval=3600 timeout=120 ms ms-ag_cluster ag_cluster \ meta master-max=1 master-node-max=1 clone-max=3 clone-node-max=1 notify=true order ag_first Mandatory: ms-ag_cluster:promote admin-ip:start colocation vip_on_master inf: admin-ip ms-ag_cluster:Master property cib-bootstrap-options: \ have-watchdog=false \ dc-version="2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712" \ cluster-infrastructure=corosync \ cluster-name=sqlcluster \ stonith-enabled=true \ concurrent-fencing=true \ stonith-timeout=900 rsc_defaults rsc-options: \ resource-stickiness=1 \ migration-threshold=3 op_defaults op-options: \ timeout=600 \ record-pending=true
Test de basculement
Pour vérifier que la configuration a réussi, testez un basculement. Pour plus d’informations, consultez Basculement du groupe de disponibilité AlwaysOn sur Linux.
Exécutez la commande suivante pour basculer manuellement le réplica principal vers
sles2
. Remplacezsles2
par le nom du serveur.sudo crm resource move ag_cluster sles2
La sortie doit ressembler à celle de l’exemple suivant :
INFO: Move constraint created for ms-ag_cluster to sles2 INFO: Use `crm resource clear ms-ag_cluster` to remove this constraint
Vérifiez l’état du cluster :
sudo crm status
La sortie doit ressembler à celle de l’exemple suivant :
Cluster Summary: * Stack: corosync * Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum * Last updated: Mon Mar 6 18:40:02 2023 * Last change: Mon Mar 6 18:39:53 2023 by root via crm_resource on sles1 * 3 nodes configured * 5 resource instances configured Node List: * Online: [ sles1 sles2 sles3 ] Full List of Resources: * admin-ip (ocf::heartbeat:IPaddr2): Stopped * rsc_st_azure (stonith:fence_azure_arm): Started sles2 * Clone Set: ms-ag_cluster [ag_cluster] (promotable): * Slaves: [ sles1 sles2 sles3 ]
Après un certain temps, la machine virtuelle
sles2
est désormais la machine virtuelle principale et les deux autres machines virtuelles sont secondaires. Réexécutezsudo crm status
et évaluez la sortie, qui est similaire à l’exemple suivant :Cluster Summary: * Stack: corosync * Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum * Last updated: Tue Mar 6 22:00:44 2023 * Last change: Mon Mar 6 18:42:59 2023 by root via cibadmin on sles1 * 3 nodes configured * 5 resource instances configured Node List: * Online: [ sles1 sles2 sles3 ] Full List of Resources: * admin-ip (ocf::heartbeat:IPaddr2): Started sles2 * rsc_st_azure (stonith:fence_azure_arm): Started sles2 * Clone Set: ms-ag_cluster [ag_cluster] (promotable): * Masters: [ sles2 ] * Slaves: [ sles1 sles3 ]
Vérifiez à nouveau vos contraintes à l’aide de
crm config show
. Notez qu’une autre contrainte a été ajoutée en raison du basculement manuel.Supprimez la contrainte avec l’ID
cli-prefer-ag_cluster
à l’aide de la commande suivante :crm configure delete cli-prefer-ms-ag_cluster commit
Tester l’isolation
Vous pouvez tester STONITH en exécutant la commande suivante. Essayez d’exécuter la commande ci-dessous à partir de sles1
pour sles3
.
sudo crm node fence sles3