rsync para evitar transferencias redundantes para copias exactas

rsync para evitar transferencias redundantes para copias exactas

Tengo más de 100 microservicios que primero se crean en una máquina local y luego se sincronizan en la máquina de destino y se inician.

Todos los microservicios utilizan un archivo fat.jar compartido, le cambian el nombre y lo almacenan en su carpeta de distribución.

/serviceA
  /a.jar
/serviceB
  /b.jar
...

Cuando sincronizamos esto con el servidor, rsync no se dará cuenta de que todos los archivos jar (que en conjunto representan el 99% de la distribución) son exactamente el mismo fat.jar. Entonces, si rsync fuera más inteligente, en realidad solo podría transferir un a.jar y luego copiarlo para todos los demás (ya que el tamaño y el hash de ellos serán exactamente los mismos).

¿Es posible hacer esto con rsync o debo buscar otra solución? Esto puede reducir significativamente la velocidad de implementación, ¡especialmente cuando tengo mala conexión a Internet!

Respuesta1

No cambie el nombre del original fat.jaren cada servidor.

Si algo tiene que acceder al archivo con otro nombre, cree un enlace simbólico al archivo.

Para serviceA:

ln -s fat.jar a.jar

Para serviceB:

ln -s fat.jar b.jar

Respuesta2

Hay algunosdeduplicaciónherramientas que pueden hacer esto por usted. Si instalascopia de seguridad, que probablemente esté disponible como un paquete para su sistema, en las máquinas locales y remotas, puede alimentarlo con uno tarde sus archivos y encontrará las partes que están duplicadas y no conservará estas copias.

No es necesario cambiar la fuente en absoluto, ya sea cambiando el nombre, mediante enlaces físicos o enlaces suaves. Aquí hay un script de ejemplo que crea un archivo grande y lo copia en 3 directorios A, B, C. Luego, guarda los directorios (sin comprimir) en formato zbackup. Comparamos el tamaño del resultado.repositorio, y qué sería un alquitrán comprimido convencional. Normalmente, en esta etapa el repositorio ahora se copiaría en el control remoto y se descomprimiría en el control remoto, pero el script simplemente lo descomprime mediante tar en un nuevo directorio para que podamos compararlo con el original.

ZB=/tmp/zrepo
cd /tmp/; mkdir try; cd try
dd count=5000 if=/dev/urandom of=file
for dir in A B C
do  mkdir $dir
    date >$dir/a
    cp file $dir/b$dir
done
ls -l /tmp/try/*/*
zbackup init --non-encrypted $ZB
tar cf - A B C  | zbackup backup --non-encrypted $ZB/backups/x
du -bs $ZB
tar czf - A B C | wc -c
cd /tmp; mkdir copy; cd copy
zbackup restore --non-encrypted $ZB/backups/x | tar xf -
ls -l /tmp/copy/*/*

Éstos son algunos de los resultados. Como puede ver, el repositorio ocupa solo 2632045 bytes, en comparación con un tar comprimido de 7682010 bytes, lo que muestra que las 3 copias del archivo grande se han deduplicado en 1 copia.

-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/A/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/A/bA
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/B/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/B/bB
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/C/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/C/bC

4       /tmp/zrepo/info
4       /tmp/zrepo/index/2e0ec29dfd5742005a477525009cfa3a6677f28cffaf2ae5
4       /tmp/zrepo/backups/x
2052    /tmp/zrepo/bundles/e0/e0a14717771602304b480202e05a4f796e8346b7033c231e
2052    /tmp/zrepo/bundles/e0
520     /tmp/zrepo/bundles/3c/3cf381e405fc278c4336ae331c5ea6a9d67b3147792567bc
520     /tmp/zrepo/bundles/3c

2632045 /tmp/zrepo # du -bs of repo

7682010            # size of tar z

-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/A/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/A/bA
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/B/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/B/bB
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/C/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/C/bC

Respuesta3

sí, es porque cambias el nombre de los archivos, por lo que es un archivo diferente cada vez para rsync. rsync no está destinado a encontrar duplicados. Es sólo una herramienta rápida de copia de archivos. Si conoce los archivos que no copiará varias veces, simplemente exclúyalos con una regla de filtro rsync y trátelos de forma separada.

Ejemplo rsync -uva --filter "- a.jar" /somedir/ /otherdir/, copiará todo desde /somedir a /otherdir excepto a.jar

información relacionada