Mysql failover sur Red Hat 6 avec DRBD et RGManager

plop, today, un rapide article sur un système de failover mysql sur RedHat.

NOTE
Si certaine commande avec des – ne fonctionne pas, c’est qu’il y en a deux – – (WordPress ne les aiment pas quand ils sont collés).
La configuration présenté ici se veut simplifié (l’article est encore en cours de rédaction, les tests de HA sont encore en cours et plutôt encourageant ^^).

BackGround
Pour mon alternance on m’a chargé de switcher le système de HA tournant sur RH5.5 depuis 2 ans avec HeartBeat/DRBD sur le nouveau système (qui existe depuis pas mal de temps, en fait ;)) fournit par RedHat6 pour le clustering : le RGManager, avec ses dépendances (dispo sur toutes les bonnes distro du moment).

Le but de cette manoeuvre est de permettre au service Mysql de rester accessible pour les machines du réseau en cas de crash du serveur (logiciel ou matériel) en partageant une IP et les disques contenant les données (répliqué par DRBD) du serveur Mysql.

L’utilisation et la configuration du cluter fournit par RedHat est trivial (limite choquant pour un sysadmin habitué à un florilège de fichier de configuration dans lesquels taper, ici seul /etc/cluster/cluster.conf est à toucher, bien évidement les services subissant le failover sont à configurer ;))

Les machines
cluster1 (192.168.1.225) sera à la fois serveur et node
cluster2 (192.168.1.224) sera seulement node
192.168.1.31 sera l’ip partagé entre les deux machines pour la mise à disposition du service Mysql

Lucy et Ricci

(J’ai désactivé selinux (setenforce 0) et iptables (service iptbles stop) pour l’install)

Pour le serveur administrant les clusters, on installe lucy qui permet d’administrer la config des clusters, ainsi que leurs lancements/reboot, …

yum install lucy
chkconfig lucy on
service lucy start

Pour les membres du clusters, installation de ricci du serveur mysql (puisque c’est lui qu’on veut partager) et leurs dépendances :

yum install ricci mysql-server
chkconfig ricci on
service ricci start
chkconfig cman on
chkconfig rgmanager on

Il faut set le password de ricci, pour configurer les nodes

passwd ricci

Une fois les nodes préparées et lucy installé et lancé, on peut se connecter via un browser à ipduserveurlucy:8084 et ajouter les nodes :

Puis commencer à configurer les services (c’est plutôt intuitif donc je zap cette partie) le résultat de la config XML est visible à la fin.

Compilation et installation de DRBD

Passage malheureusement obligatoire, car DRBD n’existe pas dans les dépôts RedHat, donc on install une machine virtuelle RH6 (ou bien directement sur la machine de prod si vous êtes un bourrin), avec les softs suivant :

yum install gcc flex make libxslt rpm-build redhat-rpm-config kernel-devel
cd /tmp
wget http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz
tar -xvf *.tar.gz
cd drbd-8.4.1
./configure --with-rgmanager --enable-spec --with-km
make tgz
cp drbd*.tar.gz /root/rpmbuild/SOURCES/
rpmbuild --bb drbd.spec --without xen --without heartbeat --without udev --without pacemaker --with rgmanager
rpmbuild --bb drbd-kernel.spec
rpmbuild --bb drbd-km.spec

Ce qui permet, si tout c’est bien passer de chopper les RPMs dans le dossier (/root/rpmbuild/RPMS/x86_64/) :
drbd-utils-8.4.1-1.el6.x86_64.rpm
drbd-bash-completion-8.4.1-1.el6.x86_64.rpm
drbd-rgmanager-8.4.1-1.el6.x86_64.rpm
drbd-8.4.1-1.el6.x86_64.rpm
drbd-km-2.6.32_220.2.1.el6.x86_64-8.4.1-1.el6.x86_64.rpm

De les uploader et installer sur les nodes du cluster.

rpm -i drbd-utils-8.4.1-1.el6.x86_64.rpm drbd-bash-completion-8.4.1-1.el6.x86_64.rpm drbd-8.4.1-1.el6.x86_64.rpm drbd-rgmanager-8.4.1-1.el6.x86_64.rpm drbd-km-2.6.32_220.2.1.el6.x86_64-8.4.1-1.el6.x86_64.rpm

Configuration de DRBD

Création du fichier /etc/drbd.d/r0.res, avec l’utilisation du port de drbd par défaut (7789) et la création de la device /dev/drbd0 sur chacune des machines, avec la réplication du disque /dev/sdb1 (qui contiendra le /var/lib/mysql)

resource r0 {
        device          /dev/drbd0;
        meta-disk       internal;
        on cluster {
                address         192.168.1.225:7789;
                disk            /dev/sdb1;
        }
        on cluster2 {
              address         192.168.1.224:7789;
               disk            /dev/sdb1;
       }
}

A exécuter sur les deux machines :

drbdadm create-md r0
modprobe drbd
drbdadm up r0

Passage en maitre sur l’une des deux machines pour créer le système de fichier

drbdadm -- --overwrite-data-of-peer primary r0
service drbd status

Qui devra retourner :

(Si il reste en Secondary/Secondary, y’a un soucis … :s).

Puis formatage de la partition (ça va tout supprimer … ), et copie du /var/lib/mysql courant sur la partition drbd

mkfs.ext3 /dev/drbd0
mkdir /tmp/mysqldata
mount /dev/drbd0 /tmp/mysqldata
cp -r /var/lib/mysql /tmp/mysqldata

On peut maintenant supprimer le /var/lib/mysql sur LES DEUX MACHINES

rm -rf /var/lib/mysql/*

Il faut maintenant configurer le failover du disque pour ensuite monter /dev/drbd0 dans /var/lib/mysql, fournir l’ip 192.168.1.31 puis démarrer le service mysql.

ATTENTION A NE PAS DEMARRER LES SERVICES AVANT LA SYNCHRO COMPLETE DES DISQUES

service drbd status

Une fois les disques synchro, redémarrer les services drbd, pour qu’il soit tout deux en secondary, et laisser le rgmanager s’occuper de faire switcher le master

Configuration du cluster

La configuration au format XML (la capture d’écran est beaucoup trop grande pour la version http) :



        
                
                
        
        
                
                        
                                
                                
                        
                
                
                        
                        
                
                
                        
                                
                        
                        
                        
                
        
        
        

Une fois la conf mise en place (si c’est en autostart, ça devrait partir tout seul), sinon :

clusvcadm -e "NOM du service"

Les astuces du LoupZeur
Pour ne pas subir d’interblocage du rgmanager avec fence (blocage complet du service, rgmanager renvoit dans les logs un joli « Waiting for CMAN to start »), je vous conseille vivement de rajouter le clean_start=1 pour le fence_daemon.

Dans l’interface Web : Preferences -> Enable « Expert » mode puis HomeBase -> « ClusterName » -> Configure -> Fence Daemon -> Clean Start

En cas d’interblocage : 2 solutions

cman_tool leave force

et si ça marche pas
modification de /etc/sysconfig/cman et mettre FENCE_JOIN à NO avec un beau

service cman restart

et rgmanager devrait se relancer.

bon HAing 😉

3 réflexions sur « Mysql failover sur Red Hat 6 avec DRBD et RGManager »

  1. I’ve followed your instructions but I can’t get rgmanager to start the service.

    DRBD stays in:Secondary/Secondary
    and on the rgmanager.log I get:

    [drbd] DRBD resource r0 is not configured

    [fs] start_filesystem: Could not match /dev/drdb0 with a real device

    However, I can start the services manually with:
    drbdadm primary r0
    mount /dev/drbd0 /var/lib/mysql/
    service mysql start

    Can you help me?

  2. Hi, is the driver enabled ? It seems that /dev/drbd0 doesn’t exist so may be the driver is not loaded or not configured to run with /dev/drbd0 …

    Check the device of the drbd resources

Les commentaires sont fermés.