Antisynchronistiquement

Publié le 15 octobre 2007 par Peck
Finalisez votre lecture sur http://linux-attitude.fr/post/Antisynchronistiquement

Niveau
:
Résumé : mysleep

Si vous gérez plusieurs serveurs, il est probable que vous ayez des crons sur un certain nombre d'entre eux. Il est aussi probable qu'un certain nombre aient des cron en commun. Lorsque ces cron impactent d'autres serveurs (serveur NFS, ftp ...) il vaut mieux éviter de lancer toutes ces crons en même temps.

Mais il et dommage de devoir gérer et envoyer des configurations différentes pour chaque serveur. D'autre part, les lancer de façon aléatoire pose le problème qu'elles peuvent encore se lancer en même temps, mais aussi qu'il sera plus difficile de débugger un éventuel problème.

Je vous propose dons un outil qui pourra être commun à toutes les machines et qui lancera ces cron à des moments presque tous différents, appelons-le mysleep.

#!/bin/sh
# choix d'une durée
DURATION=$((0x`hostid`%$1*$2))
# debug
[ "$DEBUG" == "1" ] & echo $DURATION
# et on attend
sleep $DURATION

Il s'utilise alors de la façon suivante dans vos cron :

# 5 machines, lancement séparé de 60 secondes
0 12 * * * /usr/local/bin/mysleep 5 60 & /path/to/cron/script


Attention, ce script se base sur le hostid. Rien ne garantit qu'il soit unique, il est d'abord lu comme le premier entier de 32 bits de /etc/hostid, et s'il n'existe pas comme l'ip correspondant au hostname. Et enfin s'il n'existe pas il vaut 0. En cas de problème vérifiez donc la distribution de vos hostid.

En cas de problème vous pouvez lui faire afficher la valeur de son sleep :
$ DEBUG=1 /usr/local/bin/mysleep 5 60

Ensuite ce script prend 2 paramètres le premier indique le nombre de valeurs différentes qu'on veut obtenir et le second l'écart entre ces valeurs. Le produit des 2 indique donc l'écart maximum entre la première et la dernière cron.

Si vos machines sont distribuées sur un réseau local, il est probable que les ip se suivent et donc que les valeurs de sleep soient toutes différentes.