197 lines
4.5 KiB
Markdown
197 lines
4.5 KiB
Markdown
|
### Migration à chaud d'une .img via volumes drbd stacké
|
||
|
|
||
|
Dans ce scénario, on dispose de VMs avec leur stockage sur un fichier.img. L'idée est de migrer le disque .img à chaud sur un autre hyperviseur en utilisant drbd en mode « stacké ».
|
||
|
Soit 3 hyperviseurs : foo, bar et baz
|
||
|
|
||
|
~~~
|
||
|
Fichier .img → loop device → drbd entre foo et bar → drbd entre bar et baz
|
||
|
~~~
|
||
|
|
||
|
On monte l'image sur un loop device.
|
||
|
|
||
|
~~~
|
||
|
foo# losetup /dev/loop0 qux.img
|
||
|
~~~
|
||
|
|
||
|
On monte un drbd entre foo:/dev/loop0 et bar:/dev/drbd0 (bar:/dev/drbd0 étant entre bar et baz).
|
||
|
Il faudra stocker les meta-donées en externe. On calcule la taille nécessaire.
|
||
|
|
||
|
<http://serverfault.com/questions/433999/calculating-drbd-meta-size>
|
||
|
|
||
|
metacalc.sh :
|
||
|
|
||
|
~~~
|
||
|
#!/bin/bash
|
||
|
|
||
|
which bc >/dev/null 2>&1
|
||
|
if [ ! $? -eq 0 ]; then
|
||
|
echo "Error: bc is not installed"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if [ $# -lt 1 ]; then
|
||
|
echo "Error: Please supply block device path"
|
||
|
echo "Eg. /dev/vg1/backups"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
DEVICE=$1
|
||
|
|
||
|
SECTOR_SIZE=$( blockdev --getss $DEVICE )
|
||
|
SECTORS=$( blockdev --getsz $DEVICE )
|
||
|
MD_SIZE=$( echo "((($SECTORS + (2^18)-1) / 262144 * 8) + 72)" | bc )
|
||
|
FS_SIZE=$( echo "$SECTORS - $MD_SIZE" | bc )
|
||
|
|
||
|
MD_SIZE_MB=$( echo "($MD_SIZE / 4 / $SECTOR_SIZE) + 1" | bc )
|
||
|
FS_SIZE_MB=$( echo "($FS_SIZE / 4 / $SECTOR_SIZE)" | bc )
|
||
|
|
||
|
echo "Filesystem: $FS_SIZE_MB MiB"
|
||
|
echo "Filesystem: $FS_SIZE Sectors"
|
||
|
echo "Meta Data: $MD_SIZE_MB MiB"
|
||
|
echo "Meta Data: $MD_SIZE Sectors"
|
||
|
echo "--"
|
||
|
echo "Resize commands: resize2fs -p "$DEVICE $FS_SIZE_MB"M; drbdadm create-md res"
|
||
|
~~~
|
||
|
|
||
|
~~~
|
||
|
foo# bash metacalc.sh /dev/loop0
|
||
|
Meta Data: 1 MiB
|
||
|
~~~
|
||
|
|
||
|
On pourra ajouter une marge au cas où…
|
||
|
Si pas de possibilité LVM, on utilisera un fichier plus un loop device :
|
||
|
|
||
|
~~~
|
||
|
foo# dd if=/dev/zero of=./qux.img.drbd.metadata bs=1M count=2
|
||
|
foo# losetup /dev/loop1 qux.img.drbd.metadata
|
||
|
~~~
|
||
|
|
||
|
Si l'on peut utiliser LVM, il suffira de créer un volume dédié.
|
||
|
|
||
|
Maintenant que l'on a un device pour les meta-données, on créer la ressource drbd.
|
||
|
|
||
|
Sur foo :
|
||
|
|
||
|
~~~
|
||
|
resource "qux" {
|
||
|
net {
|
||
|
cram-hmac-alg "sha1";
|
||
|
shared-secret "YOURSHAREDSECRET";
|
||
|
# Dans le cadre d'une migration se mettre en mode A ?
|
||
|
protocol C;
|
||
|
allow-two-primaries;
|
||
|
# Tuning perf.
|
||
|
max-buffers 8000;
|
||
|
max-epoch-size 8000;
|
||
|
sndbuf-size 0;
|
||
|
}
|
||
|
# A utiliser si RAID HW avec cache + batterie
|
||
|
disk {
|
||
|
disk-barrier no;
|
||
|
disk-flushes no;
|
||
|
}
|
||
|
volume 0 {
|
||
|
device minor 126;
|
||
|
disk /dev/loop0;
|
||
|
meta-disk /dev/loop1;
|
||
|
}
|
||
|
on foo {
|
||
|
address 192.0.2.10:7900;
|
||
|
}
|
||
|
on bar {
|
||
|
address 192.0.2.11:7900;
|
||
|
}
|
||
|
}
|
||
|
~~~
|
||
|
|
||
|
Attention si vous n'utiliser pas la même version de drbd… La config est différente.
|
||
|
En 8.3 :
|
||
|
|
||
|
~~~
|
||
|
resource "qux" {
|
||
|
protocol C;
|
||
|
net {
|
||
|
cram-hmac-alg "sha1";
|
||
|
shared-secret "YOURSHAREDSECRET";
|
||
|
allow-two-primaries;
|
||
|
# Tuning perf.
|
||
|
max-buffers 8000;
|
||
|
max-epoch-size 8000;
|
||
|
sndbuf-size 0;
|
||
|
}
|
||
|
on foo {
|
||
|
device /dev/drbd126;
|
||
|
disk /dev/loop0;
|
||
|
flexible-meta-disk /dev/loop1;
|
||
|
address 192.0.2.10:7900;
|
||
|
}
|
||
|
on bar {
|
||
|
device /dev/drbd126;
|
||
|
disk /dev/drbd0;
|
||
|
meta-disk /dev/hdd/zedmel2-drbd-metadata[0];
|
||
|
address 192.0.2.11:7900;
|
||
|
}
|
||
|
}
|
||
|
~~~
|
||
|
|
||
|
Sur bar :
|
||
|
|
||
|
~~~
|
||
|
resource "qux" {
|
||
|
net {
|
||
|
cram-hmac-alg "sha1";
|
||
|
shared-secret "YOURSHAREDSECRET";
|
||
|
# Dans le cadre d'une migration se mettre en mode A ?
|
||
|
protocol C;
|
||
|
allow-two-primaries;
|
||
|
# Tuning perf.
|
||
|
max-buffers 8000;
|
||
|
max-epoch-size 8000;
|
||
|
sndbuf-size 0;
|
||
|
}
|
||
|
# A utiliser si RAID HW avec cache + batterie
|
||
|
disk {
|
||
|
disk-barrier no;
|
||
|
disk-flushes no;
|
||
|
}
|
||
|
volume 0 {
|
||
|
device minor 126;
|
||
|
disk /dev/drbd0;
|
||
|
meta-disk /dev/vg0/lv0-qux-drbd-metadata;
|
||
|
}
|
||
|
on foo {
|
||
|
address 192.0.2.10:7900;
|
||
|
}
|
||
|
on bar {
|
||
|
address 192.0.2.11:7900;
|
||
|
}
|
||
|
}
|
||
|
~~~
|
||
|
|
||
|
On arrête la vm qux.
|
||
|
|
||
|
~~~
|
||
|
foo# virsh stop qux
|
||
|
~~~
|
||
|
|
||
|
On active la nouvelle ressource drbd.
|
||
|
|
||
|
~~~
|
||
|
foo# drbdadm create-md qux
|
||
|
bar# drbdadm create-md qux
|
||
|
foo# /etc/init.d/drbd reload
|
||
|
bar# /etc/init.d/drbd reload
|
||
|
foo# drbdadm attach qux
|
||
|
bar# foo# drbdadm attach qux
|
||
|
foo# drbdadm -- --overwrite-data-of-peer primary qux
|
||
|
~~~
|
||
|
|
||
|
On édite sa config pour être mettre /dev/drbdX en tant que disque. Et on démmare
|
||
|
|
||
|
~~~
|
||
|
foo# virsh edit
|
||
|
foo# vrish start
|
||
|
~~~
|
||
|
|
||
|
Une fois la synchro terminé. On pourra éteindre la VM et la démarrer sur bar.
|
||
|
On pourra supprier la ressources drbd qui a servi à la migration ainsi que le disque de méta-données.
|