2010/06/03

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 :

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 ?

Name :
URL (optional) :
Write here: "ETOOMUCHSPAM"
Comments :