Можно ли создать единое зеркало zfs, объединив диски?
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
combined
disk3 (1TB)
disk4 (1TB)
Другими словами, disk3 и disk4 должны содержать те же данные, что и disk3+disk4 вместе взятые.
Возможно ли это? Или возможно что-то подобное? Если да, то какие команды мне дают из моей текущей конфигурации:
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
к вышеуказанной конфигурации?
решение1
Извините, но нет, я не думаю, что вы сможете это сделать.
Но если вы любите экспериментировать, то сначала
СОЗДАЙТЕ РЕЗЕРВНУЮ ПАРУ ДЛЯ ВАШЕГО БАССЕЙНА!
Эта публикация представляет собой академическое упражнение, призванное дать вам идеи, и не дает никаких гарантий, что она будет работать в реальном мире, и мы настоятельно предостерегаем вас от потери данных в результате действий, которые вы предпримете на основе этих предложений.
Я точно знаю, что это zpool
предостережет вас от смешивания зеркальных и raidz vdev. См. флаг -f
, zpool add
например. Ваш предложенный vdev combined
по сути является " raidz-0
" или конкатенированным vdev, в то время как mirror1
является, очевидно, зеркалом.
Учитывая все вышесказанное,после того, как вы сделали резервную копию своего пула,Внимательно изучите страницу man и обратите внимание -n
на флаги некоторых команд. Это позволит вам увидеть, какой будет эффект от команды, не делая ничего в вашем пуле.
Дополнительные доказательства против вашего решениякак предложенонаходится на zpool
странице руководства:
Виртуальные устройства не могут быть вложенными, поэтому зеркало или виртуальное устройство raidz могут содержать только файлы или диски. Зеркала зеркал (или другие комбинации) не допускаются.
Однако, если вы используете FreeBSD, вы можете использовать gstripe
для конкатенации disk3
и disk4
создания combined
устройства. Затем вы можете добавить это устройство в зеркало, так как ZFS будет видеть его как просто еще один диск.
Вот предложение, как поэкспериментировать с этим, предполагая, что вы используете ZFS на FreeBSD. Мы будем использовать симулированные диски объемом 2 ГБ вместо ТБ, но кроме этого...
# mkdir zfs-test; cd zfs-test
# truncate -s 2G drive1; truncate -s 2G drive2
# truncate -s 1G drive3; truncate -s 1G drive4
Создайте псевдоустройства md1–md4, соответствующие файлам drive[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
Ваше существующее зеркало легко создать:
# 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
Вот где вы сейчас застряли. С этой песочницей вы можете теперь экспериментировать с различными командами, используя zpool
флаг -n
, но я не думаю, что что-то будет работать, кроме этого:
# 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
Это, скорее всего, произойдет и с вами, если ваши диски объемом 2 ТБточнов два раза больше, чем у дисков по 1 ТБ. Небольшая потеря места при объединении двух дисков по 1 ТБ приводит к тому, что combined
диск становится немного меньше, чем любой из двух собственных дисков по 2 ТБ. diskinfo(8)
подтверждает это md1
и md2
каждый имеет 4194304 сектора, но stripe/combined
на 256 секторов меньше, всего 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
Но в своей игровой песочнице я могу решить эту проблему.
Сначала я уберу combined
полосу и ее компоненты псевдоустройства /dev/md3 и /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
Теперь я могу заново создать disk3 и disk4, сделав каждый из них немного больше 1 ГБ, заново создать устройства /dev/md3 и md4, объединить их вместе, чтобы создать устройство /dev/stripe/combined, и подключить это устройство к зеркалу:
# 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