Marvin Pascale

[B.Log]

21 Marzo 2023

Expanding ZFS

ZFS In questo periodo, mi è capitato di lavorare più del solito con ZFS. Le persone del team con le quali ho lavorato ne hanno approfittato per fare delle domande e mi sono reso conto di quanti falsi miti ci siano su questo argomento. Ho già parlato di ZFS per cui non starò a ripetere le cose già trattate.

ZFS non è scalabile

Nulla di più falso.

Mi sono sentito dire: “Ma se faccio un pool ZFS poi non posso scalare. Devo migrare i dati, distruggere e ricreare un nuovo pool con i dischi aggiuntivi.”

Lì per lì la frase mi ha stranito, ma poi ho voluto indagare ed ho scoperto l’arcano: Gigi (nome di fantasia) ha creato uno zpool in modalità raidz (RAID 5 per capirci) e poi voleva espandere il pool aggiungendo un disco.

Questo non è possibile con ZFS, ma da lì a dire che ZFS non sia scalabile ci passa un oceano.

Ad onor del vero, qualcuno ci ha già pensato e ha sottoposto ad approvazione una feature che lo permetterebbe. In questa pull request su github emerge il gran lavoro svolto della community, anche se il team che si occupa delle approvazioni non ha ancora dato una ETA ufficiale (in un post si legge che sarà valutata entro marzo 2024). Sarebbe un cambio di paradigma importantissimo e quindi non ci resta che aspettare e vedere cosa succede.

Come si espande un pool?

Se abbiamo un pool in mirroring e aggiungo dischi vado solo ad aumentare il numero delle repliche (questo vale in generale e non solo su ZFS) ma posso aumentare lo spazio disponibile aggiungendo un dev in maniera simmetrica: anche se ho un raidz (2,3, …).

Questo significa che se io ho creato uno zpool in modalità raizd con 3 dischi posso espandere aggiungendo un altro zraid e sommarlo allo zpool. La dimensione dei dischi non è vincolante ma per uniformità è consigliabile.

Mani in pasta

Partendo da una distro GNU/Linux qualsiasi creiamo un primo vdev e zpool. Per l’occasione utilizzeremo una Rocky Linux con 10 dischi nuovi fiammanti(6 dischi da 10 GB e 4 da 20 GB).

# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0 76.3G  0 disk
|-sda1    8:1    0 76.2G  0 part /
|-sda14   8:14   0   64M  0 part /boot/efi
`-sda15   8:15   0    1M  0 part
sdb       8:16   0   20G  0 disk
sdc       8:32   0   20G  0 disk
sdd       8:48   0   10G  0 disk
sde       8:64   0   20G  0 disk
sdf       8:80   0   10G  0 disk
sdg       8:96   0   10G  0 disk
sdh       8:112  0   10G  0 disk
sdi       8:128  0   20G  0 disk
sdj       8:144  0   10G  0 disk
sdk       8:160  0   10G  0 disk
sr0      11:0    1 1024M  0 rom

# zpool create tanica raidz /dev/sdd /dev/sdf /dev/sdg

# zfs list
NAME     USED  AVAIL     REFER  MOUNTPOINT
tanica   129K  19.0G     30.6K  /tanica
# zpool status -v tanica
  pool: tanica
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	tanica      ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdd     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0
	    sdg     ONLINE       0     0     0

dato l’ordine con cui il sistema ha riconosciuto i dischi creo la tanica con 3 dischi da 10 GB.

Ora vediamo come espandere il pool creato prima

# zpool add tanica raidz /dev/sdh /dev/sdj /dev/sdk

# zfs list
NAME     USED  AVAIL     REFER  MOUNTPOINT
tanica   172K  38.1G     30.6K  /tanica

# zpool status -v tanica
  pool: tanica
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	tanica      ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdd     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0
	    sdg     ONLINE       0     0     0
	  raidz1-1  ONLINE       0     0     0
	    sdh     ONLINE       0     0     0
	    sdj     ONLINE       0     0     0
	    sdk     ONLINE       0     0     0

abbiamo raddoppiato la dimensione del nostro zpool tanica con un altro vdev identico al precedente.

E se provassimo ad aggiungere un vdev con dei dischi diversi?

# zpool add tanica raidz /dev/sdb /dev/sdc /dev/sde

# zfs list
NAME     USED  AVAIL     REFER  MOUNTPOINT
tanica   206K  76.5G     30.6K  /tanica

# zpool status -v tanica
  pool: tanica
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	tanica      ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdd     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0
	    sdg     ONLINE       0     0     0
	  raidz1-1  ONLINE       0     0     0
	    sdh     ONLINE       0     0     0
	    sdj     ONLINE       0     0     0
	    sdk     ONLINE       0     0     0
	  raidz1-2  ONLINE       0     0     0
	    sdb     ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sde     ONLINE       0     0     0

errors: No known data errors

Come era prevedibile il pool è cresciuto ancora e ora abbiamo a disposizione quasi 80 GB.

Facciamo un test

# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  1.8G     0  1.8G   0% /dev
tmpfs          tmpfs     1.8G     0  1.8G   0% /dev/shm
tmpfs          tmpfs     1.8G   17M  1.8G   1% /run
tmpfs          tmpfs     1.8G     0  1.8G   0% /sys/fs/cgroup
/dev/sda1      ext4       75G  1.7G   71G   3% /
/dev/sda14     vfat       64M  5.8M   59M   9% /boot/efi
tmpfs          tmpfs     364M     0  364M   0% /run/user/0
tanica         zfs        77G  128K   77G   1% /tanica

# dd if=/dev/zero of=/tanica/test1.img bs=1G count=50 oflag=dsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB, 50 GiB) copied, 305.338 s, 176 MB/s

# zpool iostat
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tanica      75.0G  43.5G      0    636    136  58.3M

#


Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.

Risorse: