Prérequis
- Vous avez besoin de PostgreSQL installé sur 2 nœuds (machines virtuelles ou serveurs physiques).
-
Sous Windows, avec le gestionnaire de services Windows, placez les services PostgreSQL avec Boot Startup Type = Manual sur les deux nœuds. p>
SafeKit contrôle le démarrage des services PostgreSQL dans les scripts de redémarrage. Editez les scripts de redémarrage lors de la configuration pour vérifier si vous avez mis tous les services en démarrage manuel, y compris les nouveaux que vous pouvez ajouter.
Installation du package sous Windows
-
Téléchargez la version gratuite de SafeKit sur 2 nœuds Windows.
Remarque : la version gratuite 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.
-
Pour ouvrir le pare-feu Windows, sur les deux nœuds démarrez un powershell en tant qu'administrateur et tapez
c:/safekit/private/bin/firewallcfg add
-
Pour initialiser le mot de passe de l'utilisateur admin par défaut de la console, sur les deux nœuds démarrez un powershell en tant qu'administrateur et tapez
c:/safekit/private/bin/webservercfg.ps1 -passwd mdp
- Utilisez des caractères alphanumériques pour le mot de passe (pas de caractères spéciaux).
- mdp doit être le même sur les deux nœuds.
-
Exclure des analyses antivirus C:\safekit\ (le répertoire d'installation par défaut) et tous les dossiers répliqués que vous allez définir.
Les antivirus peuvent rencontrer des problèmes de détection avec SafeKit en raison de son intégration étroite avec le système d'exploitation, de ses mécanismes d'IP virtuelle, de sa réplication en temps réel et du redémarrage de services critiques.
Installation du module sous Windows
-
Téléchargez le module postgresql.safe.
Le module est gratuit. Il contient les fichiers userconfig.xml et les scripts de redémarrage.
- Mettez postgresql.safe sous C:\safekit\Application_Modules\generic\.
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 postgresql.safe.
Le module est gratuit. Il contient les fichiers userconfig.xml et les scripts de redémarrage.
- Mettre postgresql.safe sous /opt/safekit/Application_Modules/generic/.
1. 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.
2. 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).
4. 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 2). - Saisissez une
Virtual IP address
. Une adresse IP virtuelle est une adresse IP standard dans le même réseau IP (même sous-réseau) que les adresses IP des deux nœuds.
Les clients de l'application doivent être configurés avec l'adresse IP virtuelle (ou le nom DNS associé à l'adresse IP virtuelle).
L'adresse IP virtuelle est automatiquement basculée en cas de panne. - Vérifiez que les
Replicated directories
sont installés sur les deux nœuds et contiennent les données de l'application.
La réplication des données et des journaux est essentielle pour une base de données.
Vous pouvez créer des répertoires répliqués supplémentaires selon vos besoins. - Notez que si un nom de processus est affiché dans
Monitored processes/services
, il sera surveillé avec une action de redémarrage en cas de panne. La configuration d'un mauvais nom de processus entraînera l'arrêt du module juste après son démarrage.
Si vous cliquez sur Advanced configuration
, le fichier userconfig.xml
s'affiche (exemple avec Microsoft SQL Server).
5. Modifier les scripts (facultatif)
start_prim
etstop_prim
doivent contenir le démarrage et l'arrêt de l'application PostgreSQL (exemple fourni pour Microsoft SQL Server à droite).- Vous pouvez ajouter de nouveaux services dans ces scripts.
- Vérifiez que les noms des services démarrés dans ces scripts sont ceux installés sur les deux nœuds, sinon modifiez-les dans les scripts.
- Sous Windows et sur les deux nœuds, avec le gestionnaire de services Windows, définissez
Boot Startup Type = Manual
pour tous les services démarrés dansstart_prim
(SafeKit contrôle le démarrage des services dansstart_prim
).
8. Vérifier que la configuration a réussi
- Vérifiez le message
Success
(vert) sur les deux nœuds et cliquez surMonitor modules
.
Sous Linux, vous pouvez obtenir une erreur à cette étape si les répertoires répliqués sont des points de montage. Consultez cet article pour résoudre le problème.
9. Démarrez le nœud avec des données à jour
- Si le nœud 1 possède les répertoires répliqués à jour, sélectionnez-le et démarrez-le en tant que primaire
As 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 l'application PostgreSQL est arrêtée sur le nœud 1 afin que SafeKit installe les mécanismes de réplication puis démarre l'application 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.
10. Attendez le passage à ALONE (vert)
- Le nœud 1 doit atteindre l'état ALONE (vert), ce qui signifie que l'adresse IP virtuelle est définie et que le script
start_prim
a été exécuté sur le nœud 1.
Si ALONE (vert) n’est pas atteint ou si l'application 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 un service mal démarré.
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.
11. 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.
12. Vérifiez que le cluster est opérationnel
- Vérifiez que le cluster est vert/vert avec les services PostgreSQL exécutés sur le nœud PRIM et ne s'exécutant pas sur le nœud SECOND.
Seules les modifications à l'intérieur des fichiers sont répliquées en temps réel dans cet état.
Les composants qui sont clients des services PostgreSQL doivent être configurés avec l'adresse IP virtuelle. La configuration peut se faire avec un nom DNS (si un nom DNS a été créé et associé à l'adresse IP virtuelle).
13. 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).
- Et avec Microsoft Management Console (MMC) sous Windows ou avec des lignes de commande sous Linux, vérifiez le basculement des services PostgreSQL (arrêtés sur le nœud 1 dans le script
stop_prim
et démarrés sur le nœud 2 dans le scriptstart_prim
).
Si ALONE (vert) n’est pas atteint sur le nœud 2 ou si l'application 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 un service mal démarré.
Si tout va bien, lancez un démarrage du nœud 1, qui resynchronisera les répertoires répliqués depuis le nœud 2.
Si les choses vont mal, arrêtez le nœud 2 et forcez le démarrage en tant que primaire du nœud 1, qui redémarrera avec ses données localement saines au moment de l'arrêt.
14. 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.
15. 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 PostgreSQL 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 Windows postgresql.safe
userconfig.xml on Windows (description dans le guide de l'utilisateur)
<!DOCTYPE safe>
<safe>
<service mode="mirror" defaultprim="alone" maxloop="3" loop_interval="24" failover="on">
<!-- Heartbeat Configuration -->
<!-- Names or IP addresses on the default network are set during initialization in the console -->
<heart pulse="700" timeout="30000">
<heartbeat name="default" ident="flow">
</heartbeat>
</heart>
<!-- Virtual IP Configuration -->
<!-- Replace
* VIRTUAL_TO_BE_DEFINED by the name of your virtual server
-->
<vip>
<interface_list>
<interface check="on" arpreroute="on">
<real_interface>
<virtual_addr addr="VIRTUAL_TO_BE_DEFINED" where="one_side_alias" />
</real_interface>
</interface>
</interface_list>
</vip>
<!-- Software Error Detection Configuration -->
<errd polltimer="10">
<!-- PostgreSQL Server -->
<proc name="pg_ctl.exe" atleast="1" action="restart" class="prim" />
</errd>
<!-- File Replication Configuration -->
<!-- Replicate
* C:\Program Files\PostgreSQL\9.5\data\ default directory path of PostgreSQL database and redo log
-->
<rfs async="second" acl="off" nbrei="3">
<replicated dir="C:\Program Files\PostgreSQL\9.5\data\" mode="read_only" />
</rfs>
<!-- User scripts activation -->
<user nicestoptimeout="300" forcestoptimeout="300" logging="userlog" />
</service>
</safe>
start_prim.cmd on Windows
@echo off
rem Script called on the primary server for starting application services
rem For logging into SafeKit log use:
rem "%SAFE%\safekit" printi | printe "message"
rem stdout goes into Application log
echo "Running start_prim %*"
set res=0
net start postgresql-9.5 > nul
if not %errorlevel% == 0 (%SAFE%\safekit printi "PostgreSQL start failed")
else (%SAFE%\safekit printi "PostgreSQL started")
if %res% == 0 goto end
:stop
set res=%errorlevel%
"%SAFE%\safekit" printe "start_prim failed"
rem uncomment to stop SafeKit when critical
rem "%SAFE%\safekit" stop -i "start_prim"
:end
stop_prim.cmd on Windows
@echo off
rem Script called on the primary server for stopping application services
rem ----------------------------------------------------------
rem
rem 2 stop modes:
rem
rem - graceful stop
rem call standard application stop with net stop
rem
rem - force stop (%1=force)
rem kill application's processes
rem
rem ----------------------------------------------------------
rem For logging into SafeKit log use:
rem "%SAFE%\safekit" printi | printe "message"
rem stdout goes into Application log
echo "Running stop_prim %*"
set res=0
rem default: no action on forcestop
if "%1" == "force" goto end
net stop postgresql-9.5 > nul
%SAFE%\safekit printi "PostgreSQL stopped"
rem wait a little for a real stop of services
%SAFEBIN%\sleep 10
:end
Fichiers internes au module Linux postgresql.safe
userconfig.xml on Linux (description dans le guide de l'utilisateur)
<!DOCTYPE safe>
<safe>
<service mode="mirror" defaultprim="alone" maxloop="3" loop_interval="24" failover="on">
<!-- Heartbeat Configuration -->
<!-- Names or IP addresses on the default network are set during initialization in the console -->
<heart pulse="700" timeout="30000">
<heartbeat name="default" ident="flow">
</heartbeat>
</heart>
<!-- Virtual IP Configuration -->
<!-- Replace
* VIRTUAL_TO_BE_DEFINED by the name of your virtual server
-->
<vip>
<interface_list>
<interface check="on" arpreroute="on">
<real_interface>
<virtual_addr addr="VIRTUAL_TO_BE_DEFINED" where="one_side_alias" />
</real_interface>
</interface>
</interface_list>
</vip>
<!-- Software Error Detection Configuration -->
<errd polltimer="10">
<!-- PostgreSQL Server -->
<proc name="postgres" atleast="1" action="restart" class="prim" />
</errd>
<!-- File Replication Configuration -->
<!-- Replicate
* /usr/local/pgsql/data: default directory path of PostgreSQL database and redo log
-->
<rfs mountover="off" async="second" acl="off" nbrei="3">
<replicated dir="/usr/local/pgsql/data" mode="read_only" />
<replicated dir="/usr/local/pgsql/var" mode="read_only" />
</rfs>
<!-- User scripts activation -->
<user nicestoptimeout="300" forcestoptimeout="300" logging="userlog" />
</service>
</safe>
start_prim on Linux
#!/bin/sh
# Script called on the primary server for starting applications
# For logging into SafeKit log use:
# $SAFE/safekit printi | printe "message"
#---------- Clean PostgreSQL residual processes
# Call this function before starting any PostgreSQL databases
# to clean eventual resual PostgreSQL processes
clean_PostgreSQL()
{
retval=0
$SAFE/safekit printw "Cleaning PostgreSQL processes"
# kill started PostgreSQL processes
ps -e -o pid,comm | grep postgres | $AWK '{print "kill " $1}'| sh >/dev/null 2>&1
return $retval
}
#---------- PostgreSQL Databases
# Call this function for starting PostgreSQL Server
start_PostgreSQL()
{
retval=0
$SAFE/safekit printw "Starting PostgreSQL Server"
# PostgreSQL - Database Starting
service postgresql start
if [ $? -ne 0 ] ; then
$SAFE/safekit printw "PostgreSQL server start failed"
else
$SAFE/safekit printw "PostgreSQL server started"
fi
return $retval
}
# stdout goes into Application log
echo "Running start_prim $*"
res=0
[ -z "$OSNAME" ] && OSNAME=`uname -s`
OSNAME=`uname -s`
case "$OSNAME" in
Linux)
AWK=/bin/awk
;;
*)
AWK=/usr/bin/awk
;;
esac
# TODO
# remove PostgreSQL boot start
# Clean PostgreSQL residual processes
clean_PostgreSQL || res=$?
# Start PostgreSQL databases
start_PostgreSQL || res=$?
if [ $res -ne 0 ] ; then
$SAFE/safekit printi "start_prim failed"
# uncomment to stop SafeKit when critical
# $SAFE/safekit stop -i "start_prim"
fi
exit 0
stop_prim on Linux
#!/bin/sh
# Script called on the primary server for stopping application services
# 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
#
#----------------------------------------------------------
#---------- Clean PostgreSQL residual processes
# Call this function on force stop
# to clean eventual resual PostgreSQL processes
clean_PostgreSQL()
{
retval=0
$SAFE/safekit printw "Cleaning PostgreSQL processes "
# kill started PostgreSQL
ps -e -o pid,comm | grep postgres | $AWK '{print "kill -9 " $1}'| sh >/dev/null 2>&1
return $retval
}
#---------- PostgreSQL databases
# Call this function for stopping PostgreSQL databases
stop_PostgreSQL()
{
retval=0
if [ "$1" = "force" ] ; then
# PostgreSQL databases force stop
clean_PostgreSQL
return $retval
fi
# PostgreSQL databases gracefull stop
$SAFE/safekit printw "Stopping PostgreSQL server"
service postgresql stop
if [ $? -ne 0 ] ; then
$SAFE/safekit printw "PostgreSQL server stop failed"
else
$SAFE/safekit printw "PostgreSQL server stopped"
fi
return $retval
}
# stdout goes into Application log
echo "Running stop_prim $*"
res=0
[ -z "$OSNAME" ] && OSNAME=`uname -s`
case "$OSNAME" in
Linux)
AWK=/bin/awk
;;
*)
AWK=/usr/bin/awk
;;
esac
mode=
if [ "$1" = "force" ] ; then
mode=force
shift
fi
# Stop PostgreSQL server
stop_PostgreSQL $mode || res=$?
[ $res -ne 0 ] && $SAFE/safekit printi "stop_prim failed"
exit 0