Différences entre les pages « Backport OpenJDK » et « DRBD »

De Cliss XXI
(Différence entre les pages)
Sauter à la navigation Sauter à la recherche
imported>SylvainBeucler
m
 
imported>SylvainBeucler
 
Ligne 1 : Ligne 1 :
pbuilder initial Lenny setup:
+
Distributed Replicated Block Device
<pre>
+
 
mkdir -p /usr/src/backports/lenny/debs
+
apt-get install drbd8-utils drbd8-modules-2.6-686
(cd /usr/src/backports/lenny/debs && apt-ftparchive packages . | gzip > Packages.gz)
+
# ou variante:
pbuilder --create --basetgz /var/cache/pbuilder/base-lenny.tar.gz --distribution lenny \
+
apt-get install drbd8-utils drbd8-modules-2.6-vserver-686
  --othermirror "deb http://backports.org/debian lenny-backports main|deb file:///usr/src/backports/lenny/debs ./"
 
# to upgrade: pbuilder --update --basetgz /var/cache/pbuilder/base-lenny.tar.gz --bindmounts /usr/src/backports/lenny/debs
 
  
pbuilder --login --basetgz /var/cache/pbuilder/base-lenny.tar.gz --bindmounts /usr/src/backports/lenny/debs --save-after-login
+
== Configuration simple ==
echo "deb http://network/mirrors/debian-backports.org etch-backports main" > /etc/apt/sources.list.d/bpo.list
 
apt-get install debian-backports-keyring
 
apt-get update
 
  
# TODO: --pbuildersatisfydepends doesn't work, why?
+
Primary/Secondary (il existe aussi Primary/Primary):
#pdebuild --pbuilder cowbuilder --pbuildersatisfydepends /usr/lib/pbuilder/pbuilder-satisfydepends-experimental
 
# Meanwhile we edit /etc/pbuilderrc manually
 
PBUILDERSATISFYDEPENDSCMD="/usr/lib/pbuilder/pbuilder-satisfydepends-experimental
 
</pre>
 
  
source packages location:
 
 
<pre>
 
<pre>
cat <<EOF > /etc/apt/sources.list.d/squeeze-src
+
global {
deb-src http://ftp.fr.debian.org/debian/ lenny main
+
  usage-count yes;
EOF
+
}
apt-get update
+
common {
 +
  protocol C;
 +
  syncer { rate 40M; }
 +
  disk { on-io-error: detach; }
 +
  startup {
 +
    wfc-timeout 15;
 +
    degr-wfc-timeout 15;
 +
    #outdated-wfc-timeout 15; # not in DRBD 8.0/Lenny
 +
  }
 +
}
 +
resource r0 {
 +
  startup { become-primary-on VM1; }
 +
  on VM1 {
 +
    device    /dev/drbd0;
 +
    disk      /dev/VG0/test;
 +
    address  192.168.101.115:7789;
 +
    meta-disk /dev/VG0/test-drbdmeta[0];
 +
  }
 +
  on VM2 {
 +
    device    /dev/drbd0;
 +
    disk      /dev/VG0/test;
 +
    address  192.168.101.118:7789;
 +
    meta-disk /dev/VG0/test-drbdmeta[0];
 +
  }
 +
}
 
</pre>
 
</pre>
  
shell variables:
+
== Méta-données ==
 +
 
 +
Si vous utilisez des méta-données externes, vous aurez [http://www.drbd.org/users-guide/ch-internals.html#s-meta-data-size calculé] que le volume dédié n'a pas besoin d'être bien grand.
 +
 
 +
Cependant, il faut noter que le volume doit être au minimum to 128Mo très précisément, même pour le plus petit volume DRBD.
 +
 
 +
== DRBD par dessus LVM ==
 +
 
 +
Snapshots LVM d'un volume [[DRBD]]:
 +
* http://thread.gmane.org/gmane.comp.linux.drbd/6175 : en 2004
 +
* http://www.mail-archive.com/drbd-user@lists.linbit.com/msg00277.html : en 2009
 +
 
 +
Ce que je comprend:
 +
* léger risque d'incohérence du snapshot
 +
* pas de risque d'incohérence des données maîtres
 +
 
 +
En pratique, pour avoir un backup cohérent à partir du noeud secondaire:
 +
lvcreate -s VG0/test -n test-snapshot -L 5G
 +
mount /dev/VG0/test-snapshot -o ro /mnt/snapshots/test  # ro par parano
 +
# backup avec rsync...
 +
umount /mnt/snapshots/test
 +
lvremove VG0/test-snapshot
 +
 
 +
== Recharger la configuration ==
 +
 
 +
Utiliser:
 +
drbdadm adjust r0
 +
 
 +
Attention: comme indiqué [http://www.drbd.org/users-guide/s-configure-io-error-behavior.html ici], s'il y a un changement ''dans une section <code>disk</code>'', les versions < 8.3.1 lancent une resynchronization complète. Pour éviter cela, passer le primaire en secondaire (donc les deux noeuds en secondaire) avant de lancer <code>adjust</code>; cela implique de démonter toutes les volumes DRBD actifs.
 +
 
 +
== Simuler des erreurs d'entrées/sorties ==
 +
 
 +
Cf. http://lists.linbit.com/pipermail/drbd-dev/2009-July/001073.html
 +
 
 
<pre>
 
<pre>
export DEBEMAIL="beuc@beuc.net"
+
+   The actual simulation of IO errors is done by writing 3 values to
export DEBFULLNAME="Sylvain Beucler"
+
+   /sys/module/drbd/parameters/
export EDITOR="emacs"
+
+
 +
+   enable_faults: bitmask of...
 +
+   1 meta data write
 +
+   2              read
 +
+   4 resync data write
 +
+   8             read
 +
+   16 data write
 +
+   32 data read
 +
+   64 read ahead
 +
+   128 kmalloc of bitmap
 +
+   256 allocation of EE (epoch_entries)
 +
+
 +
+   fault_devs: bitmask of minor numbers
 +
+   fault_rate: frequency in percent
 +
+
 +
+   Example: Simulate data write errors on /dev/drbd0 with a probability of 5%.
 +
+ echo 16 > /sys/module/drbd/parameters/enable_faults
 +
+ echo 1 > /sys/module/drbd/parameters/fault_devs
 +
+ echo 5 > /sys/module/drbd/parameters/fault_rate
 
</pre>
 
</pre>
  
Build-dependency: cacao-source
+
L'exemple occasionne une erreur disque au bout de quelques accès disque.
<pre>
+
drbd0: Notified peer that my disk is broken
# dpkg-buildpackage -sa => include original sources, not just a diff,
+
 
# which makes sense because it will be a new repository rather than an Debian-specific update to the Debian repository
+
== Gérer des erreurs d'entrées/sorties ==
 +
 
 +
Cas 1 (configuration par défaut, mais n'est plus recommandée):
 +
 
 +
disk { on-io-error pass_on; }
 +
 
 +
Dans ce cas, les erreurs sont passées au système de fichiers, qui habituellement va se remonter en lecture seule. D'après mes tests, cependant, même avec <code>-o errors=remount-ro</code>, le système de fichiers s'est corrompu avec moult messages de drbd0 mais ''sans'' que le système de fichiers ne passe en lecture seule.
 +
 
 +
Cas 2:
 +
 
 +
disk { on-io-error detach; }
 +
 
 +
Dans ce cas le disque continue de fonctionner de manière transparente sur le secondaire, en passant par le réseau (mode "diskless").
 +
 
 +
Cas 3:
 +
 
 +
disk { on-io-error call-local-io-error; }
  
apt-get source cacao-source
+
Dans ce cas DRBD appelle un script spécifié via <code>local-io-error</code>.
pushd cacao-*
 
yes | dch -D lenny-backports \
 
  --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo50+1 \
 
  --force-bad-version -- \
 
  "Rebuild for Debian Backports <http://www.backports.org/>"
 
sed -i -e "s/Uploaders:\(.*\)/Uploaders:\1, $DEBFULLNAME <$DEBEMAIL>/" debian/control
 
pdebuild --debbuildopts '-sa' --buildresult /usr/src/backports/lenny/debs \
 
  -- --basetgz /var/cache/pbuilder/base-lenny.tar.gz --bindmounts /usr/src/backports/lenny/debs
 
popd
 
  
(cd /usr/src/backports/lenny/debs && apt-ftparchive packages . | gzip > Packages.gz)
+
== Montage au démarrage ==
# necessary...
 
pbuilder --update --basetgz /var/cache/pbuilder/base-lenny.tar.gz --bindmounts /usr/src/backports/lenny/debs
 
  
# alternatively (but it's global for all pbuider envs...):
+
* Dans <code>/etc/fstab</code> faire attention:
# http://www.netfort.gr.jp/~dancer/software/pbuilder-doc/pbuilder-doc.html#usingspecialaptsources
+
** de bien faire référence au volume DRBD (pas au volume physique)
#echo <<EOF > /var/cache/pbuilder/hooks/D70results
+
** de ne pas demander un fsck (mettre les deux derniers champs à <code>0</code>) car drbd n'est pas activé au moment où fstab est utilisé, ce qui va causerait une erreur
##!/bin/sh
+
* Dans l'ordre de démarrage, positionner les services dépendant de DRBD (ex: vserver) après lui
#cd /usr/src/backports/lenny/debs
+
* Rajouter un script au démarrage pour finir de monter les volumes DRBD, par exemple:
#dpkg-scanpackages . /dev/null | gzip > /usr/src/backports/lenny/debs/Packages.gz
+
<pre>
#apt-get update
+
#!/bin/bash
#EOF
+
if [ "$1" = "start" ]; then mount -a; fi
# I don't like using /var/cache/pbuilder/result/ because we don't want to reuse everything we may have compiled
 
 
</pre>
 
</pre>
  
OpenJDK itself:
+
== Supervision ==
<pre>
+
 
apt-get source openjdk-6
+
La supervision semble n'être prévue que par le biais de Heartbeat/Pacemaker. Quelques événements peuvent être notifiés par l'intermédiaires des ''handlers'', mais pas tous.
pushd openjdk-6-*
 
# debian/control:
 
# - cacao-source >= 0.99.4-1  =>  >= 0.99.4-1~
 
# - libpulse-dev (>= 0.9.12), pulseaudio (>= 0.9.12)  =>  (cd /usr/src/backports/lenny/debs && apt-ftparchive packages . | gzip > Packages.gz)
 
yes | dch -D etch-backports \
 
  --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo50+1 \
 
  --force-bad-version -- \
 
  "Rebuild for Debian Backports <http://www.backports.org/>"
 
sed -i -e "s/Uploaders:\(.*\)/Uploaders:\1, $DEBFULLNAME <$DEBEMAIL>/" debian/control
 
pdebuild --debbuildopts '-sa' --buildresult /usr/src/backports/lenny/debs \
 
  -- --basetgz /var/cache/pbuilder/base-lenny.tar.gz --bindmounts /usr/src/backports/lenny/debs
 
# That takes 8h, a good part of it being running the test suite,
 
# maybe we can disable it, at least when debugging the build system.
 
popd
 
  
(cd /usr/src/backports/lenny/debs && apt-ftparchive packages . | gzip > Packages.gz)
+
La commande <code>drbdsetup /dev/drbd0 events</code> permet de récupérer de manière succinte tous les événements qui se produisent.
</pre>
+
On peut l'utiliser de manière très rudimentaire le script suivant qui tournera en tâche de fond:
  
Run-time dependency: ca-certificates-java
 
 
<pre>
 
<pre>
apt-get source ca-certificates-java
+
#!/bin/bash
pushd /usr/src/backports/ca-certificates-java-20081028
+
for drbdX in /dev/drbd*; do
yes | dch -D etch-backports \
+
    (drbdsetup $drbdX events | while read line; do echo $line | mail -s "$(hostname) $drbdX" you@domain.tld; done)&
  --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo50+1 \
+
    sleep 1
  --force-bad-version -- \
+
done
  "Rebuild for Debian Backports <http://www.backports.org/>"
 
sed -i -e "s/Uploaders:\(.*\)/Uploaders:\1, $DEBFULLNAME <$DEBEMAIL>/" debian/control
 
pdebuild --debbuildopts '-sa' --buildresult /usr/src/backports/lenny/debs \
 
  -- --basetgz /var/cache/pbuilder/base-lenny.tar.gz --bindmounts /usr/src/backports/lenny/debs
 
popd
 
 
</pre>
 
</pre>
  
* [http://www.netfort.gr.jp/~dancer/software/pbuilder-doc/pbuilder-doc.html Pbuilder doc]
+
Faire un <code>killall drbdsetup</code> pour l'arrêter.
 +
 
 +
== Liens ==
 +
 
 +
* [http://www.drbd.org/users-guide/ The DRBD User's Guide]
 +
* [[LVM]]

Version du 31 octobre 2009 à 23:31

Distributed Replicated Block Device

apt-get install drbd8-utils drbd8-modules-2.6-686
# ou variante:
apt-get install drbd8-utils drbd8-modules-2.6-vserver-686

Configuration simple

Primary/Secondary (il existe aussi Primary/Primary):

global { 
  usage-count yes;
}
common {
  protocol C;
  syncer { rate 40M; }
  disk { on-io-error: detach; }
  startup {
    wfc-timeout 15;
    degr-wfc-timeout 15;
    #outdated-wfc-timeout 15; # not in DRBD 8.0/Lenny
  }
}
resource r0 {
  startup { become-primary-on VM1; }
  on VM1 {
    device    /dev/drbd0;
    disk      /dev/VG0/test;
    address   192.168.101.115:7789;
    meta-disk /dev/VG0/test-drbdmeta[0];
  }
  on VM2 {
    device    /dev/drbd0;
    disk      /dev/VG0/test;
    address   192.168.101.118:7789;
    meta-disk /dev/VG0/test-drbdmeta[0];
  }
}

Méta-données

Si vous utilisez des méta-données externes, vous aurez calculé que le volume dédié n'a pas besoin d'être bien grand.

Cependant, il faut noter que le volume doit être au minimum to 128Mo très précisément, même pour le plus petit volume DRBD.

DRBD par dessus LVM

Snapshots LVM d'un volume DRBD:

Ce que je comprend:

  • léger risque d'incohérence du snapshot
  • pas de risque d'incohérence des données maîtres

En pratique, pour avoir un backup cohérent à partir du noeud secondaire:

lvcreate -s VG0/test -n test-snapshot -L 5G
mount /dev/VG0/test-snapshot -o ro /mnt/snapshots/test  # ro par parano
# backup avec rsync...
umount /mnt/snapshots/test
lvremove VG0/test-snapshot

Recharger la configuration

Utiliser:

drbdadm adjust r0

Attention: comme indiqué ici, s'il y a un changement dans une section disk, les versions < 8.3.1 lancent une resynchronization complète. Pour éviter cela, passer le primaire en secondaire (donc les deux noeuds en secondaire) avant de lancer adjust; cela implique de démonter toutes les volumes DRBD actifs.

Simuler des erreurs d'entrées/sorties

Cf. http://lists.linbit.com/pipermail/drbd-dev/2009-July/001073.html

+	  The actual simulation of IO errors is done by writing 3 values to
+	  /sys/module/drbd/parameters/
+
+	  enable_faults: bitmask of...
+	  1	meta data write
+	  2               read
+	  4	resync data write
+	  8	            read
+	  16	data write
+	  32	data read
+	  64	read ahead
+	  128	kmalloc of bitmap
+	  256	allocation of EE (epoch_entries)
+
+	  fault_devs: bitmask of minor numbers
+	  fault_rate: frequency in percent
+
+	  Example: Simulate data write errors on /dev/drbd0 with a probability of 5%.
+		echo 16 > /sys/module/drbd/parameters/enable_faults
+		echo 1 > /sys/module/drbd/parameters/fault_devs
+		echo 5 > /sys/module/drbd/parameters/fault_rate

L'exemple occasionne une erreur disque au bout de quelques accès disque.

drbd0: Notified peer that my disk is broken

Gérer des erreurs d'entrées/sorties

Cas 1 (configuration par défaut, mais n'est plus recommandée):

disk { on-io-error pass_on; }

Dans ce cas, les erreurs sont passées au système de fichiers, qui habituellement va se remonter en lecture seule. D'après mes tests, cependant, même avec -o errors=remount-ro, le système de fichiers s'est corrompu avec moult messages de drbd0 mais sans que le système de fichiers ne passe en lecture seule.

Cas 2:

disk { on-io-error detach; }

Dans ce cas le disque continue de fonctionner de manière transparente sur le secondaire, en passant par le réseau (mode "diskless").

Cas 3:

disk { on-io-error call-local-io-error; }

Dans ce cas DRBD appelle un script spécifié via local-io-error.

Montage au démarrage

  • Dans /etc/fstab faire attention:
    • de bien faire référence au volume DRBD (pas au volume physique)
    • de ne pas demander un fsck (mettre les deux derniers champs à 0) car drbd n'est pas activé au moment où fstab est utilisé, ce qui va causerait une erreur
  • Dans l'ordre de démarrage, positionner les services dépendant de DRBD (ex: vserver) après lui
  • Rajouter un script au démarrage pour finir de monter les volumes DRBD, par exemple:
#!/bin/bash
if [ "$1" = "start" ]; then mount -a; fi

Supervision

La supervision semble n'être prévue que par le biais de Heartbeat/Pacemaker. Quelques événements peuvent être notifiés par l'intermédiaires des handlers, mais pas tous.

La commande drbdsetup /dev/drbd0 events permet de récupérer de manière succinte tous les événements qui se produisent. On peut l'utiliser de manière très rudimentaire le script suivant qui tournera en tâche de fond:

#!/bin/bash
for drbdX in /dev/drbd*; do
    (drbdsetup $drbdX events | while read line; do echo $line | mail -s "$(hostname) $drbdX" you@domain.tld; done)&
    sleep 1
done

Faire un killall drbdsetup pour l'arrêter.

Liens