Haute disponibilité PostgreSQL avec réplication synchrone et tolérance aux pannes

Evidian SafeKit apporte la haute disponibilité à PostgreSQL. Cet article explique comment implémenter rapidement un cluster PostgreSQL sans disque partagé et sans compétences spécifiques. Un essai gratuit est offert.

Comment le logiciel Evidian SafeKit met en œuvre simplement la haute disponibilité PostgreSQL avec réplication synchrone temps réel  et tolérance aux pannes sans disque partagé

Comment Evidian SafeKit met en œuvre la haute disponibilité PostgreSQL avec réplication temps réel et tolérance aux pannes

Sur la figure précédente, le serveur 1 / PRIM (Windows ou Linux) exécute PostgreSQL (n'importe quelle édition). Les utilisateurs sont connectés à l'adresse IP virtuelle du cluster miroir. SafeKit réplique les fichiers ouverts par PostgreSQL en temps réel. Seules les modifications apportées aux fichiers sont répliquées sur le réseau, limitant ainsi le trafic (réplication de fichiers au niveau octet). Les noms des répertoires de fichiers contenant la base de données PostgreSQL sont simplement configurés dans SafeKit. Il n'existe pas de pré-requis sur l'organisation des disques entre les deux serveurs. Les répertoires à répliquer peuvent se trouver dans le disque système. SafeKit met en œuvre une réplication synchrone sans perte de données en cas de panne, contrairement à une réplication asynchrone.

En cas de défaillance du serveur 1, il y a un basculement automatique sur le serveur 2 avec redémarrage de PostgreSQL. Ensuite, lorsque le serveur 1 est redémarré, SafeKit met en œuvre son retour dans le cluster avec la réintégration de la base de données PostgreSQL sans arrêter PostgreSQL sur le serveur 2. Enfin, le système retourne à la réplication synchrone entre le serveur 2 et le serveur 1. L'administrateur peut décider d'échanger le rôle du primaire et du secondaire pour revenir à un serveur 1 qui exécute PostgreSQL. Ce changement de rôle peut également être fait automatiquement par configuration.

Vue générale sur la configuration de la haute disponibilité PostgreSQL avec réplication synchrone et tolérance aux pannes

Avec SafeKit, on peut configurer soit un module applicatif ferme, soit un module applicatif miroir suivant l'architecture de haute disponibilité adaptée à l'application critique à sécuriser. Pour la haute disponibilité PostgreSQL avec réplication synchrone et tolérance aux pannes, le bon module est le module miroir.

Vue générale sur la configuration de la haute disponibilité PostgreSQL avec réplication et tolérance aux pannes

Les fichiers de configuration pour la haute disponibilité PostgreSQL sont donnés pour Windows ici et pour Linux ici.

Ils comprennent :

1. les scripts d'arrêt et de démarrage de PostgreSQL,

2. le fichier de configuration userconfig.xml qui contient :

Le déploiement de la haute disponibilité de PostgreSQL avec réplication synchrone et tolérance aux pannes ne nécessite aucune compétence informatique spécifique :

Fichiers de configuration SafeKit sur Windows pour la haute disponibilité PostgreSQL avec réplication synchrone et tolérance aux pannes

Instructions d'installation

userconfig.xml

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

@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

@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 de configuration SafeKit sur Linux pour la haute disponibilité PostgreSQL avec réplication et tolérance aux pannes

Instructions d'installation

userconfig.xml

<!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" />
  </rfs>
  <!-- User scripts activation -->
  <user nicestoptimeout="300" forcestoptimeout="300" logging="userlog" />
</service>
</safe>

start_prim

#!/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 
  /bin/su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data"  
  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

#!/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"  
  /bin/su - postgres -c "/usr/local/pgsql/bin/pg_ctl 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

Démonstration

Cette démonstration est réalisée avec Microsoft SQL Server Express mais le mode opératoire est le même que celui de PostgreSQL.

Plus d'information sur SafeKit

Autres exemples de modules de haute disponibilité :

Modules miroirs

Windows

Linux

Microsoft SQL Servermodule Windows-
Oraclemodule Windowsmodule Linux
MySQLmodule Windowsmodule Linux
PostgreSQLmodule Windowsmodule Linux
Firebirdmodule Windowsmodule Linux
Hyper-Vmodule Windows-
Milestone XProtect (basé sur Microsoft SQL Server)module Windows-
Hanwha SSM (basé sur PostgreSQL Server)module Windows-
Module génériquemodule Windowsmodule Linux

Modules fermes

Windows

Linux

Module IISmodule Windows-
Module Apachemodule Windowsmodule Linux
Module génériquemodule Windowsmodule Linux

contact
CONTACT
Démonstration

Evidian SafeKit Prix





Livres blancs

NEWS

Pour recevoir des informations d'Evidian, veuillez remplir le formulaire suivant.