Avr 18 2007

Auto-failover Mysql avec Heartbeat

Publié par à 12:00 sous Mysql




Note importante:
Heartbeat est maintenant obsolète et a migré vers une nouvelle stack disponible sur Clusterlabs. Pour un projet de haute disponibilité simple utilisant une IP virtuelle, essayez keepalived qui fait la surveillance et la bascule juste avec un simple fichier de configuration.

Quand un serveur Mysql contient des données critiques, c’est toujours une bonne idée de les stocker sur plusieurs serveurs.
Implémenter un cluster serait idéal dans ce genre de situation et pourrait offrir de la haute disponibilité.
Cela donne la possibilité de remplacer un noeud s’il tombe, sans interruption de service ou même de perte de données.
Le fait est que ça devient beaucoup moins intéressant financièrement considérant qu’un minimum de 4 machines est requis, et beaucoup de temps aussi.
Un serveur de réplication est bien plus rapide mais de petits changements seront nécessaires pour basculer le trafic du master vers l’esclave. Cet article donne l’abilité de basculer le trafic automatiquement.

Setup Initial

Nous estimons que nous avons un serveur en production avec l’adresse IP 192.168.0.2
Après modification, le serveur prendra l’IP 192.168.0.4
L’esclave sera ajouté avec l’IP 192.168.0.5
192.168.0.2 devient l’IP virtuelle du « cluster ». Les changements sont transparents pour les programmes se connectant aux bases de données. Ils utiliseront toujours l’IP originelle 192.168.0.2.

Failover
  • La réplication de Mysql doit être implementée avec les paramètres suivants:
    Master 192.168.0.2
    Slave 192.168.0.5
    Le master garde son IP originale – pour l’instant – donc toutes les applications se connectent toujours à la même machine.
    Commencez par ce tutorial sur la réplication ici.
  • Mise à jour des firewalls
    Appliquez les même règles sur le slave que sur le master, c’est-à-dire 192.168.0.5 identique à 192.168.0.2. Chaque programme pourra se connecter au slave si nécessaire.
    Cette méthode pourra être utilisée pour implémenter du load-balancing d’une manière facile et rapide.
    Autorisez tout type de trafic entre le master et le slave. Ceci est important pour que Heartbeat et Mon fonctionnent, ainsi que le protocole de réplication Mysql.
  • Désactivation de Selinux sur les 2 machines
    Cela crée des problèmes avec heartbeat
    Dans /etc/selinux/config, réalisez la modification « SELINUX=disabled »
    Les changements nécessitent un redémarrage du serveur malheureusement pour être appliqués

Heartbeat

Téléchargez et installez heartbeat depuis le site du projet haute disponibilité Linux à http://www.linux-ha.org/Heartbeat.
Des RPMs sont disponibles pour Fedora Core.
sudo yum install heartbeat

Les fichiers de configuration sont localisés dans /etc/ha.d/. Vous devez créer ces 3 fichiers sur les 2 serveurs:

cat > /etc/ha.d/authkeys

auth 1
1 crc

Donnez les droits appropriés au fichier
chmod 600 /etc/ha.d/authkeys

cat > /etc/ha.d/haresources

master 192.168.0.2 mysqld mon

haresources doit contenir l’IP virtuelle.

cat > /etc/ha.d/ha.cf

logfile /var/log/ha-log
keepalive 2
# le délai avant de déclarer qu'un noeud est mort
deadtime 10
# c'est le temps avant qu'heartbeat ne démarre les ressources la première fois qu'il se lance: mon,mysql...
initdead 20
bcast eth0
node master.mydomain.com
node slave.mydomain.com
# Mettez cette valeur à "on" seulement si vous êtes dans un setup multi-master
auto_failback off
# Nous allons pinger la passerelle pour vérifier la connectivité réseau
ping 192.168.0.1
respawn hacluster /usr/lib64/heartbeat/ipfail

Note Les noeuds doivent correspondre littéralement à la commande `uname -n`. C’est très important ou heartbeat ne fonctionnera pas.

Note Le fichier /etc/hosts sur les DEUX machines doit contenir les entrées pour les 2 hôtes
192.168.0.4 master.mydomain.com
192.168.0.5 slave.mydomain.com

Note /usr/lib64/heartbeat/ipfail is for a 64 bit-architecture. Remove ’64’ if you’re on a 32.

Mon

Téléchargez MON
cd /usr/local/src
wget ftp://ftp.kernel.org/pub/software/admin/mon/mon-0.99.2.tar.gz

Vérifiez si une nouvelle version est disponible sur http://www.kernel.org/software/mon/. 0.99.2 était la version stable la plus récente la dernière fois que nous avons regardé.

Décompressez la tarball et déplacez-la dans /usr/local ou votre location habituelle
tar xvfz mon-0.99.2.tar.gz
mv mon-0.99.2 /usr/local/mon

Copiez le répertoire de configuration dans /etc
mv /usr/local/mon/etc /etc/mon

Installez Perl et les modules requis par Mon

- DBI
- DBD::mysql
- Time::Period
- Time::HiRes
- Convert::BER
- Mon::Client

Les modules peuvent être trouvés sur le site CPAN à l’adresse http://www.perl.com/CPAN/modules/index.html.
Téléchargez et installez les packages appropriés en suivant les instructions données dans le fichier INSTALL. Habituellement:
gunzip <module>.tar.gz
tar -xvf <module>.tar
cd <module-dir>
perl Makefile.pl
make
make test
make install

ou via
perl -MCPAN -e shell
et exécutez
install <module>

Note Soyez sûr que les librairies Mysql sont bien dans le path avant d’installer DBD::mysql.

Créez le fichier de configuration MON
cat > mon.cf

alertdir   = /usr/local/mon/alert.d
mondir     = /usr/local/mon/mon.d
statedir   = /usr/local/mon/state.d
maxprocs    = 20
histlength = 100
randstart = 60s
# IP virtuelle
hostgroup mysql_servers 192.168.0.2
watch mysql_servers
  mysql
    ## Mon va faire un test sur le port Mysql toutes les 60 secondes
    interval 1m
    monitor mysql.monitor
    period wd {Mon-Sun}
      alert bring-ha-down.alert
      alert mail.alert -S "Host1 MYSQL est tombé" admin@example.com
      upalert mail.alert -S "Host1 MYSQL le serveur est en ligne" admin@example.com
      alertevery 600s
      ## Envoie une alerte après 3 tentatives sans succès
      ## c'est-à-dire 2mn
      alertafter 3

Créez un script pour arréter heartbeat si le service Mysql ne répond plus
cat > /usr/local/mon/alert.d/bring-ha-down.alert

/etc/rc.d/init.d/heartbeat stop

Changez le nom du script pour activater le mode mysql par défaut
cd mon.d
mv msql-mysql.monitor mysql.monitor

Créez un utilisateur autorisé à accéder à la base de données test

mysql> GRANT ALL PRIVILEGES ON test.* TO alive@'%' IDENTIFIED BY 'mypassword';

Editez mysql.server avec la valeur souhaitée et ajoutez une ligne pour se connecter à la base ‘test’
$options{database} ||= « test »;
Cette option était manquante dans mon fichier de configuration par défaut.

Créez un script de démarrage pour Mon. Voici un exemple:
cat > /etc/rc.d/init.d/mon

#!/bin/bash
MON_HOME=/usr/local/mon
case "$1" in
  start)
    if [ -f $MON_HOME/mon.pid ]; then
      echo "mon already started"
      exit
    fi
    echo "Starting Mon"
    $MON_HOME/mon -c $MON_HOME/mon.cf -L $MON_HOME -P $MON_HOME/mon.pid &
    ;;
  stop)
    if [ -f $MON_HOME/mon.pid ]; then
      echo "Stopping Mon"
      kill -9 `cat $MON_HOME/mon.pid`
      rm  -f $MON_HOME/mon.pid
    else
      echo "no server pid, server doesn't seem to run"
    fi
    ;;
  *)
  echo "Usage: $0 {start|stop|status|reload|restart}"
  exit 1
esac
exit 0

Rendez-le exécutable
chmod 755 /etc/rc.d/init.d/mon

Démarrage des applications

Soyez sûr que Mysql tourne sur les 2 machines et que la réplication est à jour avant de continuer.

Changez l’adresse IP du Master pour 192.168.0.4 dans les fichiers de configuration et redémarrez les 2 serveurs (le master en premier).

Démarrez Mysql et Heartbeat sur le master
/etc/rc.d/init/mysqld start
/etc/rc.d/init.d/heartbeat start

# Vous pouvez vérifier les logs hearbeat dans /var/log/ha-log
L’IP virtuelle doit être assignée à eth0:0 après quelques secondes.

Cela peut Être vérifié avec `ifconfig`

eth0:0    Link encap:Ethernet  HWaddr 00:13:72:5D:1D:1F
        inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        Base address:0xdcc0 Memory:fe6e0000-fe700000

Si vous avez des problèmes, vérifiez aussi les messages pour Mon dans /var/log/messages.
Faîtes la même chose sur l’esclave.

Vous pouvez maintenant mettre la machine hors tension, déconnecter le câble ou éteindre Mysql; L’adresse IP virtuelle va migrer vers le second serveur après 2mn (Ce temps peut être réduit dans mon.cf (1mn et 3 checks).
C’est mieux de laisser du temps au cas où Mysql devient injoignable pour une courte période de temps quand il y a des pics de trafic.

Du load-balancing basique est maintenant possible en redirigeant toutes les commandes de lecture vers le slave (192.168.0.5), en laissant les opérations d’écriture pour le master.
Vous devez surveiller que le slave est toujours présent au cas où parce que le failover ne s’appliquera pas pour les lectures dans ce cas (l’adresse réelle du slave étant utilisée).


One response so far

Une Réponse à “Auto-failover Mysql avec Heartbeat”

  1. PsyGNUxon 22 Mar 2013 at 9:14

    Bonjour,

    Pourquoi vouloir stopper mysqld (dans haresources) ? les deux serveurs etant en master/slave je n’e comprend pas l’utilite ?

Comments RSS

Leave a Reply