[Summer Camp] Etape 2 – Serveur de Fichiers NFS + ZFS

19 August 2011 | par | tuto, unix

Aug
19

static

Dans le post précédent du Summer Camp, nous avons vu comment monter les frontaux web. Aujourd’hui, nous allons voir comment mettre en place le serveur de fichier. Mais avant de commencer, pourquoi mettons nous en place des serveurs de fichiers ? Pourquoi le frontal ne porte-t-il pas la donnée directement.

La réponse est simple : un frontal est une machine “jetable”. Elle a pour but d’être déployée rapidement et simplement. Si un frontal porte 250Go de données, il sera lent à répliquer et gourmand en espace disque. Sans compter les problèmes de réplications de données entre les frontaux. Pour répondre à tout cela, nous allons mettre en place un serveur de fichier avec un partage réseau NFS qui sera monté sur les frontaux. Le système de fichier utilisé sera ZFS sous FreeBSD. En effet il offre des possibilités de réplication et de sauvegarde très interessantes, mais là n’est pas l’objet du billet, nous y reviendrons.

Prérequis :

  • 4vCPU
  • 1024Mo de RAM
  • Un disque (j’utilise des VMDK) 8Go pour le système
  • Un disque de XGo pour la data (en fonction du besoin…)
  • 1 carte réseau sur le VLAN Backend

L’OS qui portera ce beau monde est : FreeBSD 8.2 x64. Le ZFS y est natif, le NFS supporté et al robustesse du système n’est plus à prouver : que du bonheur. Dans une version optimisée à venire de la plateforme, je ferai la même chose, mais sous Solaris.

Partitionment ZFS :

Nous allons donc crée notre partiton ZFS qui utilisera l’ensemble de notre disque DATA. Pour cela, après avoir identifié dans /dev/ le nom de mon disque (ici da1) :

root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# zpool create data /dev/da1
root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
data  49.8G  76.5K  49.7G     0%  ONLINE  -
root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# ls -l /
total 50
-rw-r--r--   2 root  wheel      798 Feb 17 03:19 .cshrc
-rw-r--r--   2 root  wheel      265 Feb 17 03:19 .profile
drwxrwxr-x   2 root  operator   512 Aug 18 04:18 .snap
-r--r--r--   1 root  wheel     6200 Feb 17 03:19 COPYRIGHT
drwxr-xr-x   2 root  wheel     1024 Feb 17 03:18 bin
drwxr-xr-x   7 root  wheel     1024 Aug 18 04:23 boot
drwxr-xr-x   2 root  wheel      512 Aug 18 04:18 cdrom
lrwxr-xr-x   1 root  wheel       10 Aug 18 04:23 compat -> usr/compat
drwxr-xr-x   2 root  wheel        2 Aug 18 02:31 data
dr-xr-xr-x   6 root  wheel      512 Aug 18 04:25 dev
drwxr-xr-x  20 root  wheel     2048 Aug 18 02:26 etc
drwxr-xr-x   3 root  wheel     1536 Feb 17 03:19 lib
drwxr-xr-x   2 root  wheel      512 Feb 17 03:18 libexec
drwxr-xr-x   2 root  wheel      512 Feb 17 03:18 media
drwxr-xr-x   2 root  wheel      512 Feb 17 03:18 mnt
dr-xr-xr-x   2 root  wheel      512 Feb 17 03:18 proc
drwxr-xr-x   2 root  wheel     2560 Feb 17 03:19 rescue
drwxr-xr-x   2 root  wheel      512 Aug 18 02:29 root
drwxr-xr-x   2 root  wheel     2560 Feb 17 03:19 sbin
lrwxr-xr-x   1 root  wheel       11 Feb 17 03:19 sys -> usr/src/sys
drwxrwxrwt   7 root  wheel      512 Aug 18 02:29 tmp
drwxr-xr-x  16 root  wheel      512 Aug 18 04:23 usr
drwxr-xr-x  23 root  wheel      512 Aug 18 04:26 var

Nous avons donc un système de fichier ZFS d’environ 50Go de crée (on le vois via la commande zpool list), nommé data, et monté à la racine (un simple ls -l /). Pour finir, on active le ZFS au démarrage de la machine :

root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# echo 'zfs_enable="YES"' >> /etc/rc.conf

Et voilà, pas besoin de plus ! Et si on partageait tout ça ?

Partage NFS :

NFS est un partage réseau qui est natif aux kernels de la quasi totalité des Unix. Il est basé sur le protocole RPC. Il est donc très avantageux de le privilégier pour partager ma partition ZFS. En effet, si je décide de changer de type d’Unix au niveau de mon frontal, je suis quasi sur de ne pas perdre la compatibilité. Une autre possibilité de ZFS dont je ne vous ai pas parlé, c’est le partage en NFS d’un pool de données. Pas mal non ?! C’est très simple :

root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# zfs set sharenfs="-maproot=root -alldirs -network 192.168.1.0 -mask 255.255.255.0" data

On remarque que le paramètre sharenfs prend en option les options NFS. Dans mon cas l’autorise le montage à partir de tous les sous répertoires de la partition ZFS pour toutes les machines du réseau 192.168.1.0/24. L’option maproot permet à l’utilisateur root distant d’avoir les droits d’écriture en root sur la partition partagée.

On peut verifier l’option via :

root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# zfs get sharenfs data

Bien sur, les partage ZFS s’appuie sur le NFS, il faut donc ajouter les services lockd et statd de NFS en démarrage automatique. Ses services permettent le lock des fichiers et la gestion du monitoring réseau pour RPC. On édite donc le fichier /etc/rc.conf :

root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# rpc_statd_enable="YES" >> /etc/rc.conf
root@oaf-prj-static.madeinsyria.fr-pts/0 [~]# rpc_lockd_enable="YES" >> /etc/rc.conf

Un petit reboot du server permet de verifier que tout est bien fonctionnel.

Montage des partages :

Sur les machines clients on monte les partages tous fraichement crées en utilisant la commande mount. Un rapide df -h permet de verifier que le filesystem est bien monté:

root@oaf-prj-web01.madeinsyria.fr-pts/0 [~]# mount -t nfs 192.168.20.100:/data /data
root@oaf-prj-web01.madeinsyria.fr-pts/0 [~]# df -h
Filesystem              Size    Used   Avail Capacity  Mounted on
/dev/da0s1a             989M    291M    619M    32%    /
devfs                   1.0K    1.0K      0B   100%    /dev
/dev/da0s1e             989M     14K    910M     0%    /tmp
/dev/da0s1f              11G    1.1G    8.7G    12%    /usr
/dev/da0s1d             4.8G    5.3M    4.4G     0%    /var
192.168.20.100:/data     49G     22K     49G     0%    /data

Pour que le montage se fasse automatiquement au démarrage de la machine, il faut éditer le fichier /etc/fstab et y ajouter la ligne ci dessous :

root@oaf-prj-web01.madeinsyria.fr-pts/0 [~]# echo "192.168.100.20:/data   /data    nfs rw  0   0" >> /etc/fstab

On adapte Nginx en modifiant la valeur de la variable “root” et “fastcgi_param”. On obtiens donc :

server {
        listen       80;
        server_name  test.madeinsyria.fr;
 
        access_log  /var/log/test.madeinsyria.fr.access.log  main;
        location / {
            root   /data;
            index  index.html index.htm;
        }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /data;
        }
        #GESTION DU PHP
        location ~ \.php$ {
       try_files  $uri  /path/to/404.htm;
                #Dossier racine
            root           html;
            #On revoie vers la socket
            fastcgi_param SCRIPT_FILENAME /data/$fastcgi_script_name;
            fastcgi_pass   unix:/tmp/fcgi.socket;
            fastcgi_index  index.php;
            include        fastcgi_params;
        }
    }

On relance bien sur les service Nginx et hop c’est dans la boite ! Nos frontaux s’appuient sur une partition ZFS distante montée en NFS ! La haute dispo est en marche !!!

A lire aussi :

  1. [Summer Camp] Étape 1 – Frontaux Web (Nginx + PHP5)
  2. [Summer Camp] Infra Web Haute Disponibilité

Rédigé par

IT pro et passionné d'UNIX âgé de 22 ans, je cherche à partager quelques points de vu et mon savoir faire. N'hésitez pas à laisser un commentaire ou votre avis, ça enrichira le débat !

5 réponses to “[Summer Camp] Etape 2 – Serveur de Fichiers NFS + ZFS”

Afficher / Masquer les commentaires
  1. Lufyx says:

    mmm bon je suis entrain de monté un projet de haute disponibilité mais pour l’instant je suis en phase d’etude .Donc si j’ai bien compris ton principe on va avoir nos frontaux qui vont tous pointer sur notre serveur NFS et après une réplication NFS se fera en mode actif passif entre les Serveur NFS c’est bien sa ?
    Autre question Pourquoi avoir utilisé NFS et Pas iSCSI qui est plus rapide ?
    Si tu veux un coup de main pour monter ta doc .I am here

    Et j’ai oublié de te demander .Sa te derange si je partage tes post sur mon Blog et vice versa ?
    mon blog http://www.adminreso.fr je l’ai mis en standby mais je vais mis remetre d’ici la rentré je pense si j’ai le tps

    • MadeInSyria says:

      Saut,

      La réplication des serveurs de fichiers statics se fait via ZFS et non pas NFS. Dans la vraie vie, mes File Server sont porté par des SAN IBM. Je n’ai donc aucun problème de vitesse de lecture écriture. Sans compter que la réplication se fait entre datacenter via une fibre, je n’ai donc pas de goulot à se niveau.

      L’avantage de ZFS c’est tout simplement les snapshots de données qui permettent en quelques secondes de récupérer une donnée perdu (j’ai vu des serveurs de fichiers de 3To revenir en 15 min). Sans compter le ZFS send/receive qui permet la réplication de la donnée.

      L’ensemble de mes posts peuvent être repris à d’autre endroit du moment que les sources sont cités. En parallèle, je ne publie que du contenu que je rédige ici car il s’agit un de peu de ma vitrine et de mes projets perso.

  2. Francois says:

    le iSCSI a été viré de zfs y compris d’OpenSolaris. Et sous Solaris on préfère utiliser la pile COMSTAR.

    http://blather.michaelwlucas.com/archives/53 (iSCSI/ZFS/FreeBSD/ESXi)

    zfs set shareiscsi n’est pas supporté dans FreeBSD.

  3. Letoine says:

    Bonjour, cette suite d’articles est très intéressante. J’espère qu’une suite va être donnée :)

Laisser un commentaire