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

Evidian SafeKit apporte la haute disponibilité à MySQL. Cet article explique comment implémenter rapidement un cluster MySQL 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é MySQL avec réplication synchrone temps réel  et tolérance aux pannes sans disque partagé

Comment Evidian SafeKit met en œuvre la haute disponibilité MySQL 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 MySQL (n'importe quelle édition). Les utilisateurs sont connectés à l'adresse IP virtuelle du cluster miroir. SafeKit réplique les fichiers ouverts par MySQL 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 MySQL 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 MySQL. 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 MySQL sans arrêter MySQL 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 MySQL. Ce changement de rôle peut également être fait automatiquement par configuration.

Vue générale sur la configuration de la haute disponibilité MySQL 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é MySQL 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é MySQL avec réplication et tolérance aux pannes

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

Ils comprennent :

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

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

Le déploiement de la haute disponibilité de MySQL 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é MySQL 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">
    <!-- MySQL Server -->
    <proc name="mysqld.exe" atleast="1" action="restart" class="prim" />
  </errd>
  <!-- File Replication Configuration -->
  <!-- 
     * C:\ProgramData\MySQL\MySQL Server 5.7: default directory containing MySQL database and logs
  -->
  <rfs async="second" acl="off" nbrei="3">
	<replicated dir="C:\ProgramData\MySQL\MySQL Server 5.7" 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 mysql > nul
if not %errorlevel% == 0 (
  %SAFE%\safekit printi "MySQL start failed"
) else (
  %SAFE%\safekit printi "MySQL 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

%SAFE%\safekit printi "Stopping MySQL..."
net stop mysql > nul

rem wait a little for a real stop of services
%SAFEBIN%\sleep 10

:end

Fichiers de configuration SafeKit sur Linux pour la haute disponibilité MySQL 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">
    <!-- MySQL Server -->
    <proc name="mysqld" atleast="1" action="restart" class="prim" />
  </errd>
  <!-- File Replication Configuration -->
  <!--
     * /var/lib/mysql: default directory of MySQL database and logs
  -->
  <rfs mountover="off" async="second" acl="off" nbrei="3">
	<replicated dir="/var/lib/mysql" 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 MYSQL residual processes 
# Call this function before starting any MySQL databases 
# to clean eventual resual MySQL processes
clean_mysql()
{
  retval=0

  $SAFE/safekit printw "Cleaning MySQL processes"

  # kill started MySQL processes
  ps -e -o pid,comm | grep mysql | $AWK '{print "kill " $1}'| sh >/dev/null 2>&1

  return $retval
}

#---------- MySQL Databases
# Call this function for starting MySQL Server
start_MySQL()
{
  retval=0

  $SAFE/safekit printw "Starting MySQL Server"

  # MySQL - Database Starting 
  service mysqld start   
  if [ $? -ne 0 ] ; then 
    $SAFE/safekit printw "MySQL server start failed"
  else
    $SAFE/safekit printw "MySQL 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 MySQL boot start 

# Clean MySQL residual processes 
clean_mysql || res=$?

# Start MySQL databases
start_MySQL || 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 MySQL residual processes
# Call this function on force stop 
# to clean eventual resual MySQL processes 
clean_mysql()
{
  retval=0

  $SAFE/safekit printw "Cleaning MySQL processes "

  # kill started MySQL 
  ps -e -o pid,comm | grep mysql | $AWK '{print "kill -9 " $1}'| sh >/dev/null 2>&1

  return $retval
}

#---------- MySQL databases
# Call this function for stopping MySQL databases
stop_MySQL()
{
  retval=0

  if [ "$1" = "force" ] ; then
    # MySQL databases force stop
    clean_mysql
    return $retval
  fi

  # MySQL databases graceful stop
  $SAFE/safekit printw "Stopping MySQL server"  
  service mysqld stop
  if [ $? -ne 0 ] ; then 
    $SAFE/safekit printw "MySQL server stop failed"
  else
    $SAFE/safekit printw "MySQL 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 MySQL  server 
stop_MySQL $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 MySQL.

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.