Может ли зеркало zfs содержать комбинированные диски?

Может ли зеркало zfs содержать комбинированные диски?

Можно ли создать единое зеркало 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

Связанный контент