File system di compressione trasparente in combinazione con ext4


26

Sto cercando di testare un progetto che necessita di spazio di archiviazione compresso con l'uso del file system ext4 poiché l'applicazione che utilizzo si basa su funzionalità ext4.

Esistono soluzioni di produzione / stabili per una compressione trasparente su ext4?

Cosa ho provato:

Ext4 su volume ZFS con compressione abilitata. Questo ha avuto un effetto negativo. Ho provato a creare un volume ZFS con la compressione lz4 abilitata e a creare un filesystem ext4 su / dev / zvol / ... ma il volume zfs mostrava il doppio dell'utilizzo effettivo e la compressione non sembrava avere alcun effetto.

# 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**  -

Comandi di creazione 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: sembrava funzionare ma non stabile al 100%. Alla ricerca di alternative.

LessFS: è possibile utilizzare Lessfs insieme a ext4? Non ho ancora provato, ma sarei interessato alla comprensione degli utenti.

Un grosso problema: non vera trasparenza

Un problema che ho riscontrato con Fusecompress erano le quote. Ad esempio, se abilitassi la compressione sul filesystem, vorrei che il mio sistema beneficiasse della compressione, non necessariamente dell'utente finale. Se abilitassi una quota di 1 GB per un utente, con un rapporto di compressione di 1,5, sarebbero in grado di caricare 1,5 GB di dati, anziché 1 GB di dati e il sistema beneficiando della compressione. Anche questo sembrava mostrare su df -h. Esiste una soluzione per rendere la compressione trasparente alle quote?


Sicuro. Puoi elencare il sistema operativo / distro / versione e dettagli sulla natura dei dati che intendi archiviare?
ewwhite

Anche i dettagli hardware.
ewwhite

1
@ewwhite 8x3TB in un software RAID6. I dati saranno backup sincronizzati da altri server, quindi tipi di dati misti e vari utenti finali, documenti, ecc. CentOS 6.5 x64.
user235918

Sei sicuro di aver bisogno di questo? Hai molti file grandi e sparsi? Lo spazio su disco è poco costoso in questi giorni.
Andrew Schulman,

@AndrewSchulman: trarre vantaggio dalla compressione è il metodo migliore dal mio calcolo. Il costo di ulteriori dischi e controller che li supportano è superiore al costo della CPU.
user235918

Risposte:


27

Uso ZFS su Linux come gestore di volumi e un mezzo per fornire protezioni e funzionalità aggiuntive ai filesystem tradizionali. Ciò include il trasferimento di snapshot a livello di blocco, replica, deduplicazione, compressione e memorizzazione nella cache avanzata nel filesystem XFS o ext4.

Vedi: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ per un'altra spiegazione.

Nel mio caso d'uso più comune, utilizzo la funzione zvol di ZFS per creare un volume scarso su uno zpool esistente. Le proprietà di quel zvol possono essere impostate proprio come un normale filesystem ZFS. A questo punto, è possibile impostare proprietà come tipo di compressione, dimensioni del volume, metodo di memorizzazione nella cache, ecc.

La creazione di questo zvol presenta un dispositivo a blocchi su Linux che può essere formattato con il filesystem di tua scelta. Utilizzare fdisko partedper creare la partizione e mkfsil volume finito.

Montalo e in pratica hai un filesystem supportato da uno zvol e con tutte le sue proprietà.


Ecco il mio flusso di lavoro ...

Crea uno zpool composto da quattro dischi:
vorrai la ashift=12direttiva per il tipo di dischi che stai utilizzando. Il nome zpool è "vol0" in questo caso.

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

Imposta le impostazioni iniziali di zpool:
ho impostato autoexpand=ona livello di zpool nel caso in cui dovessi mai sostituire i dischi con unità più grandi o espandere il pool in una configurazione dei mirror ZFS . In genere non uso ZFS raidz1 / 2/3 a causa delle scarse prestazioni e dell'incapacità di espandere zpool.

zpool set autoexpand=on vol0

Impostare le proprietà iniziali del file system zfs:
utilizzare l' lz4algoritmo di compressione per le nuove installazioni ZFS. Va bene lasciarlo sempre acceso.

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

Crea zFS zvol:
per ZFS su Linux, è molto importante utilizzare blocchi di grandi dimensioni. -o volblocksize=128kè assolutamente essenziale qui. L' -sopzione crea uno zvol sparso e non consuma spazio nel pool fino a quando non è necessario. Puoi eseguire l'overcommit qui, se conosci bene i tuoi dati. In questo caso, ho circa 444 GB di spazio su disco utilizzabile nel pool, ma sto presentando un volume da 800 GB a XFS.

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

Partizione dispositivo zvol:
( dovrebbe essere / dev / zd0 per il primo zvol; / dev / zd16, / dev / zd32, ecc. Per i successivi zvol )

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

Crea e monta il filesystem:
mkfs.xfs o ext4 sulla partizione appena creata, / dev / zd0p1.

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

Prendi l'UUID con blkide modifica /etc/fstab.

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

Montare il nuovo filesystem.

mount /ppro/

Risultati ...

[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

Elenco dei file system 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

Elenco zpool di 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      -      -      -         -

Proprietà ZFS zvol ( Prendete nota di referenced, compressratioevolsize ).

[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

Perché partizionare zvol? Non può essere usato direttamente?
Michael Hampton

3
@MichaelHampton Principalmente per allineamento e coerenza. Inoltre, voglio flessibilità se espanderò il volume sottostante. Ci sono diversi strati di astrazione qui. È simile all'argomento dell'uso /dev/sdbcontro /dev/sdb1.
ewwhite,

1
Grazie per le informazioni. Un sacco di buoni consigli qui. Ho intenzione di provarlo.
user235918

2
@MichaelHampton A proposito, oggigiorno non partiziono più ... specialmente con le macchine virtuali.
ewwhite,

1
Puoi spiegare i costi delle risorse aggiuntive per il livello ZFS in questa configurazione (RAM, CPU)?
Sz.

4

È inoltre necessario abilitare l'eliminazione sul filesystem ext4. Senza scarto, zfs non recupera lo spazio quando i file vengono rimossi. Questo può portare a grandi discrepanze nello spazio tra ciò che riporta il file system ext4 e i rapporti sul volume zfs.


4
Red Hat non consiglia di farlo online con l'opzione discard mount (con ext4 o xfs), poiché ha un impatto sulle prestazioni. È più pulito eseguire periodicamente il fstrimcomando.
ewwhite,

ha scritto il commento sui supporti di scarto che influiscono sulle prestazioni: questo è vero con i vecchi SSD di bassa qualità. Non è vero con quelli più recenti.
Stoat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.