Avr 18 2007
Auto-failover Mysql avec Heartbeat
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.
- 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).
Bonjour,
Pourquoi vouloir stopper mysqld (dans haresources) ? les deux serveurs etant en master/slave je n’e comprend pas l’utilite ?