FS partagé et répliqué
Je suis un grand utilisateur de proxmox, j'ai beaucoup de machine virtuelles OpenVZ et kvm en mode cluster sur mes proxmox.
Pour diverses raisons, je souhaite que les machines kvm utilisent des disques sous la forme de fichiers plats et non des volumes LVM. Mais je souhaites aussi pouvoir migrer rapidement les VMs d'un noeud du cluster à un autre. Pour cela j'utilise drbd en mode multimaster pour répliquer un volume lvm entre les noeuds du cluster, et ocfs2 pour disposer d'un système de fichier partagé.
Dans l'exemple suivant nous auront deux noeuds : virt01 et virt02.
Le tuto suivant a été fait sur un proxmox 1.5 avec la mise à jour du 17 mai 2010, afin de disposer de OpenVZ et de kvm le noyau utilisé est proxmox-2.6.24-11
virt01 et virt02 disposent chacun d'une interface d'admin dédiée :
- virt01 : 10.56.1.1
- virt02 : 10.56.1.2
Le volume partagé par les deux sera nommé "shared".
Commençons par le créer :
virt01$ lvcreate --name shared --size 800G vg
virt02$ lvcreate --name shared --size 800G vg
DRBD
Installons les outils drbd :
virt01$ apt-get install drbd8-utils
virt02$ apt-get install drbd8-utils
Sur les deux noeuds créons le fichier /etc/drbd.conf avec le contenu suivant :
global { usage-count no; }
common { syncer { rate 30 M; }}
resource r0 {
protocol C;
startup {
wfc-timeout 15;
degr-wfc-timeout 60;
become-primary-on both;
}
net {
cram-hmac-alg sha1;
shared-secret "mon-secret";
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
on virt01 {
device /dev/drbd0;
disk /dev/vg/shared;
address 10.56.1.1:7788;
meta-disk internal;
}
on virt02 {
device /dev/drbd0;
disk /dev/vg/shared;
address 10.56.1.2:7788;
meta-disk internal;
}
}
Démarrons drbd sur les deux noeuds :
virt01$ /etc/init.d/drbd start
virt02$ /etc/init.d/drbd start
Puis on crée le "device metadata" (si quelqu'un a un nom français plus parlant ? :)) :
virt01$ drbdadm create-md r0
virt01$ drbdadm up r0
virt02$ drbdadm create-md r0
virt02$ drbdadm up r0
En regardant le status (/proc/drbd) sur le deux, ça devrait maintenant ressemble a ça :
virt01$ cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@oahu, 2010-05-14 09:29:27
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:2096348
tout est prêt il faut maintenant faire la première synchronisation, sur Un seul des noeud :
virt01$ drbdadm -- --overwrite-data-of-peer primary r0
il faut maintenant attendre que la synchronisation soit terminée (le fichier /proc/drbd permet de le voir)
Une fois la synchronisation terminée il faut redémarrer drbd pour s'assurer qu'il passe bien en mode primary/primary :
virt01$ /etc/init.d/drbd stop
virt02$ /etc/init.d/drbd stop
virt01$ /etc/init.d/drbd start
virt02$ /etc/init.d/drbd start
OCFS2
Passons maintenant à l'OCFS2 :
Si il n'est pas déjà installé, il faut le faire :
virt01$ apt-get install ocfs2-tools
virt02$ apt-get install ocfs2-tools
Sur les deux membres du cluster il faut créer le fichier suivant : /etc/ocfs2/cluster.conf
node:
ip_port = 7777
ip_address = 10.56.1.1
number = 0
name = virt01
cluster = ocfs2
node:
ip_port = 7777
ip_address = 10.56.1.2
number = 1
name = virt02
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
sur l'un des noeud uniquement :
virt01$ mkfs.ocfs2 /dev/drbd0
Vérifier que la réplication se passe bien :
virt01$ watch cat /proc/drbd
Attention: la réplication peut être très longue !!!
il ne reste plus qu'à ajouter dans la fstab le tout sur les deux noeuds :
/dev/drbd0 /shared ocfs2 _netdev 0 0
Je vous laisse vous débrouiller seul pour la suite (ie rajouter ce stockage dans proxmox : c'est du clika suivant dans l'interface web).
Je peux maintenant, pour toutes les VMs crées dans ce FS, les basculer entre les noeuds du cluster à chaud et de manière quasi instantanée, convi non ?