Reduzca las copias de seguridad en un 99.5% con hashget

hashget es un deduplicador gratuito basado en opera, una utilidad similar a un archivador, que puede reducir significativamente el tamaño de las copias de seguridad, así como organizar esquemas de copia de seguridad incrementales y diferenciales y más.


Este es un artículo de revisión para describir las características. El uso del propio hashget (bastante simple) se describe en la documentación README y wiki del proyecto.


Comparación


De acuerdo con la ley del género, comenzaré de inmediato con la intriga, comparando los resultados:


Muestra de datostamaño desempaquetado.tar.gzhashget .tar.gz
Wordpress-5.1.143 Mb11 Mb (26%)155 Kb ( 0.3% )
Kernel de Linux 5.0.4934 Mb161 Mb (20%)4,7 Mb ( 0,5% )
Debian 9 (LAMP) LXC VM724 Mb165 Mb (23%)4,1 Mb ( 0,5% )

Antecedentes de lo que debería ser una copia de seguridad ideal y efectiva


Cada vez que hacía una copia de seguridad de una máquina virtual recién creada, me perseguía la sensación de que estaba haciendo algo mal. ¿Por qué obtengo una copia de seguridad pesada de un sistema en el que mi invaluable creatividad imperecedera es un index.html de una sola línea con el texto "Hola mundo"?


¿Por qué hay 16 megabytes / usr / sbin / mysqld en mi copia de seguridad? ¿Es realmente en este mundo que tengo el honor de almacenar este archivo importante, y si no puedo hacerlo, se perderá para la humanidad? Lo más probable es que no. Se almacena en servidores Debian altamente confiables (cuya confiabilidad y continuidad no se pueden comparar con lo que puedo proporcionar), así como en copias de seguridad (millones de ellas) de otros administradores. ¿Realmente necesitamos crear más de 10,000,000 de la primera copia de este importante archivo para aumentar la confiabilidad?


En general, hashget resuelve este problema. Al empacar, crea una copia de seguridad muy pequeña. Al desempacar: un sistema completamente desempaquetado, similar al que sería con tar -c / tar -x . (En otras palabras, este es un embalaje sin pérdidas)


Cómo funciona el hashget


Hashget tiene los conceptos de paquete y HashPackage, con su ayuda realiza deduplicación.


Paquete Un archivo (generalmente un archivo .deb o .tar.gz) que se puede descargar de manera confiable desde la red y del que se pueden obtener uno o más archivos.


HashPackage es un pequeño archivo JSON que representa el paquete, que incluye la URL del paquete y la suma hash (sha256) de los archivos que contiene. Por ejemplo, para el paquete mariadb-server-core de 5 megabytes de tamaño, el tamaño del paquete hash es de solo 6 kilobytes. Unas mil veces más pequeño.


Deduplicación : creación de un archivo sin archivos duplicados (si el deduplicador sabe dónde se puede descargar el paquete original, reduce los duplicados del archivo).


Embalaje


Al empaquetar, se ven todos los archivos del directorio empaquetado, se consideran sus sumas hash y, si la suma se encuentra en uno de los HashPackage conocidos, los metadatos del archivo (nombre, hash, permisos, etc.) se guardan en un archivo especial .hashget-restore.json, que también se incluirá en el archivo.


El empaque en sí en el caso más simple no parece más complicado que el alquitrán:


 hashget -zf /tmp/mybackup.tar.gz --pack /path/to/data 

Desempacando


El desempaque se realiza en dos etapas. Primero, el desempaque de alquitrán habitual:


 tar -xf mybackup.tar.gz -C /path/to/data 

luego restaurar desde la red:


 hashget -u /path/to/data 

Al recuperarse, el hashget lee el archivo .hashget-restore.json, descarga los paquetes necesarios, los descomprime y extrae los archivos necesarios, configurándolos en las rutas correctas, con el propietario / grupo / permisos necesarios.


Cosas más complicadas


Lo que se describe arriba ya es suficiente para aquellos que "quieren como alquitrán, pero para empacar mi Debian en 4 megabytes". Más adelante veremos cosas más difíciles.


Indexación


Si un hashget no tenía un solo HashPackage, entonces simplemente no podría deduplicar nada.


También puede crear un HashPackage manualmente (simplemente: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my ), pero hay una manera más conveniente.


Para obtener el hashpackage que necesita, hay un paso de indexación (se realiza automáticamente cuando se --pack comando --pack ) y heurística . Al indexar, el hashget "alimenta" cada archivo encontrado a todas las heurísticas existentes que le interesan. La heurística puede indexar cualquier paquete para crear un HashPackage.


Por ejemplo, una heurística de Debian adora el archivo / var / lib / dpkg / status y detecta los paquetes debian instalados, y si no están indexados (HashPackage no se ha creado para ellos), los descarga e indexa. El resultado es un efecto muy agradable: el hashget siempre deduplicará efectivamente los sistemas operativos Debian, incluso si tienen los paquetes más recientes.


Archivos de sugerencias


Si su red utiliza algún tipo de paquete propietario o un paquete público que no está incluido en la heurística de hashget, puede agregarle un simple archivo de sugerencia hashget-hint.json de la siguiente manera:


 { "project": "wordpress.org", "url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip" } 

Además, cada vez que se crea el archivo, el paquete se indexará (si no es así anteriormente) y los archivos del paquete se deduplicarán del archivo. No se necesita programación, todo se puede hacer desde vim y guardar en cada copia de seguridad. Tenga en cuenta que, gracias al enfoque mediante hashes, si algunos archivos del paquete se cambian localmente (por ejemplo, se cambia el archivo de configuración), los archivos modificados se guardarán en el archivo "tal cual" y no se reducirán.


Si algunos de sus propios paquetes se actualizan periódicamente, pero los cambios no son muy grandes, solo puede insinuar las versiones principales. Por ejemplo, en la versión 1.0 hicieron una pista indicando mypackage-1.0.tar.gz, y será completamente deduplicada, luego lanzaron la versión 1.1, que es ligeramente diferente, pero no actualizaron la pista. Nada de qué preocuparse. Solo se deduplican los archivos que coinciden (que se pueden restaurar) con la versión 1.0.


Una heurística que procesa un archivo de pistas es un buen ejemplo para comprender el mecanismo interno de la heurística. Solo procesa archivos hashget-hint.json (o .hashget-hint.json con un punto) e ignora a todos los demás. Al usar este archivo, determina qué URL del paquete debe indexarse ​​y hashget lo indexa (si esto no se ha hecho antes)


Hashver


Sería bastante lento realizar una indexación completa al crear copias de seguridad. Para hacer esto, debe descargar cada paquete, descomprimir, indexar. Por lo tanto, el hashget usa un esquema con un HashServer . Si se instala un paquete Debian, si no se encuentra en el HashPackage local, primero se intenta descargar el HashPackage del servidor hash. Y solo si esto no funciona: el propio hashget descarga y procesa el paquete (y lo carga en el servidor hash, de modo que el servidor hash lo proporcione más adelante).


HashServer: un elemento opcional del esquema, no crítico, se usa exclusivamente para acelerar y reducir la carga en los repositorios. Se desconecta fácilmente (con la opción --hashserver sin parámetros). Además, puede crear fácilmente su propio servidor hash .


Copias de seguridad incrementales y diferenciales, obsolescencia planificada


El hashget hace que sea muy simple hacer copias de seguridad incrementales y diferenciales . ¿Por qué no indexamos nuestra copia de seguridad (con todos nuestros archivos únicos)? Un equipo: ¡ --submit y listo! La próxima copia de seguridad que creará el hashget no incluirá archivos de este archivo.


Pero este no es un enfoque muy bueno, porque puede resultar que durante la recuperación tendremos que eliminar todas las copias de seguridad de hashget para todo el historial (si cada una tiene al menos un archivo único). Hay un mecanismo para la obsolescencia de la copia de seguridad programada para esto. Al indexar, puede especificar la fecha de vencimiento de HashPackage - --expires 2019-06-01 , y en esta fecha (desde las 00:00), no se utilizará. El archivo en sí no se puede eliminar después de esta fecha (aunque el hashget puede mostrar convenientemente las URL de todas las copias de seguridad que tenemos podridas en ese momento o en cualquier fecha).


Por ejemplo, si realiza una copia de seguridad completa el primer día y la indexa con una vida útil antes de fin de mes, obtendremos un esquema de copia de seguridad diferencial.


Si también indexamos nuevas copias de seguridad, habrá un esquema de copias de seguridad incrementales.


A diferencia de los esquemas tradicionales, el hashget le permite usar varias fuentes básicas. La copia de seguridad se reducirá debido a la reducción de los archivos de las copias de seguridad anteriores (si corresponde) y debido a los archivos públicos (lo que se puede descargar).


Si por alguna razón no confiamos en la confiabilidad de los recursos de Debian ( https://snapshot.debian.org/ ) o usamos otra distribución, podemos hacer una copia de seguridad completa con todos los paquetes una vez y luego confiar en ella ( deshabilitando la heurística ) Ahora, si todos los servidores de nuestras distribuciones resultan inaccesibles para nosotros (en la Internet de recuerdo o durante el apocalipsis zombie), pero nuestras copias de seguridad están en orden, podemos recuperarnos de cualquier copia de seguridad de diferencia breve que se base solo en nuestras copias de seguridad anteriores.


Hashget se basa únicamente en fuentes confiables de recuperación a su discreción. Lo que consideras confiable: se usarán.

FilePool y Glacier


El mecanismo FilePool le permite no acceder constantemente a servidores externos para descargar paquetes, sino usar paquetes de un directorio local o servidor corporativo, por ejemplo:


 $ hashget -u . --pool /tmp/pool 

o


 $ hashget -u . --pool http://myhashdb.example.com/ 

Para crear un grupo en un directorio local, simplemente cree un directorio y cargue archivos en él, el hashget encontrará lo que necesita por hash. Para hacer que el grupo sea accesible a través de HTTP, debe crear enlaces simbólicos de una manera especial, esto se hace con un comando ( hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool ). HTTP FilePool es un archivo estático, por lo que cualquier servidor web simple puede servirlo, la carga en el servidor es casi cero.


Gracias a FilePool, no solo los recursos http (s) se pueden usar como recursos básicos, sino también, por ejemplo , Amazon Glacier.


Después de la carga de respaldo al glaciar, obtenemos su ID de carga y la usamos como una URL. Por ejemplo:


 hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01 

Ahora las nuevas copias de seguridad (diferenciales) dependerán de esta copia de seguridad y serán más cortas. Después de desempacar el tar, podemos ver en qué recursos se basa:


 hashget --info /tmp/unpacked/ list 

y simplemente use el script de shell para descargar todos estos archivos del glaciar en el grupo y ejecute la recuperación habitual: hashget -u / tmp / unpacked --pool / tmp / pool


¿Vale la pena el juego?


En el caso más simple, simplemente pagará menos por las copias de seguridad (si las almacena en algún lugar de la nube por dinero). Quizás, mucho, mucho menos.


Pero este no es el único. La cantidad entra en calidad. Puede usar esto para obtener una actualización del esquema de copia de seguridad de alta calidad. Por ejemplo, dado que nuestras copias de seguridad ahora son más cortas, no puede hacer una copia de seguridad mensual, sino diaria. Guárdelos no seis meses, como antes, sino 5 años. Anteriormente, se almacenaban en un almacenamiento "frío" lento pero barato (Glacier), ahora puede almacenar en caliente, desde donde siempre puede descargar rápidamente una copia de seguridad y recuperarla en minutos, no en un día.


Puede aumentar la confiabilidad del almacenamiento de respaldo. Si ahora los almacenamos en una tienda, al reducir el volumen de las copias de seguridad, podemos almacenar en 2-3 tiendas y sobrevivir de forma segura si una de ellas se daña.


¿Cómo probar y empezar a usar?


Vamos a la página de gitlab https://gitlab.com/yaroslaff/hashget , lo instalamos con un comando ( pip3 install hashget[plugins] ) y simplemente leemos y ejecutamos el inicio rápido. Creo que todas las cosas simples que hacer: tomará 10-15 minutos. Luego, puede intentar sacudir sus máquinas virtuales, crear archivos de sugerencias si es necesario, apretar más, jugar con grupos, una base de datos de hash local y un servidor de hash, si es interesante, y al día siguiente ver cuál será el tamaño de la copia de seguridad incremental de ayer.


Restic + HashGet


(Este capítulo se agregó más tarde. Gracias a los comentaristas por sus críticas y motivación).


Existe una buena herramienta conveniente para las copias de seguridad: restic . También puede realizar deduplicación, pero solo dentro del repositorio, no puede deduplicación externa, lo que el hashget hace fácilmente . ¡Pero en combinación de restic + hashget , logramos usar las ventajas de ambos enfoques!


Preparación (descomprimir wordpress e indexarlo):


 # wget -q https://wordpress.org/wordpress-5.2.2.tar.gz # hashget --submit https://wordpress.org/wordpress-5.2.2.tar.gz -p my --file wordpress-5.2.2.tar.gz --hashserver # tar -xf wordpress-5.2.2.tar.gz # du -sh wordpress 46M wordpress 

Agregar instantánea a restic vía


 # hashget -X exclude-list --prepack wordpress --hashserver Saved: 1468 files, 1 pkgs, size: 40.5M. Download: 10.7M # restic --exclude-file exclude-list backup wordpress password is correct scan [/tmp/wp/wordpress] scanned 193 directories, 367 files in 0:02 [0:04] 100.00% 700.829 KiB / 700.829 KiB 560 / 560 items 0 errors ETA 0:00 duration: 0:04 snapshot 76b54230 saved # du -sh /tmp/restic-repo/ 2,1M /tmp/restic-repo/ 

En esta etapa, agregamos una instantánea del catálogo (más de 40 Mb), y el tamaño del repositorio aumentó solo 1 Mb.


La recuperación se realiza mediante dos comandos:


 # restic restore 76b54230 -t unpacked password is correct restoring <Snapshot 76b54230 of [/tmp/wp/wordpress] at 2019-06-19 04:30:55.760618336 +0700 +07 by root@braconnier> to unpacked # hashget -u unpacked/wordpress/ --hashserver Recovered 1468/1468 files 40.5M bytes (0 downloaded, 0 from pool, 10.7M cached) in 1.56s 

Source: https://habr.com/ru/post/454826/


All Articles