Prérequis
- Vous avez besoin de KVM installé sur 2 nœuds Linux.
- Vos applications critiques doivent être installées dans une ou plusieurs machines virtuelles.
Installation du package sous Linux
-
Installez la version gratuite de SafeKit sur 2 nœuds Linux.
Remarque : l'essai gratuit inclut toutes les fonctionnalités de SafeKit. À la fin de l'essai, vous pouvez activer des clés de licence permanentes sans désinstaller le package.
-
Après le téléchargement du package safekit_xx.bin, exécutez-le pour extraire le rpm et le script safekitinstall, puis exécutez le script safekitinstall
-
Répondez oui à la configuration automatique du pare-feu
-
Définissez le mot de passe pour la console Web et l'utilisateur par défaut admin.
- Utilisez des caractères alphanumériques pour le mot de passe (pas de caractères spéciaux).
- Le mot de passe doit être le même sur les deux nœuds.
Installation du module sous Linux
-
Téléchargez le module kvm.safe.
Le module est gratuit. Il contient les fichiers userconfig.xml et les scripts de redémarrage.
- Mettre kvm.safe sous /opt/safekit/Application_Modules/generic/.
La configuration KVM est présentée avec une machine virtuelle nommée VM1
et contenant l'application à redémarrer en cas de panne.
Vous devrez répéter cette configuration pour toutes les VM que vous souhaitez répliquer et redémarrer. SafeKit prend en charge jusqu'à 25 machines virtuelles.
1. Prérequis
L'image de la machine virtuelle vm1 se trouve dans le fichier /var/lib/libvirt/images/vm1.qcow2
. Avant la configuration de SafeKit, vous devez effectuer la configuration suivante pour placer la machine virtuelle dans un répertoire propre à vm1 qui sera répliqué par SafeKit.
Sur le nœud 1 :
- Arrêter vm1 :
virsh shutdown vm1
- Créez un répertoire
vm1/
:mkdir -p /var/lib/libvirt/images/vm1/
- Copiez l'image vm1 vers le nouvel emplacement :
cp -a /var/lib/libvirt/images/vm1.qcow2 /var/lib/libvirt/images/vm1/
L'image vm1 d'origine peut être supprimée dès que les tests avec le nouvel emplacement sont réussis.
- Modifiez le fichier de configuration vm1 :
EDITOR=vi virsh edit vm1
Et changez la ligne :
<source file='/var/lib/libvirt/images/vm1.qcow2'>
par :
<source file='/var/lib/libvirt/images/vm1/vm1.qcow2'>
- Définissez l'option cache sur 'none' dans le même fichier, pour l'intégrité des données en cas de crash :
<disk type='file' device='disk'> <driver name='qemu' type=’qcow2’ cache='none'/>
- Fermer le fichier de configuration vm1
- Désactiver le démarrage automatique de vm1 :</ p>
virsh autostart vm1 --disable
- Créez un fichier de configuration
vm1.xml
pour vm1 :virsh dumpxml vm1 > vm1.xml
Sur le nœud 2 :
- Copiez le fichier de configuration
vm1.xml
du nœud 1.Remarque : chaque fois que la configuration vm1 est modifiée sur le nœud 1, vous devez réappliquer la nouvelle configuration sur le nœud 2.
- Créez la machine virtuelle vm1 mais ne la démarrez pas :
virsh define vm1.xml
- Désactiver le démarrage automatique de vm1 :
virsh autostart vm1 --disable
- Créez le répertoire pour l'emplacement de l'image :
mkdir -p /var/lib/libvirt/images/vm1/
2. Lancez la console SafeKit
- Lancez la console Web dans un navigateur sur un nœud du cluster en vous connectant à
http://localhost:9010
. - Entrez
admin
comme nom d'utilisateur et le mot de passe défini lors de l'installation.
Vous pouvez également exécuter la console dans un navigateur sur un poste de travail externe au cluster.
La configuration de SafeKit se fait sur les deux nœuds à partir d'un seul navigateur.
Pour sécuriser la console Web, consultez 11. Sécurisation du service web de SafeKit dans le Guide de l'utilisateur.
3. Configurer les adresses des nœuds
- Entrez les adresses IP des nœuds et appuyez sur la touche Tabulation pour vérifier la connectivité et remplir le nom des nœuds.
- Ensuite, cliquez sur
Save and apply
pour enregistrer la configuration.
Si le nœud 1 ou le nœud 2 a une couleur rouge, vérifiez la connectivité du navigateur aux deux nœuds et vérifiez le pare-feu sur les deux nœuds pour résoudre le problème.
Si vous le souhaitez, vous pouvez ajouter un nouveau LAN pour un deuxième heartbeat et pour un réseau de réplication dédié.
Cette opération placera les adresses IP dans le fichier cluster.xml
sur les deux nœuds (plus d'informations dans le training avec les lignes de commande).
5. Configurer le module
- Choisissez un démarrage
Automatic
du module au boot sans délai. - Normalement, vous disposez d'un seul réseau
Heartbeat
sur lequel la réplication est effectuée. Mais vous pouvez définir un réseau privé si nécessaire (en ajoutant un LAN à l'étape 3). - Mettez dans
VM_PATH
, le chemin racine du répertoire répliqué (/var/lib/libvirt/images
). - Entrez dans
VM_NAME
, le nom de la machine virtuelle (vm1
).
Nous supposons que les fichiers de VM1 se trouvent dans /var/lib/libvirt/image/vm1/
(voir prérequis). Ce répertoire va être répliqué en temps réel par SafeKit.
Vous n'avez pas besoin de configurer une adresse IP virtuelle. La VM1 sera redémarrée sur le KVM secondaire avec son adresse IP physique, et cette adresse IP sera reroutée.
6. Modifier les scripts (facultatif)
- Ne modifiez pas les scripts.
10. Démarrez le nœud avec des données à jour
- Si le nœud 1 possède le répertoires répliqué
vm1/
à jour, sélectionnez-le et démarrez-le en tant que primaireAs primary
.
Lorsque le nœud 2 sera démarré, toutes les données seront copiées du nœud 1 vers le nœud 2.
Si vous faites le mauvais choix, vous courez le risque de synchroniser des données obsolètes sur les deux nœuds.
Il est également supposé que VM1
est arrêtée sur le nœud 1 afin que SafeKit installe les mécanismes de réplication puis démarre VM1
dans le script start_prim
.
Utilisez Start
pour les démarrages suivants : SafeKit retient le serveur le plus à jour. Le démarrage As primary
est un démarrage spécial la première fois ou lors d'opérations exceptionnelles.
11. Attendez le passage à ALONE (vert)
- Le nœud 1 doit atteindre l'état ALONE (vert), ce qui signifie que le script
start_prim
a été exécuté sur le nœud 1.
Si ALONE (vert) n’est pas atteint ou si VM1 n'est pas démarrée, analysez pourquoi avec le journal du module du nœud 1.
- cliquez sur l'icône « journal » de
node1
pour ouvrir le journal du module et recherchez des messages d'erreur tels qu'un checker détectant une erreur et arrêtant le module. - cliquez sur
start_prim
dans le journal : les messages de sortie du script sont affichés à droite et des erreurs peuvent être détectées comme VM1 mal démarrée.
Si le cluster est dans l'état WAIT (rouge) not uptodate, STOP (rouge) not upodate
, arrêtez le nœud WAIT et forcer son démarrage en tant que primaire.
12. Démarrer le nœud 2
- Démarrez le nœud 2 avec son menu contextuel.
- Attendez l'état SECOND (vert).
Le nœud 2 reste dans l'état SECOND (orange) lors de la resynchronisation des répertoires répliqués (copie du nœud 1 vers le nœud 2).
Cela peut prendre un certain temps en fonction de la taille des fichiers à resynchroniser dans les répertoires répliqués et de la bande passante du réseau.
Pour voir la progression de la copie, consultez le log du module et les ressources de réplication du nœud 2.
14. Tests
- Arrêtez le nœud PRIM en faisant défiler son menu contextuel et en cliquant sur
Stop
. - Vérifiez qu'il y a un basculement sur le nœud 2 qui doit devenir ALONE (vert).
- Vérifiez avec les outils KVM que VM1 s'exécute sur le nœud 2.
Si ALONE (vert) n’est pas atteint sur le nœud 2 ou si VM1 n'est pas démarrée, analysez pourquoi avec le journal du module du nœud 2.
- cliquez sur l'icône « journal » de
node2
pour ouvrir le journal du module et recherchez des messages d'erreur tels qu'un checker détectant une erreur et arrêtant le module. - cliquez sur
start_prim
dans le journal : les messages de sortie du script sont affichés à droite et des erreurs peuvent être détectées comme VM1 mal démarrée.
Si tout va bien, lancez un démarrage du noeud 1, qui resynchronisera les répertoires répliqués depuis le noeud 2.
Si les choses vont mal, arrêtez le noeud 2 et forcez le démarrage en tant que primaire du noeud 1, qui redémarrera avec ses données localement saines au moment de l'arrêt.
15. Réplication des snapshots
Le répertoire qui contient les fichiers xml des snapshots est :
/var/lib/libvirt/qemu/snapshot/%VM_NAME%
où VM_NAME
est le nom de la machine virtuelle (vm1).
Remarque : Si aucun snapshot n'a été créé, créez-en un pour générer le répertoire (sinon la configuration suivante de SafeKit échouera).
Pour le répliquer :
- Dans la configuration du module, cliquez sur
Advanced configuration
(voir image) pour éditeruserconfig.xml
. -
Insérez la ligne ci-dessous dans la section
<rfs>
de userconfig.xml :<replicated dir="/var/lib/libvirt/qemu/snapshot/%VM_NAME%" mode="read_only"> </replicated>
- Appliquez la configuration avec
Save and apply
pour redéployer le fichier userconfig.xml modifié sur les deux nœuds (le module doit être arrêté sur les deux nœuds à l'étapeSave and apply
). -
Créez des snapshots sur le nœud PRIM via virt-manager ou une ligne de commande :
virsh snapshot-create-as vm1 snapshot-name
Remarque : lors de la création d'un snapshot avec une ligne de commande, vous devez actualiser la vue des snapshots dans virt-manager.
Les snapshots créés sur le nœud PRIM sont opérationnels sur le nœud 2 après le basculement, mais ne sont pas listés sur le nœud 2.
-
Pour importer un snapshot sur le nœud 2, vous devez exécuter la commande :
virsh snapshot-create --redefine vm1 /var/lib/libvirt/qemu/snapshot/vm1/snapshot-name
-
La ligne de commande pour répertorier tous les snapshots de vm1 est :
virsh snapshot-list vm1
16. Support
- Pour obtenir du support, prenez deux
snapshots
SafeKit (deux fichiers .zip), un pour chaque nœud. - Si vous avez un compte sur https://support.evidian.com, téléchargez-les dans l'outil call desk.
17. Si nécessaire, configurez un checker splitbrain
- Voir ci-dessous "Quels sont les différents scénarios en cas d'isolement réseau dans un cluster ?" pour savoir si vous devez configurer un checker splitbrain.
- Allez dans la configuration du module et cliquez sur
Checkers / Splitbrain
(voir image) pour modifier les paramètres du splitbrain. Enregistrez et appliquez
la nouvelle configuration pour la redéployer sur les deux nœuds (le module doit être arrêté sur les deux nœuds pour enregistrer et appliquer).
Paramètres :
Resource name
identifie le témoin avec un nom de ressource :splitbrain.witness
. Vous pouvez modifier cette valeur pour identifier le témoin.Witness address
est l'argument du ping lorsqu'un nœud passe de PRIM à ALONE ou de SECOND à ALONE. Changez cette valeur avec l'IP du témoin (un élément robuste, typiquement un routeur).- Remarque : vous pouvez définir plusieurs adresses IP séparées par des espaces. Attention, les adresses IP doivent être accessibles depuis un nœud mais pas depuis l'autre en cas d'isolement du réseau.
Un seul réseau
Lorsqu'il y a un isolement réseau, le comportement par défaut est :
- comme les heartbeats sont perdus pour chaque nœud, chaque nœud passe en ALONE et exécute l'application avec son adresse IP virtuelle (double exécution de l'application modifiant ses données locales),
- lorsque l'isolement est réparé, un nœud ALONE est obligé de s'arrêter et de resynchroniser ses données depuis l'autre nœud,
- à la fin, le cluster est PRIM-SECOND (ou SECOND-PRIM selon la détection d'adresse IP virtuelle en double faite par Windows).
Deux réseaux avec un réseau de réplication dédié
Lorsqu'il y a un isolement réseau, le comportement avec un réseau de réplication dédié est :
- un réseau de réplication dédié est implémenté sur un réseau privé,
- les heartbeats sur le réseau de production sont perdus (réseau isolé),
- les heartbeats sur le réseau de réplication fonctionnent (réseau non isolé),
- le cluster reste à l'état PRIM/SECOND.
Un seul réseau et un checker split-brain
Lorsqu'il y a un isolement du réseau, le comportement avec un split-brain checker est :
- un split-brain checker a été configuré avec l'adresse IP d'un témoin (typiquement un routeur),
- le split-brain agit lorsqu'un serveur passe de PRIM à ALONE ou de SECOND à ALONE,
- en cas d'isolement du réseau, avant de passer en ALONE, les deux nœuds testent l'adresse IP,
- le nœud qui peut accéder à l'adresse IP passe à ALONE, l'autre passe à WAIT,
- lorsque l'isolement est réparé, le nœud WAIT resynchronise ses données et devient SECOND.
Remarque : Si le témoin est en panne ou déconnecté, les deux nœuds passent à WAIT et l'application n'est plus en cours d'exécution. C'est pourquoi vous devez choisir un témoin robuste comme un routeur.
Fichiers internes à SafeKit pour la haute disponibilité de KVM avec réplication temps réel synchrone et tolérance aux pannes
Allez dans le tab Advanced Configuration de la console pour modifier les fichiers ci-dessous.Fichiers internes au module Linux kvm.safe
userconfig.xml (description dans le guide de l'utilisateur)/p>
<!-- Mirror Architecture with Real Time File Replication and Failover for KVM -->
<!DOCTYPE safe>
<safe>
<!-- Set value to the path of the virtual machines repository -->
<macro name="VM_PATH" value="/var/lib/libvirt/images" />
<!-- Set value to the name of the virtual machine -->
<macro name="VM_NAME" value="vm1" />
<service mode="mirror" defaultprim="alone" maxloop="3" loop_interval="24" failover="on">
<!-- Heartbeat Configuration -->
<heart>
<heartbeat name="">
</heartbeat>
</heart>
<!-- File Mirroring Configuration -->
<rfs mountover="off" async="second" locktimeout="200" nbrei="3">
<replicated dir="%VM_PATH%/%VM_NAME%" mode="read_only">
</replicated>
<!-- Uncomment for replicating the directory that contains snapshot xml files of the virtual machine
<replicated dir="/var/lib/libvirt/qemu/snapshot/%VM_NAME%" mode="read_only">
</replicated>
-->
</rfs>
<!-- User scripts Configuration -->
<user>
<var name="VM_PATH" value="%VM_PATH%/%VM_NAME%" />
<var name="VM_NAME" value="%VM_NAME%" />
</user>
</service>
</safe>
start_prim
#!/bin/sh
# Script called on the primary server for starting application
# For logging into SafeKit log use:
# $SAFE/safekit printi | printe "message"
# stdout goes into Application log
echo "Running start_prim $*"
res=0
# Start VM_NAME
virsh start $VM_NAME
state=$(virsh list --all | grep " $VM_NAME " | awk '{ print $3}')
if ([ "x$state" == "x" ]) ; then
res=1
$SAFE/safekit printe "$VM_NAME not found"
else
let i=1
while ( [ $i -le 5 ] && [ "x$state" != "xrunning" ]); do
sleep 5
state=$(virsh list --all | grep " $VM_NAME " | awk '{ print $3}')
let i=i+1
done
if ([ "x$state" != "xrunning" ]) ; then
res=1
$SAFE/safekit printe "$VM_NAME start failed"
fi
fi
if [ $res -ne 0 ] ; then
$SAFE/safekit printe "start_prim failed"
# uncomment to stop SafeKit when critical
$SAFE/safekit stop -i "start_prim"
fi
stop_prim
#!/bin/sh
# Script called on the primary server for stopping application
# For logging into SafeKit log use:
# $SAFE/safekit printi | printe "message"
#----------------------------------------------------------
#
# 2 stop modes:
#
# - graceful stop
# call standard application stop
#
# - force stop ($1=force)
# kill application's processes
#
#----------------------------------------------------------
# stdout goes into Application log
echo "Running stop_prim $*"
# Stop VM_NAME
virsh shutdown $VM_NAME
state=$(virsh list --all | grep " $VM_NAME " | awk '{ print $3}')
if ([ "x$state" == "x" ]) ; then
res=1
$SAFE/safekit printe "$VM_NAME not found"
else
let i=1
while ( [ $i -le 5 ] && [ "x$state" == "xrunning" ]); do
# Stop VM_NAME
virsh shutdown $VM_NAME
sleep 5
state=$(virsh list --all | grep " $VM_NAME " | awk '{ print $3}')
let i=i+1
done
if ([ "x$state" == "xrunning" ]) ; then
res=1
$SAFE/safekit printe "$VM_NAME stop failed"
fi
fi
res=0
# default: no action on forcestop
[ "$1" = "force" ] && exit 0
# Fill with your application stop call
[ $res -ne 0 ] && $SAFE/safekit printe "stop_prim failed"