Différences entre les versions de « Synchro bidirectionnelle »

De BlaxWiki
Aller à la navigationAller à la recherche
 
Ligne 1 : Ligne 1 :
Un double synchronisation bidirectionnelle est en place entre les 2 serveurs via rsync et ssh. Chaque serveur va lancer une mise a jour distante puis locale. Ainsi, si le serveur  
Un double synchronisation bidirectionnelle est en place entre les 2 serveurs via rsync et ssh. Chaque serveur va lancer une mise a jour distante puis locale. Ainsi, si le serveur  
distant est plus recent, la premiere mise a jour ne sera pas faite, par contre, la mise a jour locale elle sera appliquee. Les heures de synchronisation dans la crontab sont decalees  
distant est plus recent, la premiere mise a jour ne sera pas faite, par contre, la mise a jour locale elle sera appliquee. Les heures de synchronisation dans la crontab sont decalees  
pour limiter les risques. A chaque mise a jour, un backup est realise dans /opt/data/backup
pour limiter les risques. A chaque mise a jour, un backup est realisé.
 
Ce script est installé sur 2 serveurs squid, il sert à copier la configuration de squid entre ces 2 serveurs. Ce script est en crontab sur les 2 serveurs, seul la variable DISTANT
(qui est l'ip de l'autre serveur squid) change


La partie "display" et "send" est propre à la supervision utilisée ici, mais peut etre reprise pour d'autre chose.
La partie "display" et "send" est propre à la supervision utilisée ici, mais peut etre reprise pour d'autre chose.
Ligne 10 : Ligne 7 :
<pre>
<pre>
#!/bin/bash
#!/bin/bash
# Script de synchronisation bi directionnelle du fichier squid.conf avec archivage
DATE=`date +%Y-%m-%d-%H-%M`
VISION="/opt/agarik/Vision/bin/bb_send_raw"
VISION="/opt/agarik/Vision/bin/bb_send_raw"
DISPLAY="supervision.agarik.com"
DISPLAY="supervision.lc.agarik.eu"
TARGET="$(hostname | sed -e 's/\./,/g')"
TARGET="$(hostname | sed -e 's/\./,/g')"
SERVICE="sync"
SERVICE="sync"
LIFE_MESSAGE="65"
LIFE_MESSAGE="15"
LOGFILE="/var/log/synchro.log"
LOGFILE="/var/log/synchro.log"
DISTANT=192.168.26.11
DISTANT=seek1.lc.middle.agarik.eu
 
 
CONF="/var/vision_client/data/vision_client/vision_client.conf"
TMP_SCENARIO="/tmp/scenarii.$$"
PATH_BACKUP="/opt/data/archives"
PATH_PROD="/var/vision_client/data/agaseek2.0"
DATE=`date +%Y-%m-%d-%H-%M`
RETENTION=$((86400*7)) # 7 jour
DATE_EPOCH=`date +%s`


exec > /var/log/synchro.log
exec > $LOGFILE
exec 2>&1
exec 2>&1


Send()
Send()
Ligne 30 : Ligne 35 :
color=green
color=green


if ! `/usr/bin/rsync -u -e /opt/applis/openssh/bin/ssh root@$DISTANT:/opt/applis/squid/etc/squid.conf /opt/applis/squid/etc/` || ! `/usr/bin/rsync -u -e /opt/applis/openssh/bin/ssh  
# Synchronisation distant->local avec preservation du timestamp, sans suppression et uniquement les fichiers les plus a jours
/opt/applis/squid/etc/squid.conf root@$DISTANT:/opt/applis/squid/etc/`
if ! `/usr/bin/rsync --exclude=*.swp -u --times -r -e /opt/applis/openssh/bin/ssh root@$DISTANT:$PATH_PROD/ $PATH_PROD/`
then
then
         color=red
         color=red
fi
fi


if [ "$color" == "green" ]
# Je stocke les fichiers qui ont ete modifiees (localement ou a distance grace au rsync) depuis la derniere verification
cat $CONF | grep scenario | cut -d '"' -f 4 | sort | uniq > $TMP_SCENARIO
for i in `cat $TMP_SCENARIO`
do
        name=`echo $i | sed -e "s#/#,#g"`
        echo $name
        if [ ! -L $PATH_BACKUP/$name.last -o `diff $PATH_PROD/$i $PATH_BACKUP/$name.last | wc -l` -gt 0 ]; then
                echo "Mise a jour de $name" >> $LOGFILE
                cp $PATH_PROD/$i $PATH_BACKUP/$name.$DATE
                ln -sf $PATH_BACKUP/$name.$DATE $PATH_BACKUP/$name.last
        fi
done
 
# J'archive les fichiers qui datent de plus de $RETENTION, pour eviter une saturation en cas de probleme d'archivage distant, le nom est fixe et se termine par Archive
for i in `find $PATH_PROD/ -type f | grep -v \.swp$`
do
        name=`echo $i | sed -e "s#$PATH_PROD/##g"`
        name_mod=`echo $name | sed -e "s#/#,#g"`
        if [ `grep -c ^$name$ $TMP_SCENARIO` -eq 0 ]; then
                sub=0;
                basename=`basename $name`
                for j in `cat $TMP_SCENARIO`
                do
                        if [ `grep  $basename $PATH_PROD/$j | grep -c ^play` -eq 1 -o `grep  $basename $PATH_PROD/$j | grep -c ^set-field` -eq 1 ]; then
                                sub=1;
                        fi
                done
                if [ $sub -eq 0 ]; then
                        date_file=`stat $i  | grep ^Modify | cut -c 9-27`
                        date_epoch_file=`date -d "$date_file" +%s`
                        if [ $(($DATE_EPOCH-$date_epoch_file)) -gt $RETENTION ]; then
                                echo "Le fichier $name est trop vieux, il doit etre archive"
                                mv -f $i $PATH_BACKUP/$name_mod.Archive
                        fi
                fi
        fi
done
 
# Synchronisation local->distant avec preservation du timestamp, sans suppression et uniquement les fichiers les plus a jours, cela permet de pouvoir forcer une maj du partenaire a partir de ce serveur
if ! `/usr/bin/rsync --exclude=*.swp -u --times -r -e /opt/applis/openssh/bin/ssh $PATH_PROD/ root@$DISTANT:$PATH_PROD/`
then
then
         if [ `diff /opt/applis/squid/etc/squid.conf /opt/data/backup/squid.last | wc -l` -gt 0 ];
         color=red
        then
                cp /opt/applis/squid/etc/squid.conf /opt/data/backup/squid.$DATE
                ln -sf /opt/data/backup/squid.$DATE /opt/data/backup/squid.last
                service squid reload
        fi
fi
fi


Send "${color}" "$(cat $LOGFILE)"
rm -f $TMP_SCENARIO
Send "${color}" "Resultat de la synchronisation des scenarii
$(cat $LOGFILE)"
</pre>
</pre>
[[Catégorie:Script]]
[[Catégorie:Script]]

Version actuelle datée du 11 juillet 2013 à 10:12

Un double synchronisation bidirectionnelle est en place entre les 2 serveurs via rsync et ssh. Chaque serveur va lancer une mise a jour distante puis locale. Ainsi, si le serveur distant est plus recent, la premiere mise a jour ne sera pas faite, par contre, la mise a jour locale elle sera appliquee. Les heures de synchronisation dans la crontab sont decalees pour limiter les risques. A chaque mise a jour, un backup est realisé.

La partie "display" et "send" est propre à la supervision utilisée ici, mais peut etre reprise pour d'autre chose.

#!/bin/bash
VISION="/opt/agarik/Vision/bin/bb_send_raw"
DISPLAY="supervision.lc.agarik.eu"
TARGET="$(hostname | sed -e 's/\./,/g')"
SERVICE="sync"
LIFE_MESSAGE="15"
LOGFILE="/var/log/synchro.log"
DISTANT=seek1.lc.middle.agarik.eu


CONF="/var/vision_client/data/vision_client/vision_client.conf"
TMP_SCENARIO="/tmp/scenarii.$$"
PATH_BACKUP="/opt/data/archives"
PATH_PROD="/var/vision_client/data/agaseek2.0"
DATE=`date +%Y-%m-%d-%H-%M`
RETENTION=$((86400*7)) # 7 jour
DATE_EPOCH=`date +%s`

exec > $LOGFILE
exec 2>&1


Send()
{
 "${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE} ${1} $(date) ${SERVICE} ${2}"
}

color=green

# Synchronisation distant->local avec preservation du timestamp, sans suppression et uniquement les fichiers les plus a jours
if ! `/usr/bin/rsync --exclude=*.swp -u --times -r -e /opt/applis/openssh/bin/ssh root@$DISTANT:$PATH_PROD/ $PATH_PROD/`
then
        color=red
fi

# Je stocke les fichiers qui ont ete modifiees (localement ou a distance grace au rsync) depuis la derniere verification
cat $CONF | grep scenario | cut -d '"' -f 4 | sort | uniq > $TMP_SCENARIO
for i in `cat $TMP_SCENARIO`
 do
        name=`echo $i | sed -e "s#/#,#g"`
        echo $name
        if [ ! -L $PATH_BACKUP/$name.last -o `diff $PATH_PROD/$i $PATH_BACKUP/$name.last | wc -l` -gt 0 ]; then
                echo "Mise a jour de $name" >> $LOGFILE
                cp $PATH_PROD/$i $PATH_BACKUP/$name.$DATE
                ln -sf $PATH_BACKUP/$name.$DATE $PATH_BACKUP/$name.last
        fi
done

# J'archive les fichiers qui datent de plus de $RETENTION, pour eviter une saturation en cas de probleme d'archivage distant, le nom est fixe et se termine par Archive
for i in `find $PATH_PROD/ -type f | grep -v \.swp$`
do
        name=`echo $i | sed -e "s#$PATH_PROD/##g"`
        name_mod=`echo $name | sed -e "s#/#,#g"`
        if [ `grep -c ^$name$ $TMP_SCENARIO` -eq 0 ]; then
                sub=0;
                basename=`basename $name`
                for j in `cat $TMP_SCENARIO`
                do
                        if [ `grep  $basename $PATH_PROD/$j | grep -c ^play` -eq 1 -o `grep  $basename $PATH_PROD/$j | grep -c ^set-field` -eq 1 ]; then
                                sub=1;
                        fi
                done
                if [ $sub -eq 0 ]; then
                        date_file=`stat $i  | grep ^Modify | cut -c 9-27`
                        date_epoch_file=`date -d "$date_file" +%s`
                        if [ $(($DATE_EPOCH-$date_epoch_file)) -gt $RETENTION ]; then
                                echo "Le fichier $name est trop vieux, il doit etre archive"
                                mv -f $i $PATH_BACKUP/$name_mod.Archive
                        fi
                fi
        fi
done

# Synchronisation local->distant avec preservation du timestamp, sans suppression et uniquement les fichiers les plus a jours, cela permet de pouvoir forcer une maj du partenaire a partir de ce serveur
if ! `/usr/bin/rsync --exclude=*.swp -u --times -r -e /opt/applis/openssh/bin/ssh $PATH_PROD/ root@$DISTANT:$PATH_PROD/`
then
        color=red
fi

rm -f $TMP_SCENARIO
Send "${color}" "Resultat de la synchronisation des scenarii
$(cat $LOGFILE)"