Ok, ora ho capito dove è il punto della questione.
Nella prima parte del post #29 hai genericamente parlato di espandere il pool, aggiungendo ulteriori dischi:
E io non avevo letto con attenzione questa parte in cui suggerivi dove è il vero problema:
Ho ragionato sempre parallelizzando il RAIDZ-2 ad un RAID6 senza tenere conto delle peculiarità di ZFS e del fatto che il RAIDZ-2 non è un RAID6 anche se è funzionalmente equivalente (limitatamente al discorso della doppia parità).
[OT: ] Stiamo inquinando un po' il thread di Dante ma visto che abbiamo iniziato a parlarne qui, tanto vale chiudere il cerchio.
Chiariamo alcuni termini:
- Pool => Insieme di dispositivi virtuali (vdev) che concorrono a formare lo spazio di archiviazione.
- vdev => Virtual device. Combinazione di device fisici (un vdev può essere costituito da un solo disco come da una combinazione di più dispositivi, a seconda di quello che si vuole ottenere). Il modo in cui i device fisici sono combinati all'interno del virtual device ne determina le caratteristiche di gestione del dato (stripe, mirroring, RAIDZ-{1,2,3} o combinazioni delle precedenti, ad esempio uno stripe di RAIDZ-n) e di resistenza alla avarie.
Uno o più vdev possono essere aggregati tra loro per formare un "pool" che avrà capacità totale pari alla somma delle capacità messe a disposizione dal singolo vdev che lo compone. Giusto?
[EDIT: Questo forse non è del tutto vero, ci posso essere problemi se i vdev hanno dimensioni diverse]
Prendiamo ora in esame il caso espresso da Toto: Abbiamo 6 dischi di capacità X combinati in un vdev RAIDZ-2 oppure in un array RAID6, quindi quattro dischi dati (D1, D2, D3 e D4) e due di parità (P1, P2).
- Combinando questi dischi in un RAID6 otteniamo un volume di archiviazione composto (a titolo esplicativo) da un array di questo tipo: RAID6 = array(D1+D2+D3+D4&P1&P2)
- Realizzando una analoga combinazione in RAIDZ-2 otteniamo un pool composto da un vdev di questo tipo: POOL = vdev1(D1+D2+D3+D4&P1&P2)
Assumiamo di voler aggiungere un ulteriore disco (D5) per aumentare la capacità complessiva del nostro volume di archiviazione.
- In RAID6 il volume di archiviazione diventa questo: RAID6 = array(D1+D2+D3+D4&P1&P2+D5)
- In RAIDZ-2 il pool di archiviazione diventa invece questo: POOL = vdev1(D1+D2+D3+D4&P1&P2)+vdev2(D5)
In entrambi i casi otteniamo il medesimo incremento di capacità ma si evince ora quello che cercava di farmi capire Toto: In questo caso, la porzione di dati che verrebbero scritti fisicamente sul vdev2 non sarebbero soggetti ad alcuna parità, mettendo quindi a rischio l'integrità dell'intero pool. Per ottenere lo stesso livello di sicurezza del dato disponibile per il vdev1 dovrei aggiungere un maggior numero di dischi invece di uno solo, realizzando ad esempio questa configurazione (o un suo multiplo): POOL = vdev1(D1+D2+D3+D4&P1&P2)+vdev2(D5+D6+D7+D8&P3&P4)
In realtà, quest'ultima configurazione del pool diventa funzionalmente equivalente ad un RAID60 (uno stripe di RAID6) invece che ad un RAID6...
Il problema non si presenta in configurazione RAID6 perchè quando viene aggiunto un nuovo device all'array tutto il contenuto del volume viene completamente riscritto (anche in maniera trasparente all'utente) per spalmare tutti i dati in modo omogeneo su tutti i dischi che compongono l'array, ricalcolando anche le informazioni di parità.
ZFS invece non tocca mai i "live data" (quindi quello che è già presente nel pool) fino a quando il dato non viene riscritto quindi i dati già esistenti non vengono "spalmati" sul nuovo D5 senza un'azione esplicita dell'utente. Tale azione può essere solo una sequenza di [backup dei dati, eliminazione e rigenerazione del pool e dei vdev, ripristino dei dati] oppure un giro di snapshot e copia del dato su se stesso (comunque da verificare se funziona, l'ho intravisto in un blog) che richiede comunque di riscrivere tutti i dati.
Il discorso di supportare o meno il "block pointer rewrite" a quanto ho capito, è leggermente diverso: Non è che la cosa non si possa fare ma a quanto ho capito il gruppo di sviluppo non ha ancora deciso se vuole o meno implementare questa funzionalità perchè si porta dietro i suoi pro ed i suoi contro, tenendo conto di quelli che sono i reali use-case in quella che è la destinazione d'uso per cui è stato creato ZFS.
E' corretto quanto sopra?