Expanding 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: