Wednesday, May 04, 2011

Zsync: Alternativa a rsync para sincronizar grandes ficheros


Zsync: Alternativa a rsync para sincronizar grandes ficheros

Siempre me he sentido atraído por la elegancia con la que rsync solventa mediante algoritmos tipo ‘window checksum’ la necesidad de descargar grandes ficheros partiendo de versiones parciales.

Sin embargo rsync ahorra ancho de banda permitiendo intercambiar únicamente los bloques de datos modificados enviándolos de forma incremental (llamados deltas) a costa de un consumo elevado de CPU tanto en el cliente como el servidor.

Este elevado consumo de procesador tanto en la aplicación cliente como en el servidor tiene el grave inconveniente de no escalar adecuadamente, pues unos pocos clientes concurrentes son capaces de saturar a un servidor no excesivamente potente.

En el modelo de distribución actual de servicios, es muy habitual encontrarnos con que un fichero voluminoso, digamos una imagen de CD o DVD de una distribución de Linux debe ser descargada por múltiples clientes. De esta forma si en vez de tener que hacer los pesados cálculos computacionales de checksums de bloques una y otra vez, el servidor almacenase esta información en algún otro sitio, la ganancia sería enorme.

Pues bien, zsync permite hacer justamente esto, en el servidor se computan una sola vez los checksums necesarios y se almacenan en un fichero adicional con extensión .zsync. Este fichero .zsync es consultado por los clientes que desean sincronizar y son ellos los únicos que realizan los cómputos necesarios para averiguar que bloques han de descargar. Una vez la versión zsync que corre en el cliente conoce los bloques que ha de descargar, esta procede a descargarlos mediante el protocolo HTTP 1.1 abriendo múltiples conexiones simultáneas para obtenerlos.

Imaginemos un escenario real:

Tras haber descargado la versión Alternate del  CD de Ubuntu 11.04 a 64 bits. Posteriormente cambiamos de idea y preferimos la versión server. Aunque ambas imágenes .iso son distintas muchos de los paquetes de ambas versiones serán los mismos por lo que es de esperar que ambos ficheros tengan algunas partes comunes, de hecho en este caso con zsync nos ahorramos descargar casi la mitad del contenido de nuevo.

En este caso, como el 48.9% del contenido de la versión server era igual a la de la versión alternate que ya habíamos descargado, nos hemos ahorrado descargar 357 MB.

Por cierto, el comando fue algo tan simple como:

$ zsync -i ubuntu-11.04-alternate-amd64.iso http://releases.ubuntu.com/releases/11.04/ubuntu-11.04-server-amd64.iso.zsync

zsync, rsync, jigdo, metafiles, torrents, ... todos ellos intentan atajar el problema de distribuir grandes ficheros por la red a miles de usuarios, pero cada una tiene sus propias particularidades, ¿Para vosotros cuál es la mejor de ellas, alguna preferencia?