REVISION du 19/01/09

Modification des montages de fichiers distants sur les serveurs virtuels en utilisant nbd plutôt que aoe.  Mise à jour des rubriques correspondantes en 4), 5) et 6).
Ce type de configuration m'a permis de monter un peripherique bloc depuis les serveurs web virtuels.





  1. L'article d'howtoforge
  2. Principe de fonctionnement
  3. Environnement de travail
  4. Configuration des loadbalancer
  5. Configuration du serveur openvz
  6. Configuration des vservers
  7. Tests
  8. Copies d'écrans et remarques

1) Howtoforge

Je me suis inpiré de cet article  (copie locale de secours ici)

2) Principe de fonctionnement

Comme le titre l'indique haute disponibilité signifie quasimment disponibilité permanente. En clair l'internaute qui appelle l'url http://serveur doit toujours obtenir une réponse même si l'un des serveurs sur lequel pointe la ressource est en panne.

Le mécanisme mis en place permet ceci: les loadbalancer diffusent une ip 192.168.0.117 grâce à heartbeat, plus précisemment l'un des deux loadbalancer diffuse cette ip et s'il vient à tomber en panne, c'est le second qui, averti par le démon heartbeat diffusera à son tour cette même ip.

Le démon haproxy tournant sur ces mêmes machines, s'assurera, lui, de répartir les requêtes à tour de rôle sur les 2 serveurs web (mécanisme de round-robin ou tourniquet).

J'ai choisi volontairement de construire les serveurs web dans des vservers car dans un souci de haute disponibilté toujours, il est extrémement facile et rapide de remettre en route une machine virtuelle si un problème est détecté (voir l'article sur proxmox ou sur openvcp)

Le montage réseau du périphérique de stockage des fichiers des serveurs web est un plus pour coller davantage à la réalité. J'ai choisi voontairement AtaOverEthernet mais j'aurais pu opter pour un montage iscsi, nfs, cifs, nbd, glusterfs .... On verra d'ailleurs dans la suite de l'article que ce montage n'est pas très propre et qu'il a pu être avantageusement remplacé par une solution bassée sur nbd.

A propos de nfs et openvz justement il y a quelques subtilités dont mon pote marco a fait les frais. C'est décrit sur son site.   (copie locale de secours)



heartbit haproxy aoe openvz
heartbeat haproxy nbd openvz
Montage du périph bloc par nbd



3) Environnement de travail    Retour en haut


Je vais utiliser 6 machines tournant sur vmware-server-2.0 pour cette expérience. De plus un serveur dns local (tournant sur le serveur web physique que vous consultez gère les domaines net.caen et wanadoo.fra).



3.1) La machine deb260.wanadoo.fra fera office de filer et mettra à disposition une ressource de stockage par (une fois n'est pas coutume) AtaOverEthernet (voir ce billet pour les détails)  dans un premier temps.

deb260:~# hostname --fqdn
deb260.wanadoo.fra

deb260:~# cat /etc/issue
Debian GNU/Linux 4.0 \n \l


deb260:~# ip addr
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:49:ee:ea brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.26/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fe49:eeea/64 scope link
       valid_lft forever preferred_lft forever

deb260:~# df -hT
Sys. de fich. Type     Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1     ext3    1,9G  1,3G  517M  72% /
tmpfs        tmpfs    207M     0  207M   0% /lib/init/rw
udev         tmpfs     10M   88K   10M   1% /dev
tmpfs        tmpfs    207M     0  207M   0% /dev/shm
/dev/sda5     ext3    464M  275M  165M  63% /usr/share
/dev/sdc1     ext3    7,9G  2,7G  4,9G  36% /usr/lib/oracle

deb260:~# cat /proc/partitions
major minor  #blocks  name

   8     0    4192965 sda
   8     1    1951866 sda1
   8     2     498015 sda2
   8     3          1 sda3
   8     5     489951 sda5
   8     6     489951 sda6
   8     7     763056 sda7
   8    16     524288 sdb
   8    17     522081 sdb1
   8    32    8388608 sdc
   8    33    8385898 sdc1
   8    48    2097152 sdd
   8    49    1116486 sdd1
   8    50     979965 sdd2



deb260:~# ps ax | grep vbla
 2885 ?        S      0:00 sh -c /usr/sbin/vblade 0 1 eth0 /dev/sdb1 < /dev/null 2>&1 | logger -t vbladed
 2887 ?        S      0:00 /usr/sbin/vblade 0 1 eth0 /dev/sdb1
 2888 ?        S      0:00 logger -t vbladed

C'est donc la partition /dev/sdb1 qui servira de stockage pour les fichiers des serveurs web et qui sera montée sur le serveur openvz qui la "redistribuera" à son tour vers les vservers.

REVISION du 19/01/09: Ce montage ne me satisfaisait tout de même pas et j'ai re-testé un autre système : je parle de nbd qui permet d'exporter des blocks via le réseau. Il faut installer nbd-server et nbd-client selon le cas. Ca sera donc nbd-server côté deb260 et nbd-client sur proxmox2 et les serveurs web.  (en cours de rédaction...)

Je stoppe donc les services vblade (kill -9 2885 2887 2888), j'en profite pour reformatter la partition /dev/sdb1 en ext3 (mkfs -t ext3 /dev/sdb1) et j'installe nbd-server sur le filer.

deb260:~# apt-get install nbd-server

Remarque: l'install par défaut ne crée aucun fichier de configuration. Il faut donc se le taper à la mano.

deb260:~# cat /etc/nbd-server

NBD_FILE[0]=/dev/sdb1
NBD_HOST[0]=192.168.0.26
NBD_PORT[0]=2000


Ceci fait je peux démarrer nbd-server :

deb260:/etc# init.d/nbd-server start
Starting Network Block Device server: /dev/sdb1 nbd-server.

deb260:/etc# ll /var/run/nbd-server.2000.pid
-rw-r--r-- 1 root root 4 2009-01-20 10:41 /var/run/nbd-server.2000.pid






3.2) ulteo.net.caen : cette machine sera l'un des 2 loadbalancer sur laquelle sera donc installé heartbeat et haproxy.        Retour environnement de travail


root@ulteo:~# uname -a
Linux ulteo 2.6.24-23-server #1 SMP Thu Nov 27 19:19:15 UTC 2008 i686 GNU/Linux

root@ulteo:~# cat /etc/issue
Ubuntu 8.04.1 \n \l

root@ulteo:~# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda1     ext3    7,6G  2,2G  5,1G  30% /
varrun       tmpfs    189M   48K  189M   1% /var/run
varlock      tmpfs    189M     0  189M   0% /var/lock
udev         tmpfs    189M   44K  189M   1% /dev
devshm       tmpfs    189M     0  189M   0% /dev/shm

root@ulteo:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:58:9d:23 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.34/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fe58:9d23/64 scope link
       valid_lft forever preferred_lft forever

3.3) ulteoapp.net.caen        Retour environnement de travail

Cette machine est quasi identique à ulteo.net.caen (distrib, version) à l 'ip près:

root@ulteoapp:/etc/heartbeat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:b1:77:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.35/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:feb1:7701/64 scope link
       valid_lft forever preferred_lft forever


3.4) promox2.net.caen : le serveur sur lequel tourne openvz et installé comme décrit dans l'article        Retour environnement de travail

promox2:~# uname -a
Linux promox2 2.6.24-2-pve #1 SMP PREEMPT Wed Jan 14 11:32:49 CET 2009 x86_64 GNU/Linux

promox2:~# cat /etc/issue
Debian GNU/Linux 4.0 \n \l

promox2:~# ip addr
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:b3:14:26 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:feb3:1426/64 scope link
       valid_lft forever preferred_lft forever
3: vmbr0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
    link/ether 00:0c:29:b3:14:26 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.98/24 brd 192.168.0.255 scope global vmbr0
    inet6 fe80::20c:29ff:feb3:1426/64 scope link
       valid_lft forever preferred_lft forever
4: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,10000> mtu 1500 qdisc noqueue
    link/void

promox2:~# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/pve/root ext3    2.0G  715M  1.2G  38% /
tmpfs        tmpfs    187M     0  187M   0% /lib/init/rw
udev         tmpfs     10M   60K   10M   1% /dev
tmpfs        tmpfs    187M     0  187M   0% /dev/shm
/dev/mapper/pve-data
              ext3    3.5G  1.1G  2.5G  30% /var/lib/vz
/dev/sda1     ext3    496M   51M  420M  11% /boot
/dev/etherd/e0.1
              vfat    509M   16K  509M   1% /srv


3.5) vmprx1.net.caen : un des serveurs virtuels web tournant sur promox2        Retour environnement de travail

vm1prx:/var/log/apache2# uname -a
Linux vm1prx 2.6.24-2-pve #1 SMP PREEMPT Wed Jan 14 11:32:49 CET 2009 i686 GNU/Linux

vm1prx:/var/log/apache2# cat /etc/issue
Debian GNU/Linux 4.0 \n \l

vm1prx:/var/log/apache2# ifconfig | grep 192
          inet addr:192.168.0.96  P-t-P:192.168.0.96  Bcast:0.0.0.0  Mask:255.255.255.255

vm1prx:/var/log/apache2# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
simfs        simfs    1.0G  299M  726M  30% /
tmpfs        tmpfs    187M     0  187M   0% /lib/init/rw
tmpfs        tmpfs    187M     0  187M   0% /dev/shm
/dev/etherd/e0.1
              vfat    509M   16K  509M   1% /var/www


vm1prx:/var/log/apache2# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 0.0.0.0:37349           0.0.0.0:*               LISTEN     454/rpc.statd      
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     262/portmap        
tcp        0      0 192.168.0.96:80         0.0.0.0:*               LISTEN     772/apache2        
tcp        0      0 0.0.0.0:113             0.0.0.0:*               LISTEN     366/inetd          
tcp6       0      0 :::22                   :::*                    LISTEN     438/sshd           
udp        0      0 0.0.0.0:111             0.0.0.0:*                          262/portmap        
udp        0      0 0.0.0.0:630             0.0.0.0:*                          454/rpc.statd      
udp        0      0 0.0.0.0:60927           0.0.0.0:*                          454/rpc.statd      
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path




3.6) vmprx3.net.caen : un des serveurs virtuels web tournant sur promox2        Retour environnement de travail


vm3prx:/var/log/apache2# uname -a
Linux vm3prx 2.6.24-2-pve #1 SMP PREEMPT Wed Jan 14 11:32:49 CET 2009 i686 GNU/Linux

vm3prx:/var/log/apache2# cat /etc/issue
Debian GNU/Linux 4.0 \n \l

vm3prx:/var/log/apache2# ifconfig | grep 192
          inet addr:192.168.0.99  P-t-P:192.168.0.99  Bcast:0.0.0.0  Mask:255.255.255.255

vm3prx:/var/log/apache2# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
simfs        simfs    1.0G  304M  721M  30% /
tmpfs        tmpfs    187M     0  187M   0% /lib/init/rw
tmpfs        tmpfs    187M     0  187M   0% /dev/shm
/dev/etherd/e0.1
              vfat    509M   16K  509M   1% /var/www


vm3prx:/var/log/apache2# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 0.0.0.0:60288           0.0.0.0:*               LISTEN     447/rpc.statd      
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     257/portmap        
tcp        0      0 192.168.0.99:80         0.0.0.0:*               LISTEN     865/apache2        
tcp        0      0 0.0.0.0:113             0.0.0.0:*               LISTEN     359/inetd          
tcp6       0      0 :::22                   :::*                    LISTEN     431/sshd           
udp        0      0 0.0.0.0:53343           0.0.0.0:*                          447/rpc.statd      
udp        0      0 0.0.0.0:623             0.0.0.0:*                          447/rpc.statd      
udp        0      0 0.0.0.0:111             0.0.0.0:*                          257/portmap        
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path



4) Configuration des loadbalancers    Retour en haut

Pour la configuration de heartbeat et de haproxy j'ai suivi les indications de howtoforge à ceci près que j'ai créé un répertoire /etc/haproxy et créé un lien symbolique comme suit:

Config haproxy

root@ulteo:/etc/haproxy# ll
total 8
drwxr-xr-x  2 root root 4096 2009-01-17 12:11 .
drwxr-xr-x 68 root root 4096 2009-01-17 10:29 ..
lrwxrwxrwx  1 root root   14 2009-01-17 12:11 haproxy.cfg -> ../haproxy.cfg

En effet le serveur semblait prendre une configuration par défaut sans lire le fichier de configuration de haproxy si celui-ci était situé dans /etc.

root@ulteo:/etc/haproxy# cat haproxy.cfg
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #debug
        #quiet
        user haproxy
        group haproxy

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen webfarm 192.168.0.117:80
       mode http
       stats enable
       stats auth someuser:somepassword
       balance roundrobin
       cookie JSESSIONID prefix
       option httpclose
       option forwardfor
       option httpchk HEAD /check.txt HTTP/1.0
       server webA 192.168.0.96:80 cookie A check
       server webB 192.168.0.99:80 cookie B check

L'ip flottante sera donc la 192.168.0.117 et sera celle vu de l'internaute qui appelera l'url: http://ha.net.caen

root@ulteo:/etc/haproxy# host 192.168.0.117
117.0.168.192.in-addr.arpa domain name pointer ha.net.caen.

root@ulteo:/etc/haproxy# host ha.net.caen
ha.net.caen has address 192.168.0.117

Config heartbeat

root@ulteo:/etc/heartbeat# ll
total 52
drwxr-xr-x  6 root root 4096 2009-01-16 20:56 .
drwxr-xr-x 68 root root 4096 2009-01-17 12:17 ..
-rw-------  1 root root   30 2009-01-16 19:12 authkeys
drwxr-xr-x  2 root root 4096 2008-01-18 07:50 conf
drwxr-xr-x  2 root root 4096 2008-01-18 07:50 cts
-rw-r--r--  1 root root  620 2009-01-16 19:22 ha.cf
-rwxr-xr-x  1 root root  745 2008-01-18 07:50 harc
-rw-r--r--  1 root root   20 2009-01-16 20:56 haresources
drwxr-xr-x  2 root root 4096 2009-01-16 19:11 rc.d
-rw-r--r--  1 root root  692 2008-01-18 07:50 README.config
drwxr-xr-x  2 root root 4096 2009-01-16 19:11 resource.d
-rw-r--r--  1 root root 7184 2008-01-18 07:50 shellfuncs


root@ulteo:/etc/heartbeat# cat authkeys
auth 3
3 md5 somerandomstring

root@ulteo:/etc/heartbeat# cat ha.cf | egrep -v '^#'
keepalive 2
deadtime 10
udpport        694
bcast  eth0
mcast eth0 225.0.0.1 694 1 0
ucast eth0 192.168.0.35
udp     eth0
logfacility     local0
node    ulteo
node    ulteoapp

root@ulteo:/etc/heartbeat# cat haresources
ulteo    192.168.0.117

La configuration sera identique sur ulteoapp sauf bien sûr en ce qui concerne cette ligne dans le fichier ha.cf:
pour ulteo : ucast eth0 192.168.0.35 adresse ip de l'autre node donc, ulteo ayant l'adresse ip 192.168.0.34
pour ulteoapp : ucast eth0 192.168.0.34

Là également petite remarque: il ne faut pas mettre le nom d'hôte fqdn mais uniquement le nom de la machine dans le fichier ha.cf et il est impératif que les 2 nodes puissent se voir en utilisant le nom d'hôte. Dans mon cas cela se résume à configurer le fichier /etc/resolv.conf comme ceci:

root@ulteo:/etc# cat resolv.conf
search net.caen
nameserver 192.168.0.23



-> Il faudra également insérer cette valeur dans /etc/sysctl.conf sur les nodes balancer ulteo, ulteoapp:

net.ipv4.ip_nonlocal_bind=1

et la valider par: sysctl -p




5) Configuration du serveur openvz    Retour en haut


promox2:~# cat /etc/apt/sources.list
deb http://ftp.fr.debian.org/debian etch main

# PVE packages provided by proxmox.com
deb http://download.proxmox.com/debian etch pve

# security updates
deb http://security.debian.org/ etch/updates main


Sur cette machine, le noyau est patché openvz et me permet donc d'installer des serveurs virtuels en quelques minutes. J'ai installé les aoetools et ai monté la ressource
du filer deb260 que j'ai ensuite remontée avec l'option --bind sur les vservers. Il doit y avoir une façon plus propre de procéder, notamment en déclarant des periphs spécifiques sur les vservers et en montant cette ressource depuis le vserver lui-même. Je verrais à corriger un peu plus tard.



promox2:~# mount
/dev/pve/root on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/mapper/pve-data on /var/lib/vz type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
/dev/etherd/e0.1 on /srv type vfat (rw)
/srv on /var/lib/vz/root/102/var/www type none (rw,bind)
/srv on /var/lib/vz/root/101/var/www type none (rw,bind)


/dev/etherd/e0.1 on /srv type vfat (rw) : ressource aoe  montée à son tour avec --bind sur chacun des DocumentRoot des vservers.

promox2:~# ll /srv
total 20
drwxr-xr-x  2 root root 4096 2009-01-17 10:47 .
drwxr-xr-x 22 root root 4096 2008-11-15 19:42 ..
-rwxr-xr-x  1 root root    0 2009-01-17 10:34 check.txt
-rwxr-xr-x  1 root root   31 2008-03-16 15:58 essaidepuisp733
-rwxr-xr-x  1 root root  123 2009-01-17 10:45 index.html
-rwxr-xr-x  1 root root   48 2009-01-17 10:47 phpinfo.php


promox2:~# vzctl enter 101
entered into CT 101
vm1prx:/# ll /var/www
total 20
drwxr-xr-x  2 root root 4096 Jan 17 09:47 .
drwxr-xr-x 14 root root 4096 Jan 11 17:11 ..
-rwxr-xr-x  1 root root    0 Jan 17 09:34 check.txt
-rwxr-xr-x  1 root root   31 Mar 16  2008 essaidepuisp733
-rwxr-xr-x  1 root root  123 Jan 17 09:45 index.html
-rwxr-xr-x  1 root root   48 Jan 17 09:47 phpinfo.php

promox2:~# vzctl enter 102
entered into CT 102
vm3prx:/# ll /var/www
total 20
drwxr-xr-x  2 root root 4096 Jan 17 09:47 .
drwxr-xr-x 14 root root 4096 Jan 11 18:18 ..
-rwxr-xr-x  1 root root    0 Jan 17 09:34 check.txt
-rwxr-xr-x  1 root root   31 Mar 16  2008 essaidepuisp733
-rwxr-xr-x  1 root root  123 Jan 17 09:45 index.html
-rwxr-xr-x  1 root root   48 Jan 17 09:47 phpinfo.php


REVISION du 19/01/09: installation de nbd-client sur promox2 pour tester le montage d'un periphérique bloc sur le réseau.

promox2:~# apt-get install nbd-client

Puis je connecte ensuite la ressource :

promox2:~# nbd-client 192.168.0.26 2000 /dev/nbd0

Je teste le montage:

promox2:~# mount /dev/nbd0 /srv

C'est bon. Je démonte la ressource et vais configurer les serveurs virtuels en déclarant sur ceux-ci de nouveaux devices. En effet le noyau openvz (comme celui de linux-vserver) est commun à l'hôte et aux guests mais tous les périphériques côté hôte ne sont pas systématiquement disponibles côté guest. De plus la gestion des modules se fait uniquement sur l'hôte.

- chargement du module nbd sur l'hôte promox2:

promox2:~# modprobe nbd

promox2:/# ll /dev/nbd*
brw-rw---- 1 root disk 43,  0 2009-01-19 17:52 /dev/nbd0
brw-rw---- 1 root disk 43,  1 2009-01-19 17:52 /dev/nbd1
....etc....

Création des périphs nécessaires sur les guests et sauvegardes des paramètres:

promox2:/# vzctl set 101 --devices b:43:0:rw --save
promox2:/# vzctl set 102 --devices b:43:0:rw --save

promox2:/# vzctl exec 101 mknod /dev/nbd0 b 43 0
promox2:/# vzctl exec 102 mknod /dev/nbd0 b 43 0

Il ne reste plus qu'à tester le montage sur les serveurs virtuels: il va donc falloir installer également le paquet nbd-client. Il faudra ensuite lancer nbd-client
sur l'hôte promox2 AVANT de lancer le client sur les serveurs virtuels.

promox2:~# nbd-client 192.168.0.26 2000 /dev/nbd0

promox2:/# vzctl enter 101
vmprx1:/# apt-get install nbd-client

Puis montage de la ressource sur /var/www voir REV6





6) Configuration des serveurs web    Retour en haut

La config apache2 est identique sur les deux machines. Un seul vhost actif dont le DocumentRoot pointe sur la ressource aoe montée en bind depuis l'hôte promox2.
Le module php5 (version 5.2.8) pour apache2 (sources.list dotdeb.org) est installé.

Pour pouvoir logguer les machines qui se connectent et non pas les serveurs haproxy, il est nécessaire de modifier /etc/apache2/apache2.conf comme ceci:

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Pour les tests je laisse le fichier de config d'apache par défaut en adaptant juste certaines directives. Dans la vraie vie on pourra gérer des virtual-hosts spécifiques par domaine.

vm1prx:/etc/apache2/sites-enabled# cat 000-default

NameVirtualHost *
<VirtualHost *>
    ServerAdmin webmaster@localhost
   
    DocumentRoot /var/www/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
        # This directive allows us to have apache2's default start page
        # in /apache2-default/, but still have / go to the right place
        #RedirectMatch ^/$ /apache2-default/
            
    </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 /var/log/apache2/error.log
    LogLevel warn

    #CustomLog /var/log/apache2/access.log combined
    SetEnvIf Request_URI "^/check\.txt$" dontlog
    CustomLog /var/log/apache2/access.log combined env=!dontlog

    ServerSignature Off
 

</VirtualHost>


Seule différence bien sûr, l'ip sur laquelle écoute apache:

vm3prx:/etc/apache2# cat ports.conf
Listen 192.168.0.99:80


vm1prx:/etc/apache2# cat ports.conf
Listen 192.168.0.96:80

REVISION du 19/01/09: montage nbd du répertoire de stockage des fichiers du web:

vm1prx:/# nbd-client 192.168.0.26 2000 /dev/nbd0
Negotiation: ..size = 510464KB

vm1prx:/# mount /dev/nbd0 /var/www

vmprx1:/var/www# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
simfs        simfs    1.0G  299M  726M  30% /
tmpfs        tmpfs    187M     0  187M   0% /lib/init/rw
tmpfs        tmpfs    187M     0  187M   0% /dev/shm
/dev/nbd0     ext3    509M  5.6M  503M   1% /var/www

Il faudra procéder exactement de la même manière pour l'autre serveur virtuel.




7) Tests    Retour en haut

J'ai testé une coupure réseau sur ulteo puis je l'ai réactivé (dans vmware-server-2.0 l'opération est effectuée en quelques clics). J'ai ensuite effectué la même manip sur l'autre node à savoir ulteoapp. Dans les 2 cas l'accès à http://ha.net.caen est resté disponible.

Les fichiers /var/log/messages des 2 nodes lors des déconnexion/reconnexion :  ulteo-messages     et    ulteoapp-messages


8) Copies d'écran    Retour en haut


Quelques copies d'écran


Remarques: j'ai utilisé volontairement des serveurs virtuels tournant sur une même machine pour apache2 car que ce soit avec openvz ou openvcp (lié à linux-vserver) les opérations de création, sauvegarde, restauration de serveurs virtualisés sont des jeux d'enfants. Dans le cas où on utilise un mécanisme basé sur heartbeat et haproxy, il va de soi qu'il serait plus judicieux dans un environnement de production réel de faire tourner ces serveurs web en virtualisé également MAIS sur des nodes différents ceci afin de bénéficier de la répartition de charge gérée par haproxy.

De plus il faudra également prévoir la mise en place d''un serveur ftp car disposer d'un site web c'est bien mais encore faut-il pouvoir le mettre à jour. Là encore on aura le choix:

On installe un serveur ftp sur une autre machine et on monte par nbd le périphérique /dev/sdb1 exporté depuis deb260 ou bien on installe un serveur ftp sur chacun des serveurs web. On crée ensuite un utilisateur dont le home pointe sur un sous-répertoire de /var/www (sinon problème de droits) et le tour est joué.