Utiliser rsync pour syncroniser de gros volumes de données
On se retrouve parfois dans la situation ou on a un serveur principal qui contient un certain volume de données qui doivent être copiée à intervalle régulier sur des serveurs "miroirs".
Dans ces cas de figures il peut être intéressant de configurer d'apprendre à utiliser la commande rsync (voire même de configurer un serveur rsync).
Cet utilitaire du projet samba maintenu par Wayne Davison est excellent pour les transferts de fichier en mode incrémental.
Il y a une excellente documentation et de nombreux exemples sur le site du projet http://www.samba.org/rsync/.
S'il n'est pas déjà présent sur votre box, il peut être installé relativement facilement sur votre distribution Linux avec les outils de paquetages adapté (yum install rsync rpm sous fedora & co, et apt-get install rsync pour debian, ubuntu et dérivés)
Dans mon cas je l'utilise dans des scripts executé par des crontab toutes les nuits pour synchroniser quotidiennement plus de 80 GB de géodonnées sur plusieurs serveurs de guichet cartographique (mapserver).
Sur le serveur principal j’ai installé et configuré le démon rsyncd (service linux)
Voici le contenu de mon fichier /etc/rsync.conf sur le serveur principal :
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
# /etc/rsyncd.conf
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
uid = nobody
gid = nobody
pid file = /var/run/rsyncd.pid
use chroot = no
read only = yes
max connections = 15
log file = /var/log/rsync.log
transfer logging = yes
log format = %t %a %o %m %f %b
syslog facility = local3
timeout = 300
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.jpg *.tif
[dataweb]
path = /data/dataweb
comment = Calculator dataweb
hosts allow = 192.168.50.12,192.168.50.235,192.168.50.148
[geodata]
path = /data/geodata
comment = Calculator geodata
hosts allow = 192.168.50.12,192.168.50.235,192.168.50.148
[goelanddocs]
path = /data/goelanddocs
comment = Goeland Documents
hosts allow = 192.168.50.12,192.168.50.235,192.168.50.148
[goelandlogs]
path = /backup/weblogs/goeland
comment = Goeland Logs
hosts allow = 192.168.50.12,192.168.50.235,192.168.50.11,192.168.50.148
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Typiquement ce qui est important c’est de retreindre l’accès aux adresses ip des serveurs qui doivent venir se synchroniser avec hosts allow dans chaque section
Une autre sécurité que j’ai pris dans mon cas c’est que le serveur principal n’expose pas la fonction écriture (mode read only =yes)
En gros l’idée c’est qu’on a une section par répertoire que l’on veut pouvoir synchroniser avec des droits différents
A partir du moment ou le serveur tourne (/etc/init.d/rsyncd start)
Avec un netstat -anp on peut vérifier que le démon « écoute » bien sur le port 873 (en général c’est celui la par défaut)
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 19138/rsync
On peut ensuite aller tenter une synchronisation depuis une autre bécane avec la commande rsync.
En général la première fois il faut laisser le temps pour que la copie des données s'effectue, mais dés la deuxième fois, il n'y a que ce qui a changé qui est copié. Et il s'agit bien de différence binaire ce qui fait que pour des volumes de plus de 80 GB, j'arrive à un temps de syncro inférieur à la minute (temps qui peut bien sur varier s'il y a de gros volumes de données modifiées)
Voici un exemple de script qui est configuré dans crontab pour s'éxécuter toutes les nuits sur un serveur qui doit contenir une copie de ces géodonnées :
#!/bin/bash
RSYNC="/usr/bin/rsync"
LOG="/root/log/SyncCalculator4.log"
#--archive implies -rlptgoD or --recursive --links --perms --times --group --owner --devices
OPTS="--verbose --archive --stats --partial --delete --timeout=300"
SRC1="rsync://calculator4/dataweb"
DST1="/new_data/calculator4/dataweb"
SRC2="rsync://calculator4/geodata"
DST2="/new_data/calculator4/geodata"
echo "****Started update at" `date` >> ${LOG} 2>&1
echo "**re-rsyncing the calculator dataweb tree" >> ${LOG} 2>&1
${RSYNC} ${OPTS} --exclude 'phpTempSession/' ${SRC1} ${DST1} >> ${LOG} 2>&1
echo "**re-rsyncing the calculator geodata tree" >> ${LOG} 2>&1
${RSYNC} ${OPTS} ${SRC2} ${DST2} >> ${LOG} 2>&1
echo "**End: "`date` >> ${LOG} 2>&1
Rsync est un outil vraiment formidable et qui devient vite indispensable quand on a des besoins de syncro sur des volumes de données important et/ou sur des fichiers de taille importantes.
Et il faut bien sur garder à l'esprit que l'on peut l'utiliser sans avoir configuré un serveur rsync sur un des côtés du transfert. Ainsi comme expliqué dans le man rsync avec un simple :
rsync -avz serveur1:/data/toto /data/tmp
On va transférer récursivement tous les fichiers du répertoire /data/toto sur le serveur1 dans le répertoire /data/tmp sur la machine locale ou on execute la commande. Ces fichiers seront transferes en mode "archive" ce qui assure que liens symboliques, attributs, permissions etc. soit préservés pendant le transfert. En plus avec l'option "z" la compression sera utilisée pour réduire la taille du transfert.
Mais rien ne remplace la lecture du man et pour prendre conscience des nombreuses options disponibles tel que --exclude=PATTERN qui permet de tout copier sauf certains types de fichiers
Enfin voila pour l'introduction, j'éspère que cela vous donne envie d'en savoir plus, en tout cas en ce qui me concerne cette commande est pour moi réellement indispensable et on la retrouve dans plusieurs de mes scripts de réplications de données. Alors "Bonne découverte" !
Commentaires