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 :