Haute disponibilité [HA] : Mise en place d’un cluster LAMP avec DRBD-Heartbeat sur Linux Debian 7

Mise en place d’un cluster LAMP avec DRBD-Heartbeat sur Linux Debian afin de mettre en place un solution de haute disponibilité.

Publié le 03/11/2013

On va maintenant combiner les précédents tutoriels afin d’obtenir un solution complète de haute disponibilité avec heartbeat pour la bascule automatique et DRBD pour la réplication des nos partions « www/data ».

1 - Préparation des VM Debian

Pour la réalisation de maquettes, j’utilise un serveur Linux CentOS 5.3 avec KVM comme hyperviseur. Je prendrai donc cet environnement à titre d’exemple.

On va créer 2 machines virtuelles avec KVM de type Linux Debian 7 avec les paquets : apache2, php-5, mysql-server, drbd8-utils et heartbeat.

Elles auront chacune les spécificités suivantes :

Machine 1 :

IP : 192.168.0.113
hostname : gg-front
Un second disque de type virtIO de 2 Go

Un fichier host avec le nom de la machine 2 associé à son IP :

su nano /etc/hosts 

Avec le contenu suivant :


127.0.0.1       localhost
127.0.0.1       gg-front
192.168.0.115   fresh-front

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Machine 2 :

IP : 192.168.0.115
hostname : fresh-front
Un second disque de type virtIO de 2 Go

Un fichier host avec le nom de la machine 2 associé à son IP :

su nano /etc/hosts 

Avec le contenu suivant :


127.0.0.1       localhost
127.0.0.1       fresh-front
192.168.0.113   gg-front

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

2 - Préparation des partitions

Sur chacune des machines, nous allons préparer la partition de stockage pour DRBD :

su fdisk /dev/vdb 

A l’invite de commande de fdisk rentrer les commandes suivantes :

Commande (m pour l'aide): n
Type de partition :
p primaire (0 primaire(s), 0 étendue(s), 4 libre(s))
e étendue
Sélection (p par défaut) : p
Numéro de partition (1-4, par défaut 1): 1
Premier secteur (2048-2097151, par défaut 2048):
Utilisation de la valeur par défaut 2048
Dernier secteur, +secteurs or +taille{K,M,G} (2048-2097151, par défaut 2097151):
Utilisation de la valeur par défaut 2097151

Commande (m pour l'aide): w
La table de partitions a été altérée.

Appel de ioctl() pour relire la table de partitions.
Synchronisation des disques.

3 - Installation et paramétrage d’Apache, PHP, MySQL et git

Sur chacune des VM, nous allons installer apache, php, mysql et git :


apt-get install apache2 apt-get install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl apt-get install mysqlserver apt-get install git
a2enmod rewrite

Puis configurer un vhost pour chacune d’entre elle.

Machine 1 :

nano /etc/apache2/sites-available/gg 

Contenu :


<VirtualHost *:80>
        ServerName gg-front
        ServerAdmin admin@domaine.tld

        DocumentRoot /mnt/srv/www/monsite
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /mnt/srv/www/monsite/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Machine 2 :

nano /etc/apache2/sites-available/fresh 

Contenu :


    <VirtualHost *:80>
        ServerName fresh-front
        ServerAdmin admin@domaine.tld

        DocumentRoot /mnt/srv/www/monsite
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /mnt/srv/www/monsite/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Pour l’instant, le repertoire public où est stocké le site n’est pas encore disponible, donc on ne va pas activer nos vhost maintenant.

4 - Installation et paramétrage de DRBD

Sur chacune des VM, nous allons installer le paquet drbd8-utils :

apt-get install drbd8-utils 

Ensuite on active le module drbd :

modprobe drbd 

On vérifie ensuite la version installée :

modinfo drbd 

Configuration de la réplication entre les deux disques de chaque VM :

On va créer sur chaque VM un fichier de configuration drbd-config.res :

nano /etc/drbd.d/drbd-config.res 

Qui contiendra les informations suivantes :

resource srv {
   syncer {
      rate 100M;
   }


        on gg-front {
                device /dev/drbd0;
                disk /dev/vdb;
                address 192.168.0.115:7788;
                meta-disk internal;
        }
        on fresh-front {
                device /dev/drbd0;
                disk /dev/vdb;
                address 192.168.0.113:7788;
                meta-disk internal;
        }
}

Ce fichier contient la description de notre ressource drbd « srv ».

On va maintenant initialiser la ressource sur chacune des VM :

drbdadm create-md srv drbdadm up srv 

On vérifie que les noeuds communiquent entre eux :

drbd-overview 

A chaque étape de notre installation, on pourra consulter le statut de la ressource drbd avec la commande : drbd-overview.

Promotion de la machine 1 en tant que noeud primaire :

drbdadm -- --overwrite-data-of-peer primary srv 

Promotion de la machine 2 en tant que noeud secondaire :

drbdadm secondary srv 

La synchronisation initiale va alors se dérouler, on pourra consulter son avancement via la commande : cat /proc/drbd.

Une fois la synchronisation terminée, nous obtiendrons le résultat suivant après avoir lancé la commande cat /proc/drbd :

version: 8.3.11 (api:88/proto:86-96) srcversion: F937DCB2E5D83C6CCE4A6C9 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:1048508 nr:0 dw:0 dr:1049172 al:0 bm:64 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 

Création d’un système de fichier virtuel pour drbd et montage de la partition sur le noeud primaire (actif) :


mkfs.ext4 /dev/drbd0
mkdir /mnt/srv
mount /dev/drbd0 /mnt/srv/

On va maintenant pouvoir créer sur la machine 1, le repertoire www qui contiendra notre site :


mkdir /mnt/srv/www
git clone user@votreserveur:/path-to-repo

5 - Paramétrage de MySQL

Sur chacune de nos machine on va copier le répertoire data de MySQL vers la partition drbd :


cp -r /var/lib/mysql /mnt/srv/
chmod -R 777 /mnt/srv/mysql/

Edition du fichier de configuration de MySQL pour indiquer où se trouve le nouveau repertoire data :

nano /etc/mysql/my.cnf 

Remplacer la ligne suivante :

datadir = /mnt/srv/mysql 

Redémarrer MySQL sur la machine 1 :

service mysql restart 

Création d’une base pour notre application :

mysql -u root -p CREATE DATABASE monsite DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; exit 

Si on veux restaurer une base d’un site existant, on pourra le faire à ce moment.

Une fois notre base de données créer on va paramétrer les fichier de config de notre application et définir l’accès à notre base de données (selon le type de cms - framework mis en place).

A ce moment on va aller vérifier que notre application est bien disponible en allant à l’url suivante :

http://gg-front

On va maintenant basculer les noeuds drbd de façon constater la même chose sur la machine 2 :

Machine 1 :


cd /
service mysql stop
service apache2 stop
umount /mnt/srv
drbdadm secondary srv 

Machine 2 :


cd /
service mysql stop
service apache2 stop
drbdadm primary
srv mount /dev/drbd0 /mnt/srv

Sur la machine 2, on va éditer la configuration de MySQL pour lui indiquer le nouveau répertoire data :

nano /etc/mysql/my.cnf 

Remplacer la ligne suivante : datadir = /mnt/srv/mysql

Démarrage d’Apache et MySQL sur la machine 2 :


service mysql start
service apache2 start

6 - Installation d’Heartbeat

Installation du paquet heartbeat sur chacune de nos vm :

apt-get install heartbeat 

On va modifier les vhost de nos deux machines de façon à ce que les deux serveurs répondent à la même IP virtuelle :

Machine 1 :

nano /etc/apache2/sites-available/gg 

Contenu :


<VirtualHost 192.168.0.111:80>
        ServerName gg-cluster
        ServerAdmin admin@domaine.tld

        DocumentRoot /mnt/srv/www/monsite
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /mnt/srv/www/monsite/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Machine 2 :

nano /etc/apache2/sites-available/fresh 

Contenu :


<VirtualHost 192.168.0.111:80>
        ServerName gg-cluster
        ServerAdmin admin@domaine.tld

        DocumentRoot /mnt/srv/www/monsite
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /mnt/srv/www/monsite/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Redémarrer Apache sur la machine 1 : service apache2 restart

6 - Paramétrage d’Heartbeat

Sur la machine 1, nous allons créer les fichiers de configuration d’Heartbeat :

nano /etc/ha.d/ha.cf 

Et y ajouter le contenu suivant :

logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
initdead 120
bcast eth0
udpport 694
auto_failback on
node gg-front
node fresh-front

Création du fichier haresources :

nano /etc/ha.d/haresources 

Et y ajouter le contenu suivant :

gg-front IPaddr::192.168.0.111/24/eth0:0 drbddisk::srv Filesystem::/dev/drbd0::/mnt/srv::ext4 apache2 

Création du fichier authkeys :

nano /etc/ha.d/authkeys 

Et y ajouter le contenu suivant :

auth 2
2 sha1 test-ha 

Paramétrage des droits sur le fichier authkeys :

chmod 600 authkeys 

Copie des fichiers de configurations heartbeat sur la machine fresh-front :

scp /etc/ha.d/authkeys root@192.168.0.113:/etc/ha.d/authkeys
scp /etc/ha.d/ha.cf root@192.168.0.113:/etc/ha.d/ha.cf
scp /etc/ha.d/haresources root@192.168.0.113:/etc/ha.d/haresources 

7 - Démarage des services et test

Nous allons démarrer les serveurs sur chacune des machines :



service heartbeat start 

On va pouvoir tester notre cluster en appelant le site redondé via l’IP virtuelle 192.168.0.111 dans notre navigateur.

On va arrêter le serveur gg-front et constater la bascule en rechargeant la page dans le navigateur par l’affichage du index.html qui diffère sur chacune d’entre elles.

Source :