Sistema de archivos de compresión transparente junto con ext4

26

Estoy tratando de probar un proyecto que necesita almacenamiento comprimido con el uso del sistema de archivos ext4 ya que la aplicación que uso se basa en las características de ext4.

¿Existe alguna solución estable / de producción para la compresión transparente en ext4?

Lo que he intentado:

Ext4 sobre volumen ZFS con compresión habilitada. Esto en realidad tuvo un efecto adverso. Intenté crear un volumen ZFS con la compresión lz4 habilitada y hacer un sistema de archivos ext4 en / dev / zvol / ... pero el volumen zfs mostró el doble del uso real y la compresión no pareció tener ningún efecto.

# du -hs /mnt/test
**1.1T**    /mnt/test
# zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
pool       15.2T  2.70G   290K  /pool
pool/test  15.2T  13.1T  **2.14T**  -

Comandos de creación de ZFS

zpool create pool raidz2 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde2 /dev/sdf1 /dev/sdg1 /dev/sdh2 /dev/sdi1
zfs set recordsize=128k pool
zfs create -p -V15100GB pool/test
zfs set compression=lz4 pool/test
mkfs.ext4 -m1 -O 64bit,has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink /dev/zvol/pool/test

Fusecompress: Parecía funcionar pero no 100% estable. Buscando alternativas.

LessFS: ¿Es posible usar Lessfs junto con ext4? Todavía no lo he intentado, pero me interesaría la información del usuario.

Un problema importante: no es verdadera transparencia

Un problema que vi con fusecompress fueron las cuotas. Por ejemplo, si habilito la compresión en el sistema de archivos, me gustaría que mi sistema se beneficie de la compresión, no necesariamente el usuario final. Si habilitara una cuota de 1 GB para un usuario, con una relación de compresión de 1.5, podrían cargar 1.5 GB de datos, en lugar de 1 GB de datos, y el sistema se beneficiaría de la compresión. Esto también pareció mostrarse en df -h. ¿Existe una solución para tener una compresión transparente a las cuotas?

usuario235918
fuente
Seguro. ¿Puede enumerar el sistema operativo / distribución / versión y los detalles sobre la naturaleza de los datos que pretende almacenar?
ewwhite
También detalles de hardware.
ewwhite
1
@ewwhite 8x3TB en un RAID6 de software. Los datos serán copias de seguridad sincronizadas de otros servidores, por lo que se combinan tipos de datos y varios usuarios finales, documentos, etc. CentOS 6.5 x64.
user235918
¿Estás seguro de que necesitas esto? ¿Tiene muchos archivos grandes y dispersos? El espacio en disco es barato en estos días.
Andrew Schulman
@ AndrewSchulman: Aprovechar la compresión es el mejor método de mi cálculo. El costo de los discos y controladores adicionales que los admiten es más que el costo de la CPU.
user235918

Respuestas:

27

Uso ZFS en Linux como administrador de volúmenes y un medio para proporcionar protecciones y funcionalidades adicionales a los sistemas de archivos tradicionales. Esto incluye traer instantáneas a nivel de bloque, replicación, deduplicación, compresión y almacenamiento en caché avanzado a los sistemas de archivos XFS o ext4.

Ver: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ para otra explicación.

En mi caso de uso más común, aprovecho la función zvol de ZFS para crear un volumen disperso en un zpool existente. Las propiedades de zvol se pueden configurar como un sistema de archivos ZFS normal. En este momento, puede establecer propiedades como tipo de compresión, tamaño de volumen, método de almacenamiento en caché, etc.

La creación de este zvol presenta un dispositivo de bloque para Linux que puede formatearse con el sistema de archivos que elija. Use fdisko partedpara crear su partición y mkfsel volumen terminado.

Monte esto y esencialmente tendrá un sistema de archivos respaldado por un zvol y con todas sus propiedades.


Aquí está mi flujo de trabajo ...

Cree un zpool compuesto por cuatro discos:
querrá la ashift=12directiva para el tipo de discos que está utilizando. El nombre de zpool es "vol0" en este caso.

zpool create -o ashift = 12 -f vol0 espejo scsi-AccOW140403AS1322043 scsi-AccOW140403AS1322042 espejo scsi-AccOW140403AS1322013 scsi-AccOW140403AS1322044

Establecer la configuración inicial de zpool:
configuro autoexpand=onen el nivel de zpool en caso de que alguna vez reemplace los discos con unidades más grandes o expanda el grupo en una configuración de espejos ZFS . Normalmente no uso ZFS raidz1 / 2/3 debido al bajo rendimiento y la incapacidad para expandir el zpool.

zpool set autoexpand=on vol0

Establezca las propiedades iniciales del sistema de archivos zfs:
utilice el lz4algoritmo de compresión para las nuevas instalaciones de ZFS. Está bien dejarlo encendido todo el tiempo.

zfs set compression=lz4 vol0
zfs set atime=off vol0

Cree ZFS zvol:
para ZFS en Linux, es muy importante que utilice un tamaño de bloque grande. -o volblocksize=128kEs absolutamente esencial aquí. La -sopción crea un zvol escaso y no consume espacio de agrupación hasta que sea necesario. Puede comprometerse aquí en exceso si conoce bien sus datos. En este caso, tengo aproximadamente 444 GB de espacio en disco utilizable en el grupo, pero presento un volumen de 800 GB a XFS.

zfs create -o volblocksize=128K -s -V 800G vol0/pprovol

Dispositivo de partición zvol:
( debe ser / dev / zd0 para el primer zvol; / dev / zd16, / dev / zd32, etc. para los zvols posteriores )

fdisk /dev/zd0 # (create new aligned partition with the "c" and "u" parameters)

Cree y monte el sistema de archivos:
mkfs.xfs o ext4 en la partición recién creada, / dev / zd0p1.

mkfs.xfs -f -l size=256m,version=2 -s size=4096 /dev/zd0p1

Tome el UUID con blkidy modifíquelo /etc/fstab.

UUID=455cae52-89e0-4fb3-a896-8f597a1ea402 /ppro       xfs     noatime,logbufs=8,logbsize=256k 1 2

Montar el nuevo sistema de archivos.

mount /ppro/

Resultados ...

[root@Testa ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde2        20G  8.9G  9.9G  48% /
tmpfs            32G     0   32G   0% /dev/shm
/dev/sde1       485M   63M  397M  14% /boot
/dev/sde7       2.0G   68M  1.9G   4% /tmp
/dev/sde3        12G  2.6G  8.7G  24% /usr
/dev/sde6       6.0G  907M  4.8G  16% /var
/dev/zd0p1      800G  398G  403G  50% /ppro  <-- Compressed ZFS-backed XFS filesystem.
vol0            110G  256K  110G   1% /vol0

Listado del sistema de archivos ZFS.

[root@Testa ~]# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
vol0           328G   109G   272K  /vol0
vol0/pprovol   326G   109G   186G  -   <-- The actual zvol providing the backing for XFS.
vol1           183G   817G   136K  /vol1
vol1/images    183G   817G   183G  /images

Lista de zpool de ZFS.

[root@Testa ~]# zpool list -v
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vol0   444G   328G   116G    73%  1.00x  ONLINE  -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322043      -      -      -         -
    scsi-AccOW140403AS1322042      -      -      -         -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322013      -      -      -         -
    scsi-AccOW140403AS1322044      -      -      -         -

Propiedades de ZFS (zvol tomar nota de referenced, compressratioyvolsize ).

[root@Testa ~]# zfs get all vol0/pprovol
NAME          PROPERTY               VALUE                  SOURCE
vol0/pprovol  type                   volume                 -
vol0/pprovol  creation               Sun May 11 15:27 2014  -
vol0/pprovol  used                   326G                   -
vol0/pprovol  available              109G                   -
vol0/pprovol  referenced             186G                   -
vol0/pprovol  compressratio          2.99x                  -
vol0/pprovol  reservation            none                   default
vol0/pprovol  volsize                800G                   local
vol0/pprovol  volblocksize           128K                   -
vol0/pprovol  checksum               on                     default
vol0/pprovol  compression            lz4                    inherited from vol0
vol0/pprovol  readonly               off                    default
vol0/pprovol  copies                 1                      default
vol0/pprovol  refreservation         none                   default
vol0/pprovol  primarycache           all                    default
vol0/pprovol  secondarycache         all                    default
vol0/pprovol  usedbysnapshots        140G                   -
vol0/pprovol  usedbydataset          186G                   -
vol0/pprovol  usedbychildren         0                      -
vol0/pprovol  usedbyrefreservation   0                      -
vol0/pprovol  logbias                latency                default
vol0/pprovol  dedup                  off                    default
vol0/pprovol  mlslabel               none                   default
vol0/pprovol  sync                   standard               default
vol0/pprovol  refcompressratio       3.32x                  -
vol0/pprovol  written                210M                   -
vol0/pprovol  snapdev                hidden                 default
ewwhite
fuente
¿Por qué dividir el zvol? ¿No se puede usar directamente?
Michael Hampton
3
@MichaelHampton Principalmente para alineación y consistencia. Además, quiero flexibilidad si amplío el volumen subyacente. Hay varias capas de abstracción aquí. Es similar al argumento de usar /dev/sdbversus /dev/sdb1.
ewwhite
1
Gracias por tu información. Un montón de buenos consejos aquí. Voy a probarlo
user235918
2
@MichaelHampton Por cierto, en estos días ya no particiono ... especialmente con máquinas virtuales.
ewwhite
1
¿Puede hablar sobre los costos de recursos adicionales para la capa ZFS en esta configuración (RAM, CPU)?
Sz.
4

También debe habilitar el descarte en el sistema de archivos ext4. Sin descartar, zfs no reclama el espacio cuando se eliminan los archivos. Esto puede terminar dando lugar a grandes discrepancias de espacio entre lo que informa el sistema de archivos ext4 y los informes de volumen zfs.

Devon
fuente
44
Red Hat no recomienda hacerlo en línea con la opción de montaje de descarte (con ext4 o xfs), ya que hay un impacto en el rendimiento. Es más limpio ejecutar periódicamente el fstrimcomando.
ewwhite
Escribe el comentario sobre los montajes de descarte que afectan el rendimiento: esto es cierto con los SSD antiguos de baja calidad. No es cierto con los más nuevos.
Stoat