Publié le: 2013-05-11

Apache FreeBSD DragonFlyBSD cluster

Nous allons étudier dans cet article un type d’architecture redondée pour vos serveurs Web Apache. Dans ce type d’architecture, les bases de données sont dissociées du modèle, et ne seront pas étudiées ici. De même nous ne configurerons ni Apache ni le Wordpress de test qui seront installés, d’autres articles seront référencés.

Cluster de données

Dans un premier temps nous allons installer le cluster de données. Nous nous basons sur DragonFlyBSD pour son très bon système de fichiers (HAMMER), qui offre d’excellentes performances avec NFS (limité à la version 3).

Installation de DragonFlyBSD

Les serveurs qui serviront de cluster de données NFS seront installés de manière classique. Il faut 2 raids sur la machine, un raid système (raid 1) et un raid pour les données (raid 5 ou raid 10 par exemple). Lors de l’installation ne configurez que le raid système (da0)

Pour l’installation de DragonFlyBSD, utilisez cet article.

Configuration des volumes de données

DragonFlyBSD étant installé, on va maintenant procéder à la création des volumes de données Hammer. Dans un premier temps on créée un volume Hammer sur notre raid 5 et on le monte

newfs_hammer -L webdatas /dev/da1
mkdir /nfs
mount -t hammer /dev/da1 /nfs

Maintenant on va configurer les PFS (volumes virtuels qui serviront à la réplication Hammer) et les monter. Nous avons besoin de 3 volumes qui correspondront aux répertoires /usr/local, /usr/ports/distfiles et /var/db/pkg sur les serveurs web. Exécutez cet ensemble de commande sur le serveur NFS maître.

mkdir /nfs/pfs/
mkdir /nfs/fsbd_fs/
hammer pfs-master /nfs/pfs/fbsd_fs
mount_null /nfs/pfs/fbsd_fs /nfs/fbsd_fs
mkdir /nfs/fbsd_fs
hammer pfs-master /nfs/pfs/fbsd_distfiles
mount_null /nfs/pfs/fbsd_distfiles /nfs/fbsd_distfiles
mkdir /nfs/fbsd_pkg
hammer pfs-master /nfs/pfs/fbsd_pkg
mount_null /nfs/pfs/fbsd_pkg /nfs/fbsd_pkg

Notez bien les shared-uuid lors de la création de chaque PFS, vous allez en avoir besoin tout de suite. Sur le slave, configurez les PFS, en remplacant xxx,yyy et zzz par les shared-uuid équivalent au maître.

mkdir /nfs/pfs/
mkdir /nfs/fsbd_fs/
hammer pfs-slave /nfs/pfs/fbsd_fs shared-uuid=xxx
mkdir /nfs/fbsd_fs
hammer pfs-slave /nfs/pfs/fbsd_distfiles shared-uuid=yyy
mkdir /nfs/fbsd_pkg
hammer pfs-slave /nfs/pfs/fbsd_pkg shared-uuid=zzz

Vous noterez que les pfs-slave ne sont pas montés. Effectivement, on ne peut pas les monter, la réplication se fait à froid.

Pour finir on rajoute les lignes qui vont bien dans le fichier /etc/fstab

## Cluster
/dev/da1        /nfs            hammer    rw    0    0
/nfs/pfs/fbsd_fs        /nfs/fbsd_fs        null    rw    0    0
/nfs/pfs/fbsd_distfiles    /nfs/fbsd_distfiles    null    rw    0    0
/nfs/pfs/fbsd_pkg    /nfs/fbsd_pkg    null    rw    0    0

Note: attention, il faut absolument monter tous les disques physiques avant de monter les PFS

Configuration de NFS

Configurons le serveur NFS. Ouvrez le fichier /etc/exports. Remplacez l’adresse réseau par celle de vos serveurs web. Il est également possible de spécifier des hôtes.

/nfs/fbsd_fs -maproot=root -network=192.168.1.0 -mask 255.255.255.0
/nfs/fbsd_distfiles -maproot=root -network=192.168.1.0 -mask 255.255.255.0
/nfs/fbsd_pkg -maproot=root -network=192.168.1.0 -mask 255.255.255.0

On va activer les services, ouvrez le fichier /etc/rc.conf et ajoutez les lignes suivantes.

nfs_server_enable="YES"
mountd_enable="YES"
mountd_flags="-r"
rpcbind_enable="YES"
nfsd_flags="-n 16"

Les arguments passés à nfsd permettent de multiplier le nombre de processus en parallèle.

Vous pouvez maintenant démarrer les services

/etc/rc.d/rpcbind start
/etc/rc.d/mountd start
/etc/rc.d/nfsd start

On va maintenant configurer la réplication. Il est possible de configurer la méthode en pull ou en push. Nous préfèrerons ici une réplication en push, le maître pousse vers l’esclave. Exécutez l’ensemble de commandes suivantes:

hammer mirror-stream /nfs/pfs/fbsd_fs root@192.168.1.1:/nfs/pfs/fbsd_fs &
hammer mirror-stream /nfs/pfs/fbsd_distfiles root@192.168.1.1:/nfs/pfs/fbsd_distfiles &
hammer mirror-stream /nfs/pfs/fbsd_pkg root@192.168.1.1:/nfs/pfs/fbsd_pkg &

Afin de gagner en flexibilité, vous pouvez les ajouter au fichier /etc/rc.local afin qu’elles soient exécutées à chaque démarrage.

Votre serveur NFS est prêt.

Serveurs Web

Installation de FreeBSD

Je vous invite à lire cet article concernant l’installation de FreeBSD. Extrayez ensuite l’arbre des ports.

portsnap fetch extract

Montage des volumes NFS

On va maintenant monter les volumes NFS nécessaires à notre cluster. Tout d’abord activons les services NFS nécessaires. Ouvrez le fichier /etc/rc.conf

nfs_client_enable="YES"
rpcbind_enable="YES"

On active ensuite les services

service nfsclient start
service rpcbind start

Sur chacun des serveurs web tapez la commande suivante afin de monter les volumes

mount_nfs -o tcp,nolockd,rw 192.168.1.1:/nfs/fbsd_web /usr/local/
mount_nfs -o tcp,nolockd,rw 192.168.1.1/nfs/fbsd_pkg /var/db/pkg/
mount_nfs -o tcp,nolockd,rw 192.168.1.1:/nfs/fbsd_distfiles /usr/ports/distfiles/

Enfin on rend ce montage permanent en ajoutant les entrées associées au fichier /etc/fstab

## NFS mount
10.117.100.65:/nfs/fbsd_web            /usr/local        nfs    rw,tcp,nolockd    0    0
10.117.100.65:/nfs/fbsd_distfiles    /usr/ports/distfiles    nfs    rw,tcp,nolockd    0    0
10.117.100.65:/nfs/fbsd_pkg    /var/db/pkg    nfs    rw,tcp,nolockd    0    0

Vous remarquerez qu’on utilise l’option TCP. Celle-ci permet de garder une connexion persistante au serveur NFS, et offre une amélioration de performances non négligeable par rapport à UDP. En UDP, beaucoup plus de requêtes RPC sont transmises, ce qui augmente la charge réseau et CPU.

Vous remarquez qu’on désactive lockd. Ceci est dû au fait que nous hébergeons uniquement des données “statiques”. Dans le cas d’une base de données il faut impérativement activer le service lockd et statd.

Installation des ports

Maintenant que nos serveurs web sont prêts, passons à l’installation des ports. Ici nous installerons rapidement le serveur web et PHP, je vous convie à lire cet article pour configurer Apache et PHP correctement sous FreeBSD.

Voici quelques commandes afin d’installer rapidement les paquets.

cd /usr/ports/www/apache22
make install clean
cd /usr/ports/lang/php5
make install clean
cd /usr/ports/www/wordpress
make install clean

Je vous conseille de garder les options par défaut pour chacun des softs, hormis si vous avez des besoins spécifiques. Les compilations devraient prendre environ une journée travaillée sur un CPU à 1 seul coeur, n’hésitez pas à faire autre chose en attendant.

A chaque fois qu’un port est configuré/installé vous devriez voir les fichiers mis à jour sur le second serveur web, ainsi que sur le serveur NFS et augmenter la taille du volume sur le serveur NFS réplica.

Ajoutez la ligne suivante afin d’activer le démarrage d’Apache

apache22_enable="YES"

Configuration du démarrage des services

Si vous redémarrez vous vous rendrez compte que, malgré la ligne précédente le service Apache ne se lance pas au démarrage. Ceci est dû au montage NFS lors du démarrage. En effet à ce moment les binaires Apache ne sont pas dans le PATH. Nous allons donc ruser en allumant Apache “à la main”.

Ouvrez le fichier /etc/rc.local et ajoutez la ligne suivante sur chacun des serveurs web

service apache22 start

Vous pouvez redémarrer pour tester. Votre cluster web est désormais prêt.

Vous pouvez mettre autant de machines FreeBSD que désiré sur ces volumes NFS. Il vous suffira simplement d’installer FreeBSD, monter les volumes et faire cette dernière manipulation.

Cette fonction de distribution de la partie utilisateur ne marche que sur FreeBSD qui met l’ensemble de ses softs dans /usr/local lors de l’utilisation des ports, et permet ainsi d’obtenir une scalabilité du nombre de machines dépendant uniquement du serveur NFS.

Sur un serveur NFS herbergé sur un Dell R510 vous devriez pouvoir mettre sans problème une trentaine de serveurs Web FreeBSD en parallèle, si ce n’est plus. Il suffira simplement d’augmenter le nombre de processus nfsd (nfsd_flags, 3 par machine)