FastNetMon

Monday 6 September 2010

Тестирование поведения RAID-Z массива во FreeBSD при полном отказе одного из дисков

Итак, мы имеем собранный RAID-Z массив из 3 дисков: http://phpsuxx.blogspot.com/2010/09/raid-z-freebsd-81.html

Перед тем как подобную технологию эксплуатировать, стоит протестировать, как она поведет себя во внештатных ситуациях, скажем, при полном или частичном отказе одного из 3 дисков.

Частичный отказ диска

Итак, "отключаем" массив от системы:
zpool export backup

При этом он также будет отмонтирован.

Теперь эмулируем физическое повреждение поверхности диска /dev/ad6 (пишем на него гигабайт "белого шума"):
dd if=/dev/urandom of=/dev/ad6 bs=1m count=1000

Снова подключаем массив:
zpool import backup

После этого можно попробовать прочесть какой-либо из файлов с массива (или можно этого не делать, как я понял) и в итоге мы увидим следующее:
zpool status
pool: backup
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
backup ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 0 0
ad6 ONLINE 0 0 10
ad10 ONLINE 0 0 0

errors: No known data errors

То есть, ZFS определила, что мы чего-то нахимичили с данными (так как они не совпадали со своими ключевыми суммами), это на лету исправила и сообщила нам число ошибок из-за ключевых сумм с ad6. Что же, прекрасно, если винт правда начал умирать, Вы узнаете это первым.

Но при этом ZFS нашел не все ошибки (так понимаю, по причине, что мы считали далеко не все данные с диска), поэтому есть возможность попросить ZFS провести полную проверку данных на этом томе и исправить все найденные ошибки:
zpool scrub backup

После чего увидим следующий status:
zpool status
pool: backup
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: scrub completed after 0h0m with 0 errors on Sun Sep 5 23:05:03 2010
config:

NAME STATE READ WRITE CKSUM
backup ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 0 0
ad6 ONLINE 0 0 21 1.00M repaired
ad10 ONLINE 0 0 0

errors: No known data errors


Теперь же попросим ZFS забыть про наши опыты и сбросить число ошибок:
zpool clear backup ad6

И теперь наш статус девственно чист:
zpool status
pool: backup
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
backup ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 0 0
ad6 ONLINE 0 0 0
ad10 ONLINE 0 0 0

errors: No known data errors

Полный отказ диска

Допустим, диск отказывает на пустом месте. Для этого есть прекрасная команда offline:
zpool offline backup ad4

После такой наглости массив переходит в состояние DEGRADED (разрушен, это нештатный режим его работы):
zpool status
pool: backup
state: DEGRADED
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
backup DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
ad4 OFFLINE 0 49 0
ad6 ONLINE 0 0 0
ad10 ONLINE 0 0 0

errors: No known data errors

Подключаем диск обратно:
zpool online backup ad4

Смотрим статус массива:
zpool status
pool: backup
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: resilver completed after 0h0m with 0 errors on Sun Sep 5 23:00:15 2010
config:

NAME STATE READ WRITE CKSUM
backup ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 49 0 21.5K resilvered
ad6 ONLINE 0 0 1 15K resilvered
ad10 ONLINE 0 0 0 14K resilvered

errors: No known data errors

Как я понял, в полях resilvered указано сколько блоков с каждого из рабочих дисков было считано, а напротив "отказавшего диска" указано число блоков которое было восстановлено на основе данных четности (но я могу ошибаться, не верьте мне!). Данные были восстановлены и теперь массив снова в статусе ONLINE. Примерно тоже самое произойдет, когда потребуется заменить один из дисков в связи с отказом.

Физическая замена одного из дисков

Допустим, на одном из дисков по данным S.M.A.R.T. образовалось большое число сбойных секторов и его стоит заменить (для чистоты эксперимента мне пришлось немного погонять техников ДЦ и физически заменить один из дисков.). Нужно ли готовить массив к этому заранее? Совершенно не нужно (официальная документации Sun). Сервер просто выключается, сбойный диск заменяется (то есть, на место подключения старого диска ставится новый) и сервер включается. Статус массива при этом будет следующий:
zpool import
pool: backup
id: 15744554445999282139
state: DEGRADED
status: One or more devices are missing from the system.
action: The pool can be imported despite missing or damaged devices. The
fault tolerance of the pool may be compromised if imported.
see: http://www.sun.com/msg/ZFS-8000-2Q
config:

backup DEGRADED
raidz1 DEGRADED
ad4 ONLINE
ad6 UNAVAIL cannot open
ad10 ONLINE


И при этом массив не был подключен к системе:
zpool list
no pools available

То есть, ZFS заметила, что диск ad6 куда-то пропал и не хочет запускаться. Что же делать?

Делаем "явное" подключение пула:
zpool import backup

После этого статус примет вид:
zpool status backup
pool: backup
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://www.sun.com/msg/ZFS-8000-2Q
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
backup DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
ad4 ONLINE 0 0 0
1502173858046405299 UNAVAIL 0 227 0 was /dev/ad6
ad10 ONLINE 0 0 0

errors: No known data errors

После этого сообщаем ZFS, что мы заменили этот диск:
zpool replace backup ad6

И, вуаля, массив снова в штатном режиме:
zpool status backup
pool: backup
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Mon Sep 6 16:05:36 2010
config:

NAME STATE READ WRITE CKSUM
backup ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 0 0 31K resilvered
ad6 ONLINE 0 0 0 2.18M resilvered
ad10 ONLINE 0 0 0 33K resilvered

errors: No known data errors

Поистине фантастическая технология :)

По материалам: http://www.freebsd.org/cgi/man.cgi?zpool и http://people.freebsd.org/~pjd/misc/zfs/zfs_self-healing.swf

8 comments :

  1. Как я понимаю, тебя ZFS на фряхе впечатлил? )) Да, в 8-ой ветке они за него хорошо взялись. Ждем нормальной реализации на линях?

    ReplyDelete
  2. Ога, круто достаточно. Конечно, пока есть ряд багов не очень приятных, но к 9й фре ZFS будет как картинка. Да не будет ее на Лине, лицензия ZFS не совместима с лицензией ядра Linux.

    ReplyDelete
  3. Ага , технология просто феерическая .... неземная. Но только для тех , кто в принципе не видел НОРМАЛЬНЫХ ХАРДОВЫХ рэйд контроллеров =).
    Аффтор явно не знает как себя ведёт диск при отказе. И проблема будет не в данных , а в SATA контроллере , который скорее всего просто зависнет , из за того , что его подвесил контроллер сбойного диска. И что отразится это на всей системе и т.д.
    Поэтому мораль - не стоит экономить денег работодателя и надо приобретать ХАРДВАРНЫЕ рэйды. Иначе все траблы , которые сможет решить хардварный райд будут решать вашими силами.

    ReplyDelete
    Replies
    1. Я посмотрю как ты запрыгаешь, когда по каким-то причинам у тебя в неисправность придет сама плата RAID-массива, того-же 3Ware, организации которой уже много лет как не существует. Ведь как-то по подобной причине можно восстановить RAID только при наличии именно такого RAID-контроллера. И где ты его искать будешь...Не знаю, сорри за ответ 3 года спустя ))

      Delete
  4. Ага , технология просто феерическая .... неземная. Но только для тех , кто в принципе не видел НОРМАЛЬНЫХ ХАРДОВЫХ рэйд контроллеров =).
    Аффтор явно не знает как себя ведёт диск при отказе. И проблема будет не в данных , а в SATA контроллере , который скорее всего просто зависнет , из за того , что его подвесил контроллер сбойного диска. И что отразится это на всей системе и т.д.

    ---

    Вы сводите статью к холивару Soft-RAID vs Hardware Raid, я же здесь писал о надежности хранения данных на RAID-Z. Ни о том, что будет с массивом, если откажет диск (допустим, будет побита не поверхность, а электроника), ни о том, что будет с системой я не писал, это немного выходит за рамки статьи.


    Поэтому мораль - не стоит экономить денег работодателя и надо приобретать ХАРДВАРНЫЕ рэйды. Иначе все траблы , которые сможет решить хардварный райд будут решать вашими силами.

    ---

    Лучшее - враг хорошего. И не всегда самое дорогое решение является лучшим и не всегда оно возможно. Если бы медики так считали, то грипп бы массово лечили морфием, ага, он самый сильный и крутой :)

    ReplyDelete
  5. Хрена там, ваши бы посты да Богу в уши )
    3 диска в RAIDZ, один отвалил оффлайном. Изначально разбивал из gpart'ом, все 3. Удалось подключить только так - zpool replace -f zfspool 7984183133786640744 ada2

    В итоге zpool status стал
    # zpool status -v
    pool: zfspool
    state: ONLINE
    scan: resilvered 35,5G in 0h32m with 0 errors on Wed May 1 11:33:06 2013
    config:

    NAME STATE READ WRITE CKSUM
    zfspool ONLINE 0 0 0
    raidz1-0 ONLINE 0 0 0
    gpt/disk0 ONLINE 0 0 0
    gpt/disk1 ONLINE 0 0 0
    ada2 ONLINE 0 0 0

    errors: No known data errors

    И как мне теперь в ada2 искать swap ? )

    ReplyDelete
  6. Простите, что отвечаю через 2 года, но почему вас тогда не смутило, что в массиве два диска как устройство /dev/gpt/disk$, а третий диск просто как ada2?
    Надо было посмотреть что такое эти disk0, disk1 и сделать с disk2 такие же разделы:
    # gpart show -l
    # gpart create -s gpt ada2
    # gpart add -s 512k -t freebsd-boot -l gptboot1 ada2
    # gpart add -s 32G -t freebsd-swap -l swap2 ada2
    # gpart add -t freebsd-zfs -l disk2 ada2
    Появится устройство /dev/gpt/disk2, вот его и надо было реплейсить в массив zfs.
    Что касается swap, то с большой вероятсностью он не входит в массив, реплицировать swap не логично и по умолчанию он всегда отдельно. Невзирая на нашу ZFS, для swap используется обычный fstab:
    /dev/ada0p2 none swap sw 0 0
    /dev/ada1p2 none swap sw 0 0
    /dev/ada2p2 none swap sw 0 0

    ReplyDelete
  7. Извиняюсь за оффтоп, в современной фряхе zfz допилили или еще пару лет подождать?

    ReplyDelete

Note: only a member of this blog may post a comment.