Reduce las copias de seguridad en un 99.5% con hashget

hashget es una herramienta gratuita y de código abierto de deduplicación similar a una utilidad de archiving que permite reducir significativamente el tamaño de las copias de seguridad y organizar esquemas de copias de seguridad incrementales y diferenciales, entre otras cosas.

Este es un artículo introductorio que describe las posibilidades. El uso de hashget (bastante sencillo) se detalla en README el proyecto y la documentación wiki.

Comparación

Siguiendo la costumbre, comenzaré con un poco de intriga: la comparación de resultados:

Muestra de datos
tamaño descomprimido
.tar.gz
hashget .tar.gz

WordPress-5.1.1
43 Mb
11 Mb ( 26% )
155 Kb ( 0.3% )

Linux kernel 5.0.4
934 Mb
161 Mb ( 20% )
4.7 Mb ( 0.5% )

Debian 9 (LAMP) LXC VM
724 Mb
165 Mb ( 23% )
4.1 Mb ( 0.5% )

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

Cada vez que realizaba una copia de seguridad de una nueva máquina virtual, no podía dejar de tener la sensación de que estaba haciendo algo mal. ¿Por qué obtengo una copia de seguridad pesada de un sistema donde mi invaluable creación inmortal es solo un index.html de una línea con el texto 'Hello world'?

¿Por qué hay un /usr/sbin/mysqld de 16 megabytes en mi copia de seguridad? ¿Acaso tengo el honor de guardar este archivo importante, y si no lo hago, se perderá para la humanidad? Probablemente no. Está almacenado en servidores de debian de alta confiabilidad (la confiabilidad y continuidad de los cuales no se comparan con lo que puedo ofrecer), así como en copias de seguridad (millones de ellas) de otros administradores. ¿Es realmente necesario crear una copia de seguridad de 10,000,000 + 1 de este archivo importante para aumentar la confiabilidad?

En realidad, hashget hashget resuelve este problema. Al empaquetar, crea una copia de seguridad muy pequeña. Al descomprimir, obtiene un sistema completamente descomprimido, similar al que tendríamos con tar -c / tar -x. (En otras palabras, es un empaquetado sin pérdida)

Cómo funciona hashget

En hashget existen los conceptos de Package y HashPackage, los cuales se utilizan para realizar la deduplicación.

Package Package (paquete). Un archivo (generalmente un archivo .deb o .tar.gz) que se puede descargar de forma segura de la red y del cual se pueden obtener uno o más archivos.

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

Deduplicación es la creación de un archivo sin archivos duplicados (si el deduplicador sabe dónde se puede descargar el original del paquete, reduce las duplicidades en el archivo).

Empaquetado

Al empaquetar, se revisan todos los archivos del directorio a empaquetar, se calculan sus sumas de verificación, 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 comprimido.

El propio empaquetado, en el caso más simple, no es más complicado que tar:

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

Desempaquetado

El desempaquetado se realiza en dos etapas. Primero, el desempaquetado normal de tar:

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

luego la recuperación desde la red:

hashget -u /path/to/data

Al restaurar, hashget lee el archivo .hashget-restore.json, descarga los paquetes necesarios, los descomprime y extrae los archivos necesarios, colocándolos en las rutas correctas, con los propietarios/grupos/permisos adecuados.

Cosas más complejas

Lo que se describió anteriormente es suficiente para aquellos que "quieren algo como tar, pero que empaquete mi Debian en 4 megabytes". A continuación, veremos cosas más complejas.

Indexación

Si hashget no hubiera tenido ningún HashPackage, simplemente no podría haber deduplicado nada.

Puedes crear un HashPackage manualmente (simplemente: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), pero hay un camino más conveniente.

Para obtener los hashpackages necesarios, hay una etapa de indexación (esto se ejecuta automáticamente con el comando --pack) y heurísticas. Al indexar, hashget "alimenta" cada archivo encontrado a todas las heurísticas disponibles que le interesan. Luego, las heurísticas pueden indexar algún Package para crear un HashPackage.

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

Archivos de sugerencias (hints)

Si en tu red se utiliza algún paquete propietario o un paquete público que no está incluido en las heurísticas de hashget, puedes añadirle un simple archivo de sugerencia hashget-hint.json siguiendo el modelo:

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

A partir de ahora, cada vez que se crea un archivo comprimido, el paquete será indexado (si no se había hecho previamente), y los archivos del paquete serán deduplicados del archivo comprimido. No se necesita ninguna programación, todo se puede hacer desde vim y ahorrar en cada copia de seguridad. Tenga en cuenta que gracias al enfoque basado en hashes, si algunos archivos del paquete se modifican localmente (por ejemplo, se cambia un archivo de configuración), los archivos modificados se mantendrán en el archivo comprimido «tal como están» y no serán reducidos.

Si algún paquete propio se actualiza periódicamente, pero los cambios no son muy grandes, se puede hacer un hint solo para las versiones principales. Por ejemplo, en la versión 1.0 se hizo un hint señalando mypackage-1.0.tar.gz, y será completamente deduplicado, luego se lanzó la versión 1.1, que es un poco diferente, y el hint no se actualizó. No hay problema. Solo se deduplican los archivos que coincidan (que se pueden recuperar) con la versión 1.0.

La heurística que procesa el archivo hint es un buen ejemplo para entender el mecanismo interno de funcionamiento de las heurísticas. Solo procesa archivos hashget-hint.json (o .hashget-hint.json con punto) e ignora todos los demás. Con este archivo, determina qué URL del paquete debe ser indexada, y hashget la indexa (si no se ha hecho anteriormente).

HashServer

Sería bastante laborioso realizar la indexación completa al crear copias de seguridad. Para ello, sería necesario descargar cada paquete, descomprimirlo, indexarlo. Por lo tanto, hashget utiliza el esquema con HashServer. Al detectar un paquete debian instalado, si no se encuentra en los HashPackage locales, primero se intenta simplemente descargar el HashPackage del servidor de hashes. Y solo si eso falla, hashget descarga y hashea el paquete (y lo sube al hashserver, para que en adelante el hashserver lo proporcione).

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

Copias de seguridad incrementales y diferenciales, caducidad programada

hashget permite crear un esquema muy sencillo de copias de seguridad incrementales y diferenciales. ¿Por qué no indexar nuestra propia copia de seguridad (con todos nuestros archivos únicos)? Un solo comando --submit ¡Y todo está listo! La próxima copia de seguridad que creará hashget no incluirá archivos de este archivo.

Pero este no es un enfoque muy bueno, porque podría suceder que, al restaurar, tengamos que revisar todas las copias de seguridad de hashget de toda la historia (si en cada una hay al menos un archivo único). Para esto existe el mecanismo de expiración programada de respaldos. Al indexar, se puede especificar la fecha de caducidad del HashPackage --expires 2019-06-01, y al llegar a esa fecha (a partir de las 00:00), no se utilizará. El archivo en sí se puede conservar después de esta fecha (aunque hashget puede mostrar convenientemente las URL de todas las copias de seguridad que están caducadas/caducarán en este momento o en cualquier fecha).

Por ejemplo, si el primer día se realiza una copia de seguridad completa e indexarla con un tiempo de vida hasta el final del mes, obtendremos un esquema de copia de seguridad diferencial.

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

A diferencia de los esquemas tradicionales, hashget permite utilizar múltiples fuentes base. La copia de seguridad se reducirá tanto por la eliminación de archivos de copias de seguridad anteriores (si los hay), como por archivos públicos (los que se pueden descargar).

Si por alguna razón no confiamos en la fiabilidad de los recursos de Debian (https://snapshot.debian.org/) o usamos otra distribución, podemos hacer una copia de seguridad completa una vez con todos los paquetes y luego depender de ella (desactivando la heurística). Ahora, si todos nuestros servidores de distribución resultan no estar disponibles (en la red de souvenirs o durante un apocalipsis zombi), pero nuestras copias de seguridad están en orden, podremos restaurar desde cualquier copia de seguridad diferencial corta, dependiendo solo de nuestras copias de seguridad anteriores.

Hashget depende únicamente de fuentes de recuperación fiables según SU criterio. Las que considere confiables serán las que se utilicen.

FilePool y Glacier

Mecanismo FilePool permite no tener que acceder constantemente a servidores externos para descargar paquetes, y usar paquetes del directorio local o de un servidor corporativo, por ejemplo:

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

o

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

Para crear un pool en un directorio local, simplemente necesitas crear un directorio y agregar archivos en él; hashget encontrará lo que necesita a través de los hashes. Para hacer que el pool esté disponible a través de HTTP, debes crear enlaces simbólicos de una manera especial, lo que se puede hacer con un único comando (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). El HTTP FilePool consiste en archivos estáticos, por lo que cualquier servidor web básico puede atenderlo, casi sin carga en el servidor.

Gracias a FilePool, como recursos básicos puedes utilizar no solo recursos en http(s), sino también, por ejemplo,, Amazon Glacier.

Después de subir una copia de seguridad a Glacier, obtendremos su ID de carga (Upload ID) y lo utilizaremos como 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) estarán basadas en esta copia y serán más cortas. Después de descomprimir la copia diferencial, podemos ver a qué recursos se refiere:

hashget --info /tmp/unpacked/ list

y simplemente con un script de shell descargar todos esos archivos de Glacier al pool y ejecutar una restauración normal: hashget -u /tmp/unpacked --pool /tmp/pool

¿Vale la pena?

En el caso más sencillo, simplemente pagarás menos por las copias de seguridad (si las estás almacenando en algún lugar en la nube por un costo). Puede ser — mucho, mucho menos.

Pero esto no es lo único. La cantidad se convierte en calidad. Puedes utilizar esto para obtener una mejora de calidad en el esquema de copias de seguridad. Por ejemplo, como ahora nuestras copias de seguridad son más cortas, podríamos hacer copias de seguridad diarias en lugar de mensuales. Almacenarlas no durante seis meses, como antes, sino durante 5 años. Antes las almacenábamos en un almacenamiento 'frío' lento pero barato (Glacier), ahora puedes almacenarlas en uno 'caliente', desde donde puedes descargar rápidamente la copia de seguridad y restaurarte en minutos, no en un día.

Puedes aumentar la confiabilidad del almacenamiento de copias de seguridad. Si actualmente las almacenamos en un único almacenamiento, al reducir el volumen de copias de seguridad, podremos almacenarlas en 2-3 ubicaciones sin problemas, incluso si una de ellas se daña.

¿Cómo probar y empezar a usarlo?

Visita la página de GitLab https://gitlab.com/yaroslaff/hashget, instálalo con un solo comando (pip3 install hashget[plugins]) y simplemente leemos y seguimos el quick-start. Creo que hacer todas las cosas simples tomará de 10 a 15 minutos. Luego, se puede intentar comprimir sus máquinas virtuales, crear, si es necesario, archivos hint para una mayor compresión, jugar con los pools, la base de datos local de hashes y el servidor de hashes, si es que interesa, y al día siguiente, ver cuál será el tamaño de la copia de seguridad incremental sobre la de ayer.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster