Posso criar um único espelho zfs combinando discos?
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
combined
disk3 (1TB)
disk4 (1TB)
Em outras palavras, disco3 e disco4 devem conter os mesmos dados que disco3+disco4 combinados.
Isso é possível? Ou algo semelhante é possível? Em caso afirmativo, quais são os comandos que me levam da minha configuração atual:
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
para a configuração acima?
Responder1
Desculpe, mas não, acho que você não pode.
Mas se você estiver interessado em experimentar, primeiro
FAÇA BACKUP DA SUA PISCINA!
Esta postagem é um exercício acadêmico desenvolvido para lhe dar ideias e não traz nenhuma garantia de que funcionará no mundo real, e você é explicitamente advertido contra incorrer em perda de dados causada por ações tomadas com base nessas sugestões.
Eu tenho certeza que isso zpool
irá alertá-lo contra a mistura de vdevs espelhados e raidz. Veja a -f
bandeira de, zpool add
por exemplo. Seu vdev proposto combined
é essencialmente um " raidz-0
" ou vdev concatenado, embora mirror1
seja obviamente um espelho.
Com tudo isso dito,depois de fazer backup do seu pool,estude a página de manual atentamente e observe os -n
sinalizadores em alguns comandos. Isso permitirá que você veja qual será o efeito de um comando sem realmente fazer nada em seu pool.
Mais evidências no caso contra sua soluçãocomo propostoé encontrado na zpool
página de manual:
Os dispositivos virtuais não podem ser aninhados, portanto, um dispositivo virtual espelhado ou raidz pode conter apenas arquivos ou discos. Espelhos de espelhos (ou outras combinações) não são permitidos.
No entanto, se você estiver no FreeBSD você pode usar gstripe
para concatenar disk3
e disk4
criar o combined
dispositivo. Você pode então adicionar esse dispositivo ao espelho, pois o ZFS o verá como apenas mais um disco.
Aqui está uma sugestão sobre como experimentar isso, supondo que você esteja executando o ZFS no FreeBSD. Usaremos drives simulados de 2GB em vez de TB, mas fora isso....
# mkdir zfs-test; cd zfs-test
# truncate -s 2G drive1; truncate -s 2G drive2
# truncate -s 1G drive3; truncate -s 1G drive4
Crie pseudo-dispositivos md1 a md4 correspondentes aos arquivos da unidade[1-4]:
# for N in $(jot 4); do mdconfig -u $N -t vnode -f drive$N; done
# mdconfig -lv
md1 vnode 2048M /home/jim/zfs-test/drive1
md2 vnode 2048M /home/jim/zfs-test/drive2
md3 vnode 1024M /home/jim/zfs-test/drive3
md4 vnode 1024M /home/jim/zfs-test/drive4
Seu espelho existente é simples de criar:
# zpool create mypool mirror md1 md2
# zpool status mypool
pool: mypool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
md1 ONLINE 0 0 0
md2 ONLINE 0 0 0
errors: No known data errors
É aqui que você está preso no momento. Com esta sandbox, agora você pode experimentar vários comandos usando zpool
o sinalizador ' -n
, mas não acho que nada funcionará, exceto isto:
# gstripe label -h combined md3 md4
# gstripe status
Name Status Components
stripe/combined UP md3
md4
# zpool attach mypool md2 stripe/combined
cannot attach stripe/combined to md2: device is too small
É provável que isso aconteça com você também, se suas unidades de 2 TB foremexatamentedobrar o tamanho das unidades de 1 TB. A ligeira perda de espaço na concatenação das duas unidades de 1 TB resulta em uma combined
unidade ligeiramente menor do que qualquer uma das duas unidades nativas de 2 TB. diskinfo(8)
confirma isso md1
e md2
cada um tem 4194304 setores, mas stripe/combined
é 256 setores menor, com apenas 4194048:
# diskinfo -v md1 md2 stripe/combined
md1
512 # sectorsize
2147483648 # mediasize in bytes (2.0G)
4194304 # mediasize in sectors
0 # stripesize
0 # stripeoffset
MD-DEV5473951480393710199-INO24 # Disk ident.
Yes # TRIM/UNMAP support
Unknown # Rotation rate in RPM
md2
512 # sectorsize
2147483648 # mediasize in bytes (2.0G)
4194304 # mediasize in sectors
0 # stripesize
0 # stripeoffset
MD-DEV5473951480393710199-INO24 # Disk ident.
Yes # TRIM/UNMAP support
Unknown # Rotation rate in RPM
stripe/combined
512 # sectorsize
2147352576 # mediasize in bytes (2.0G)
4194048 # mediasize in sectors
65536 # stripesize
0 # stripeoffset
No # TRIM/UNMAP support
Unknown # Rotation rate in RPM
Mas na minha sandbox do jogo, posso resolver esse problema.
Primeiro, vou eliminar a combined
faixa e seus componentes psuedo-devices /dev/md3 e /dev/md4:
# gstripe destroy combined
# mdconfig -d -u3; mdconfig -d -u4
# mdconfig -lv
md1 vnode 2048M /home/jim/zfs-test/drive1
md2 vnode 2048M /home/jim/zfs-test/drive2
Agora posso recriar o disco3 e o disco4 para torná-los um pouco maiores que 1 GB, recriar os dispositivos /dev/md3 e md4, juntá-los para criar o dispositivo /dev/stripe/combined e anexar esse dispositivo ao espelho:
# truncate -s 1025M drive3
# truncate -s 1025M drive4
# mdconfig -u3 -t vnode -f drive3
# mdconfig -u4 -t vnode -f drive4
# gstripe label -h combined md3 md4
# zpool attach mypool md2 stripe/combined
# zpool status mypool
pool: mypool
state: ONLINE
scan: resilvered 81.5K in 0 days 00:00:04 with 0 errors on Thu May 23 15:27:26 2019
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
md1 ONLINE 0 0 0
md2 ONLINE 0 0 0
stripe/combined ONLINE 0 0 0
errors: No known data errors