Cómo crear un volumen deduplicado en Ubuntu?

bunch of disks

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).

EmailDeduplicaciónTamaño/Tamaño sin DeduplicaciónCuánto se ahorra
Email 120K20K/20K0K
Email 216K36K/40K4K
Email 316K52K/60K8K
Email 416K68K/80K12K

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

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 2

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*