Linux Mint    Ubuntu    openSUSE    Asterisk    FreeBSD    Android    Nokia N900    Игры в Linux    Mail.ru Agent
 Linux Mint    Ubuntu     openSUSE     Asterisk     FreeBSD     Android     N900     Games     Agent

BTRFS или ZFSonLinux - сравнение и выбор

Начну из далека. По моему мнению ZFS и BTRFS создавались в плане масштабируемости, что бы можно было бесконечно увеличивать место на жестком диске. Как следствие этого в этих ФС разработчики предусмотрели варианты защиты(RAID на уровне ФС). Вот я и собираюсь протестировать эти ФС на предмет масштабируемости и надежности сохранения данных. Согласитесь опасно держать пул из 20*1 терабайтных дисков и не иметь защиты.

И так: мы имеем 6 дисков по 10 гигабайт каждый (sda системный):

ll /dev/sd*

Вывод:

brw-rw---T 1 root disk 8, 0 Мар 30 11:19 /dev/sda

brw-rw---T 1 root disk 8, 1 Мар 30 11:19 /dev/sda1

brw-rw---T 1 root disk 8, 2 Мар 30 11:19 /dev/sda2

brw-rw---T 1 root disk 8, 16 Мар 30 11:20 /dev/sdb

brw-rw---T 1 root disk 8, 32 Мар 30 11:21 /dev/sdc

brw-rw---T 1 root disk 8, 48 Мар 30 11:21 /dev/sdd

brw-rw---T 1 root disk 8, 64 Мар 30 11:21 /dev/sde

brw-rw---T 1 root disk 8, 80 Мар 30 11:22 /dev/sdf

brw-rw---T 1 root disk 8, 96 Мар 30 11:22 /dev/sdg

Начнем с btrfs

Тестировать будем на Debian 8 Jessie, т.к. там самое новое ядро и значит реализация btrfs более новая. К примеру в новой уже есть 5 райд, а в ядре 3.2 нет, ну и много других плюшек, которые должны были быть до включения в ядро, но их включили только сейчас, что уже жутко раздражает.

Первым делом создадим пул raid 5 из первых 3 дисков:

mkfs.btrfs -f -m raid5 -d raid5 /dev/sdb /dev/sdc /dev/sdd

Вывод:

Btrfs v3.17 

See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 

Turning ON incompat feature 'raid56': raid56 extended format

adding device /dev/sdc id 2

adding device /dev/sdd id 3

fs created label (null) on /dev/sdb

nodesize 16384 leafsize 16384 sectorsize 4096 size 30.00GiB

Отлично, теперь посмотрим:

btrfs filesystem show

Label: none uuid: 83a5e985-1af4-42e7-96f4-4b8aad3fac6e

Total devices 3 FS bytes used 112.00KiB

    devid 1 size 10.00GiB used 2.03GiB path /dev/sdb

    devid 2 size 10.00GiB used 2.01GiB path /dev/sdc

    devid 3 size 10.00GiB used 2.01GiB path /dev/sdd

Btrfs v3.17 

mount /dev/sdb /mnt 

df -h

....

/dev/sdb 30G 1,2M 26G 1% /mnt

Что мы видим? А видим мы не много ни мало наш созданный пул, который состоит из 3 дисков. Заметили странность? Да это поломка в моем мозгу, когда я пытаюсь понять, что за ерунда получилась на самом деле. 3 диска по 10 гигов и 5 райд должны дать 20 гигов.

  1. btrfs filesystem show - показывает пул, но не показывает уровень raid.
  2. пул 30 гигов, но использовать можно только 20. Я проверял это так.

Бред бред бред...

Теперь представим ситуацию, что у вас не 10 ГБ каждый винт, а 1 терабайт. Вы создали 5-ый райд и год не заходили на сервер. Через год вам сообщили о проблемах, вы зашли и первое, что сделали - посмотрели сколько занято места. А места еще целый терабайт. Вы в жизни не догадаетесь, что не так с серваком.

Или другой вариант, вы решите увеличить размер пула, но вы забыли как вы его делали (зеркало или 5 или 6 или 10 рейд). Вы никак этого не узнаете и не найдете эту информацию на сервере. У вас один только выход - вспомнить. Это бесит больше всего на свете.

Теперь наша задача добавить к этому пулу еще 3 диска.

btrfs device add -f /dev/sde /dev/sdf /dev/sdg /mnt

btrfs filesystem show

Вывод:

Label: none uuid: 83a5e985-1af4-42e7-96f4-4b8aad3fac6e

Total devices 6 FS bytes used 1.16MiB

    devid 1 size 10.00GiB used 2.03GiB path /dev/sdb

    devid 2 size 10.00GiB used 2.01GiB path /dev/sdc

    devid 3 size 10.00GiB used 2.01GiB path /dev/sdd

    devid 4 size 10.00GiB used 0.00B path /dev/sde

    devid 5 size 10.00GiB used 0.00B path /dev/sdf

    devid 6 size 10.00GiB used 0.00B path /dev/sdg

Btrfs v3.17

Так что мы имеем сейчас. 6 дисков по 10 гигов = 60 гигов. О боже, а защита? Попробуем. Удалим один диск и смотрим что получилось:

btrfs filesystem show

warning devid 6 not found already

Label: none uuid: 83a5e985-1af4-42e7-96f4-4b8aad3fac6e

Total devices 6 FS bytes used 1.16MiB

    devid 1 size 10.00GiB used 2.03GiB path /dev/sdb

    devid 2 size 10.00GiB used 2.01GiB path /dev/sdc

    devid 3 size 10.00GiB used 2.01GiB path /dev/sdd

    devid 4 size 10.00GiB used 0.00B path /dev/sde

    devid 5 size 10.00GiB used 0.00B path /dev/sdf

*** Some devices missing

Btrfs v3.17

mount /dev/sdb /mnt

mount: wrong fs type, bad option, bad superblock on /dev/sdb,

missing codepage or helper program, or other error

In some cases useful info is found in syslog - try

dmesg | tail or so.

Вот, что и требовалось доказать, пул рухнул и никакой защиты.

Могу в этом случаи посоветовать только одно: делать защиту на аппаратном райд и добавлять в пул. Но мы все знаем что будет если аппаратный сломается.

Поэтому продолжать тестировать BTRFS я дальше не буду, уже этого хватает что бы понять на сколько она сырая. Если вы хотите сами, то рекомендую поиграться с subvolume и snapshot, это вообще верх идиотизма. Там так все косячно, что дальше некуда. Такое чувство что разработчики инопланетяне и у них вместо мозга, ПЗУ куда они все складывают про BTRFS. В общем с меня этого хватит.

Теперь перейдем к ZFS.

Создадим наш первый пул из 3 дисков с защитой RAIDZ, что эквивалентно RAID5 но более продвинуто:

zpool create pool1 raidz /dev/sdb /dev/sdc /dev/sdd

Посмотрим, что у нас получилось:

zpool status

pool: pool1

state: ONLINE

scan: none requested

config:

 NAME STATE READ WRITE CKSUM

pool1 ONLINE 0 0 0

raidz1-0 ONLINE 0 0 0

    sdb ONLINE 0 0 0

    sdc ONLINE 0 0 0

    sdd ONLINE 0 0 0

errors: No known data errors

zpool list

NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT

pool1 29,8G 214K 29,7G 0% 1.00x ONLINE -

df -h

...

pool1 20G 128K 20G 1% /pool1

Вот, аж плакать хочется, как тут все сделано по сравнению c ZFS. Все видно, название пула, его статус, какая защита и из каких дисков он создан. Не надо быть инопланетянином чтобы через год или 10 лет разобраться. Смущает только что SIZE 30 гигов, но при монтировании (замечу автоматическом не надо вообще трогать fstab) видно, что пул размером 20 гигов, а 10 резерв.

Идем дальше. Нам надо расширить пул на еще 3 диска. Тут уже начинаются плюшачки. Мы можем добавить к пулу pool1 в комбинацию raidz1-0 еще 3 диска. Но сам разработчик говорит что лучше этого не делать, а создать в этом пуле еще одну комбинацию из дисков raidz1-1 и объединить ее в пул pool1. Давайте так и сделаем:

zpool add pool1 raidz /dev/sde /dev/sdf /dev/sdg

zpool status

pool: pool1

state: ONLINE

scan: none requested

config:

NAME STATE READ WRITE CKSUM

pool1 ONLINE 0 0 0

raidz1-0 ONLINE 0 0 0

    sdb ONLINE 0 0 0

    sdc ONLINE 0 0 0

    sdd ONLINE 0 0 0

raidz1-1 ONLINE 0 0 0

    sde ONLINE 0 0 0

    sdf ONLINE 0 0 0

    sdg ONLINE 0 0 0

errors: No known data errors

zpool list

NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT

pool1 59,5G 247K 59,5G 0% 1.00x ONLINE -

df -h

...

pool1 40G 0 40G 0% /pool1

О, вот оно чудо инженерной мысли. У нас пул на 40 гигов из 2-х комбинаций raidz. Красота. Теперь давайте поразмышляем над этим.

  1. почему так? А потому что таким образом у нас не будут тормоза в случаи выхода 1 жесткого из строя. raidz начнет высчитывать суммы из 3 дисков, а не из 6 как это было бы в btrfs. Мы получим нормальную производительность, отказоустойчивость вырастит. Так в этом случаи при одновременном выходе из строя sda и sde у нас все будет работать.
  2. если вы хотите защититься от 2 или да же 3 сбоев одновременно, то можете использовать raidz1, raidz2 или raidz3. Но или mirror.
  3. так же вы не привязаны к размеру винчестеров. Так при увеличении размера пула состоящего из 6 дисков по 10 гигов, вы можете добавить еще сколько угодно дисков по 3 терабайта и скомбинировать их как вашей душе угодно. Все в ваших фантазиях.

Но без дегтя никуда. Уменьшить пул вы не сможете, только увеличь.

Теперь тест на надежность, удалим 1 диск и посмотрим что будет:

zpool status

pool: pool1

state: DEGRADED

status: One or more devices could not be used because the label is missing or

invalid. Sufficient replicas exist for the pool to continue

functioning in a degraded state.

action: Replace the device using 'zpool replace'.

see: http://zfsonlinux.org/msg/ZFS-8000-4J

scan: none requested

config:

NAME STATE READ WRITE CKSUM

pool1 DEGRADED 0 0 0

raidz1-0 ONLINE 0 0 0

    sdb ONLINE 0 0 0

    sdc ONLINE 0 0 0

    sdd ONLINE 0 0 0

raidz1-1 DEGRADED 0 0 0

    sde ONLINE 0 0 0

    sdf ONLINE 0 0 0

    sdg UNAVAIL 0 0 0


errors: No known data errors

zpool list

NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT

pool1 59,5G 235K 59,5G 0% 1.00x DEGRADED -

df -h

pool1 40G 0 40G 0% /pool1

Как видно ничего не сломалось, все работает надежно. Интересно еще то, что ФС сама подсказывает что с этим делать и ссылочка сразу есть для подробной информации. В общем все прекрасно.

У некоторых возникнет вопрос почему удалил последний диск. Отвечу. Дело в том, что сам разработчик не рекомендует использовать zfs и /dev/sd* лучше использовать UUID или path. Тогда пул не развалится как бы вы этого не хотели, а в случаи с UUID вообще можно менять диски местами как вам заблагоразумится.

В добавок для надежности можно добавить еще диск в резерв «spare»:

zpool status test

pool: test

state: ONLINE

scrub: none requested

config:


        NAME        STATE     READ WRITE CKSUM

        test        ONLINE       0     0     0

          mirror    ONLINE       0     0     0

            c0t0d0  ONLINE       0     0     0

            c0t1d0  ONLINE       0     0     0

        spares

          c0t2d0   AVAIL

Это даст еще большую надежность и в некоторых случаях повысит быстродействие.

Еще есть диски cache и logs для чего они и почему нужны читайте сами, я лишь рассказал плюшки ФС, а не как они работают.

Я не буду рассказывать про остальные плюшки zfs связанные с сабволумами, снапшотами и разными параметрами. Скажу только одно: в ZFS все заявленные фичи работают и они не инопланетного разума, как в случаи с btrfs.

Из минусов можно отметить, что в ZFS, в отличии от BTRFS, нет способа для выполнения дефрагментации и нет возможности сделать балансировку данных между дисками в пуле. Удручает особенно первое.

Мой выбор в итоге однозначно ZFS, тем более что опыт работы с ней у меня уже есть на серверах под управлением Solaris 10 и 11. Там эта ФС показала себя очень очень стабильной, к примеру за 3 года я не наблюдал проблем с ФС, в то время как на соседних серваках с ext4 постоянно появляются ошибки и приходится перегружаться, что бы их починить. Посмотрим как она покажет себя под управлением Linux. Кстати когда разработчиков ZFSonLinux спросили как вам помочь, они ответили:

Просто начните пользоваться ZFS. А с версии 0.6.1 она стала стабильной и пригодной для эксплуатации.

jekson аватар

супер, после таких статей я понимаю как мало еще знаю ))

proof аватар

Познавательно! :=)

Отправить комментарий

  • Строки переносятся автоматически
  • Доступны HTML теги: <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br> <quote>
  • Ссылки не индексируются

Подробнее о форматировании

CAPTCHA
Ответьте на вопрос, чтобы мы убедились что вы человек.