Qué es la deduplicación?
La deduplicación de datos permite a los usuarios reducir los datos redundantes y administrar de manera más efectiva la actividad de respaldo, además de garantizar respaldos más efectivos, ahorros de costos y beneficios de equilibrio de carga. BIen, esa es la definición, por ahora solo tenga en mente que es ideal para sistemas de backups, entenderá el por qué muy pronto…
Tipos de deduplicación
- Hay más de un tipo de deduplicación de datos. En su forma más básica, el proceso ocurre a nivel de archivos individuales, eliminando archivos idénticos. Esto también se denomina almacenamiento de instancia única (*SIS- Single instance storage*) o deduplicación a nivel de archivo.
- En el siguiente nivel, la deduplicación identifica y elimina los segmentos redundantes de datos que son iguales, incluso cuando los archivos en los que se encuentran no son completamente idénticos. Esto se denomina deduplicación a nivel de bloque o deduplicación de subarchivos y libera espacio de almacenamiento. En este mundillo cuando las personas se refieren a la deduplicación, se refiere a la deduplicación a nivel de bloque. Si se refieren a la deduplicación a nivel de archivo, usarán ese modificador.
Deduplicación de datos explicada
La mayoría de la deduplicación a nivel de bloque se aplica a bloques de tamaños fijos (usualmente el tamaño manejado es de 4KB). Pero también hay deduplicación de longitud variable o deduplicación de bloque variable, donde los datos se dividen en límites de bloque no fijos. Una vez que el conjunto de datos se ha dividido en una serie de pequeños fragmentos de datos, el resto del proceso suele permanecer igual.
El sistema de deduplicación le aplica a cada fragmento un algoritmo hash, como SHA-1, SHA-2 o SHA-256, que crea un código alfanumérico criptográfico (denominado hash) para el fragmento. Luego, el valor de ese hash se compara con una tabla hash o una base de datos hash para ver si existe. Si no existe, el nuevo fragmento se escribe en el almacenamiento y el hash se agrega a la tabla/base de datos hash; si ya existe, se descarta y se agrega una referencia adicional a la tabla hash/base de datos.
Beneficios de la deduplicación
Imagíne cuántas veces se realiza un pequeño cambio en un documento. Una copia de seguridad incremental hará una copia de seguridad de todo el archivo, aunque haya cambiado solo un byte. Cada activo empresarial crítico tiene el potencial de contener datos duplicados.
En muchas organizaciones, hasta el 80 por ciento de los datos corporativos están duplicados.
Ejemplos de la vida real donde la deduplicación puede ayudar mucho
- Bien, hasta ahora se ha hablado de la teoría, pero… Imagine que el gerente de una empresa envía 500 copias del mismo archivo de 10 MB (a quién no le ha ocurrido que el volumen de almacenamiento del servidor de correos se llena?), un informe de perspectivas financieras con gráficos, a toda la empresa. El servidor de correo electrónico de la empresa ahora almacena las 500 copias de ese archivo. Si todas las bandejas de entrada de correo electrónico utilizan un sistema de copia de seguridad de datos, las 500 copias se guardan, consumiendo 5000 MB de espacio en el servidor. Incluso un sistema básico de deduplicación de datos a nivel de archivo guardaría solo una instancia del informe. Todas las demás instancias solo se refieren a esa única copia almacenada. Esto significa que el ancho de banda final y la carga de almacenamiento en el servidor son solo 1 MB de los datos únicos.
- Otro ejemplo es lo que sucede cuando las empresas realizan copias de seguridad incrementales de archivos completos, donde solo han cambiado unos pocos bytes, y ocasionalmente realizan copias de seguridad completas debido a desafíos de diseño antiguos en los sistemas de copia de seguridad. Un servidor de archivos de 10 TB crearía 80 TB de copias de seguridad solo a partir de ocho salvas completas semanales y probablemente otros 8 TB más o menos de copias de seguridad incrementales durante el mismo período de tiempo. Un buen sistema de deduplicación puede reducir estos 88 TB a menos de 20 TB, sin reducir la velocidad de restauración.
Ejemplo de cuanto espacio se podría salvar usando deduplicación
Digamos que tiene dos emails guardados en formato electrónico. Ambos emails tienen el mismo encabezado (dirección, fecha, etc.) y cierre, pero tienen diferentes asuntos y cuerpos. En un volumen regular, ambos emails ocuparían su tamaño completo en el disco. En un volumen deduplicado, el primer email se escribe en su totalidad, y el segundo email contiene solo el saludo y el cuerpo con punteros al encabezado y cierre en la primera letra. Ambos aparecen con el asunto, saludo, cuerpo y cierre correctos cuando se abren. Si observa los tamaños de archivo de ambos archivos, verá que el tamaño del segundo archivo es más pequeño que el tamaño del archivo original. Si se tuviera queguardar emails adicionales con el mismo encabezado y cierre, esos nuevos archivos ocupan incluso menos espacio. A medida que agrega más datos deduplicados/comunes al disco, ahorra más espacio (Tabla 1).
Deduplicación | Tamaño/Tamaño sin Deduplicación | Cuánto se ahorra | |
Email 1 | 20K | 20K/20K | 0K |
Email 2 | 16K | 36K/40K | 4K |
Email 3 | 16K | 52K/60K | 8K |
Email 4 | 16K | 68K/80K | 12K |
A primera vista, esto puede no parecer un gran ahorro, pero cuando se trata de grandes conjuntos de datos, puede almacenar grandes cantidades de datos en una minúscula cantidad de espacio. Es muy posible lograr una tasa de deduplicación de 20x, por lo que se podría almacenar 10 TB de datos en 500 GB de espacio en disco.
Dado que el mismo patrón de bytes puede ocurrir docenas, cientos o incluso miles de veces, piense en la cantidad de veces que realiza solo pequeños cambios en un archivo de PowerPoint, la cantidad de datos duplicados puede ser significativa.
Instalando VDO en Ubuntu
Una vez concluida la parte teórica, viene la parte práctica. Por lo tanto, lo primero es hacer un update y un upgrade, para luego instalar algunos paquetes necesarios:
apt update -y && apt upgrade -y && \ apt install git build-essential libdevmapper-dev libz-dev uuid-dev flex bison linux-source libblkid-dev -y
Compilación de kvdo
Ahora es necesario upgradear el kernel de Ubunut 20.04 (por defecto viene el kernel 5.4) al 5.9, el siguiente comando los clona, instala y luego aplica un reinicio para que el sistema aplique los cambios necesarios:
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.9/amd64/linux-headers-5.9.0-050900_5.9.0-050900.202010112230_all.deb && \ wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.9/amd64/linux-headers-5.9.0-050900-generic_5.9.0-050900.202010112230_amd64.deb && \ wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.9/amd64/linux-image-unsigned-5.9.0-050900-generic_5.9.0-050900.202010112230_amd64.deb && \ wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.9/amd64/linux-modules-5.9.0-050900-generic_5.9.0-050900.202010112230_amd64.deb && \ dpkg -i *.deb && \ shutdown now -r
Ahora se procede a descargar y compilar kvdo que no es más que el módulo para el kernel de vdo (la herramienta del userspace que nos permitirá manipular los volúmenes creados):
git clone https://github.com/rhawalsh/kvdo.git && \ cd kvdo && \ make -C /usr/src/linux-headers-5.9.0-050900-generic/ M=$('pwd') modules
Una vez termine el proceso se adjunta el Module.symvers generado al que esta usando nuestro kernel:
cat Module.symvers >> /lib/modules/5.9.0-050900-generic/build/Module.symvers
Ahora se copian los módulos compilados para que nuestro sistema sea capaz de utilizarlos:
mkdir /lib/modules/5.9.0-050900-generic/extra/ && \ cp /opt/kvdo/uds/uds.ko /lib/modules/5.9.0-050900-generic/extra/ && \ cp /opt/kvdo/vdo/kvdo.ko /lib/modules/5.9.0-050900-generic/extra/
Haciendo uso de depmod le indicamos al kernel que actualice sus módulos para que sea capaz de utilizarlos (correr el siguiente comando puede tomarse su tiempo, puede agregársele el argumento –verbose para ver exactamente qué hace):
depmod -a
Una vez haya terminado lo anterior intentamos ver si el módulo esta en uso, para ello ejecutamos el siguiente comando y si vemos que no recibimos respuesta, es que está correctamente instalado:
modprobe kvdo
Se pueden revisar los logs del sistema con el **dmesg** en busca de los módulos:
dmesg [....] kern :info : [ +0.003977] uds: modprobe: loaded version 8.1.0.351 kern :info : [ +0.005120] kvdo: modprobe: loaded version 8.1.0.316 [....]
Se comprueba la versión:
modinfo kvdo filename: /lib/modules/5.9.0-050900-generic/extra/kvdo.ko version: 8.1.0.316 license: GPL author: Red Hat, Inc. description: device-mapper target for transparent deduplication srcversion: F021DCCB4284C7E05BCCF77 depends: uds retpoline: Y name: kvdo vermagic: 5.9.0-050900-generic SMP mod_unload
Compilación de vdo
Ya se instalaron las herramientas del kernel, ahora se necesitan las del userspace (o sea, los comandos que corremos):
git clone https://github.com/rhawalsh/vdo.git && \ cd vdo && \ make && \ make install
Y se comprueba a ver si se compilo correctamente:
which vdo && which vdoformat && which vdostats /usr/bin/vdo /usr/bin/vdoformat /usr/bin/vdostats
Se comprueba la version:
vdoformat --version vdoformat version is: 8.1.0.264
Creación de un volumen VDO
Ya se sabe qué es y como funciona la deduplicación, y ya se sabe que la herramienta que se utilizar es vdo. En este laboratorio se tiene una VM la cual tiene un disco (sdb) de 10GB, sobre este disco es sobre el cual se creará el volumen vdo.
Se procede a crear el volumen vdo, donde el argumento –vdoLogicalSize será el espacio que nosotros le impongamos. En la documentación oficial recomiendan utilizar x3 cuando se va a utilizar como volumen para salvas de ficheros, y un x10 cuando se va a utilizar como volumen para salvas de VMs:
vdo create \ --name=vdo1 \ --device=/dev/sdb \ --vdoLogicalSize=30G Creating VDO vdo1 The VDO volume can address 6 GB in 3 data slabs, each 2 GB. It can grow to address at most 16 TB of physical storage in 8192 slabs. If a larger maximum size might be needed, use bigger slabs. Starting VDO vdo1 Starting compression on VDO vdo1 VDO instance 0 volume is ready at /dev/mapper/vdo1
De un disco de 10GB ahora tenemos uno de 30!!!!!!!!!!!!!!!!!!
Una vez creado, se le da formato al volumen, se crea la carpeta de montaje y se monta:
mkfs.xfs -K /dev/mapper/vdo1 && \ mkdir -m 1777 /mnt/vdo1 && \ mount /dev/mapper/vdo1 /mnt/vdo1 && \ chmod 777 /mnt/vdo1/
Si se desea que se automonte con cada inicio:
echo "/dev/mapper/vdo1 /mnt/vdo1 xfs defaults,_netdev,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0" >> /etc/fstab
Para ver el estado del volumen actual:
vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 10.0G 4.0G 6.0G 40% N/A
Al ser un hdd de tan solo 10G el vdo introduce un encabezado de unos 4G. Lo que nos permite utilizar unos 6G deduplicados!!! Piense cuando el volumen sea de teras!!!
Probar el funcionamiento:
Para probar el funcionamiento se procede a copiarle un mismo archivo (un comprimido) solo con el nombre cambiado, para ver cuanto aumenta. El primer archivo copiado (1.3G):
ls /mnt/vdo1 -rw-rw-r-- 1 user user 1.3G 2021-11-26 19:22 'Season 4.rar'
Podremos checkear el estado del volumen vdo con:
vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 10.0G 5.3G 4.7G 52% 0%
Se procede a copiar el segundo (1.3G) (nótese que, al copiar el mismo archivo, la velocidad de la copia se aumenta notablemente):
-rw-rw-r-- 1 user user 1.3G 2021-11-26 19:22 'Season 4.rar' -rw-rw-r-- 1 user user 1.3G 2021-11-26 19:25 Season.rar
Y se comprueba el estado:
vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 10.0G 5.3G 4.7G 52% 49%
Como se puede apreciar, el volumen no creció en espacio!!!. Se puede comprobar con:
vdostats --verbose /dev/mapper/vdo1 | grep -B6 "saving percent" physical blocks : 2621440 logical blocks : 7864320 1K-blocks : 10485760 1K-blocks used : 5544896 1K-blocks available : 4940864 used percent : 52 saving percent : 49
Ahora, voy a copiar un .rar (1.6G) similar a los anteriores (le agregué un archivo extra a la carpeta antes de comprimirla), una vez terminada la copia:
vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 10.0G 6.9G 3.1G 69% 30%
La suma total de los 3 archivos que copiamos es: 1.3G+1.3G+1.6G = 4.2G. A esto hay que sumarle los 4G de encabezados que introduce el vdo, 4.2G+4G = 8.2G, sin embargo el vdostats nos muestra que tiene ocupado 6.9G en total, salvando unos 8.2G-6.9 = 1.3G!!!
Si comprobamos el espacio del volumen con:
df -hT Filesystem Type Size Used Avail Use% Mounted on [...] /dev/mapper/vdo1 xfs 30G 4.9G 26G 17% /mnt/vdo1
Veremos como se tiene un volumen de 30G el cual se va llenando poco a poco.
Borrar archivos
Qué pasaría si borramos uno de los archivos duplicados?
ls /mnt/vdo1 drwxrwxrwx 2 root root 79 2021-11-26 21:13 . drwxr-xr-x 3 root root 4.0K 2021-11-26 21:00 .. -rw-rw-r-- 1 user user 1.3G 2021-11-26 21:12 'Season 2.rar' -rw-rw-r-- 1 user user 1.7G 2021-11-26 21:20 'Season con mas archivos.rar' -rw-rw-r-- 1 user user 1.3G 2021-11-26 21:09 Season.rar
Se procede a borrarlo (hay que tener en cuenta que no se debe de borrar uno de los archivos idénticos, no tiene sentido si se piensa):
rm -rf Season\ con\ mas\ archivos.rar
Y checkeamos el estado del vdo:
vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 10.0G 6.9G 3.1G 69% 30%
Como se aprecia, no se ha borrado del volumen deduplicado (sin embargo, si checeka con dh -Th sí muestra el espacio con el archivo borrado). Para recuperar la capacidad que se ha quedado huérfana al eliminar los archivos, hay q agregar la opcion discard a la linea de /etc/fstab en donde se monta el el volumen, se modifica la línea y quedaría:
/dev/mapper/vdo1 /mnt/vdo1 xfs defaults,discard,_netdev,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0
Si se desea hacer en el momento, hay que correr :
fstrim /mnt/vdo1/
El comando demora en aplicarse
Para ver el estado del volumen actual:
vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 10.0G 5.7G 4.3G 56% 0%
Y listo!!!
Vale recalcar que esta es sólo la base, se pueden hacer muchas cosas más, como aplicar cuotas, habilitar compresión….
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Autores:
- Frank Morales
- Franco Díaz
Agradecimientos especiales: @geekmidget y @H3R3T1C
Dejar una contestacion