Как сохранить свои данные? Часть 2. Тестируем ZFS, моделируем отказы дисков.

предыдущем посте я решил что остановлю свой выбор на FreeBSD + ZFS (raid5). Частично на это меня подтолкнула эта статья http://litovchenko.com/blog/2009/06/media-storage/ + то  что у меня есть знакомый который достаточно неплохо знает FreeBSD и может мне иногда помочь.

Определившись c ОС и ФС (файловой системой) — я скачал и поставил под VMWare последнюю версию данной ОС и начал свои эксперименты.

Читал, пробовал, допускал ошибки, снова читал, разбирался и снова экспериментировал.. и вот что у меня получилось.

Мне нужно создать RAIDZ-пул в ZFS.  Как рекомендует SUN raidz-пул формируется из 3-9 дисков. Объем получаемого пула будет (N-1)*V, где N-количество дисков, а V- объем наименьшего диска.

http://docs.sun.com/app/docs/doc/819-5461

http://habrahabr.ru/blogs/bsdelniki/77722/

Для экспериментов создадим 4 диска по 1,5ГБ и создадим из 3х дисков raidz пул, а один будеи использовать как запасной.
Проверим два случая : 1) убиваем 1 диск из пула , перегружаемся и заменяем запасным диском "поломаный". 2) из запасного делаем spare-диск и при перезагружке убиваем один из дисков в пуле.

исходная позиция:
freebsd8# gpart show
=>      63  16777152  da0  MBR  (8.0G)
        63  16771797    1  freebsd  [active]  (8.0G)
  16771860      5355       - free -  (2.6M)

=>       0  16771797  da0s1  BSD  (8.0G)
         0    759808      1  freebsd-ufs  (371M)
    759808   4065964      2  freebsd-swap  (1.9G)
   4825772   1087488      4  freebsd-ufs  (531M)
   5913260    614400      5  freebsd-ufs  (300M)
   6527660  10244137      6  freebsd-ufs  (4.9G)

Размечаем первый диск:
freebsd8# gpart create -s GPT da1
da1 created
freebsd8# gpart show da1
=>     34  3145661  da1  GPT  (1.5G)
       34  3145661       - free -  (1.5G)

freebsd8# gpart add -b 34 -s 3145661 -i 1 -t freebsd-zfs -l disk1 da1
da1p1 added
freebsd8# gpart show da1
=>     34  3145661  da1  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

и остальные 3 также.
Получаем:
freebsd8# gpart show
=>      63  16777152  da0  MBR  (8.0G)
        63  16771797    1  freebsd  [active]  (8.0G)
  16771860      5355       - free -  (2.6M)

=>       0  16771797  da0s1  BSD  (8.0G)
         0    759808      1  freebsd-ufs  (371M)
    759808   4065964      2  freebsd-swap  (1.9G)
   4825772   1087488      4  freebsd-ufs  (531M)
   5913260    614400      5  freebsd-ufs  (300M)
   6527660  10244137      6  freebsd-ufs  (4.9G)

=>     34  3145661  da1  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

=>     34  3145661  da2  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

=>     34  3145661  da3  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

=>     34  3145661  da4  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

Делаем из первых 3х дисков raidz пул.
freebsd8# zpool create storage raidz gpt/disk1 gpt/disk2 gpt/disk3

Смотрим список пулов:
freebsd8# zpool list
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
storage  4.47G   138K  4.47G     0%  ONLINE  -

Смотрим статус пулов:
freebsd8# zpool status
  pool: storage
 state: ONLINE
 scrub: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        storage        ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0

errors: No known data errors

Смотрим файловую систему:

freebsd8# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    359M    162M    169M    49%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/da0s1e    290M     12K    267M     0%    /tmp
/dev/da0s1f    4.7G    1.4G    3.0G    32%    /usr
/dev/da0s1d    514M    800K    472M     0%    /var
storage        2.9G    128K    2.9G     0%    /storage

Как и ожидалось - появился диск /storage размером (3-1)*1,5 = 3ГБ.

ребутимся для контроля и смотрим:
freebsd8# zpool status
  pool: storage
 state: ONLINE
 scrub: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        storage        ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0

errors: No known data errors
freebsd8# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    359M    162M    169M    49%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/da0s1e    290M     12K    267M     0%    /tmp
/dev/da0s1f    4.7G    1.4G    3.0G    32%    /usr
/dev/da0s1d    514M    818K    472M     0%    /var
storage        2.9G    128K    2.9G     0%    /storage
freebsd8#

Все как и было. Теперь моделируем первую ситуацию - "умирание" одного из дисков в пуле. К сожалению я не знаю как можно онлайн убрать в ESX у виртуалке диск (в VMWare Workstation это можно), поэтому я выключаю сервер и удаляю один диск.
 Загружаемся и смотрим что у нас получилось:
freebsd8# zpool status
  pool: storage
 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
        storage        DEGRADED     0     0     0
          raidz1       DEGRADED     0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  UNAVAIL      0     0     0  cannot open
            gpt/disk3  ONLINE       0     0     0

errors: No known data errors
freebsd8#

Видим, пул перешел в статус DEGRADED, что значит что произошел сбой и мы также видим что недоступен второй диск, который мы и удаляли.
Чтож, заменим его нашим четвертым диском.

freebsd8# zpool replace storage gpt/disk2 gpt/disk4
freebsd8# zpool status
  pool: storage
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Jan 26 13:03:37 2010
config:

        NAME           STATE     READ WRITE CKSUM
        storage        ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0  27.5K resilvered
            gpt/disk4  ONLINE       0     0     0  41.5K resilvered
            gpt/disk3  ONLINE       0     0     0  25K resilvered

errors: No known data errors
freebsd8#
Видим, что на место диска 2 встал диск 4 и пул перешел в статус ONLINE, что значит рабочее состояние.
Просто супер - так просто - вставляешь диск и одной командой восстанавливаешь массив.

Рушим пул, перегружаем  (дабавив удаленный диск) и делаем новый массив с spare-диском.
freebsd8# zpool destroy storage
freebsd8# zpool list
no pools available

init 0

freebsd8# zpool list
no pools available
freebsd8# zpool create -f storage raidz gpt/disk1 gpt/disk2 gpt/disk3 spare gpt/disk4
freebsd8# zpool list
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
storage  4.47G   144K  4.47G     0%  ONLINE  -
freebsd8# zpool status
  pool: storage
 state: ONLINE
 scrub: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        storage        ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
        spares
          gpt/disk4    AVAIL

errors: No known data errors
freebsd8#

Для теста создаем в пуле какой нить файл,  пусть даже нулевой.
freebsd8# touch /storage/test_file
freebsd8# ls -l /storage
total 1
-rw-r--r--  1 root  wheel  0 Jan 26 13:15 test_file
freebsd8# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    359M    162M    169M    49%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/da0s1e    290M     12K    267M     0%    /tmp
/dev/da0s1f    4.7G    1.4G    3.0G    32%    /usr
/dev/da0s1d    514M    832K    472M     0%    /var
storage        2.9G    128K    2.9G     0%    /storage

Выключаем сервер и на этот раз удаляем 3ий диск.
Получаем следующую картину:
freebsd8# zpool status
  pool: storage
 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: scrub completed after 0h0m with 0 errors on Tue Jan 26 13:22:01 2010
config:

        NAME           STATE     READ WRITE CKSUM
        storage        DEGRADED     0     0     0
          raidz1       DEGRADED     0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  UNAVAIL      0   100     0  cannot open
        spares
          gpt/disk4    AVAIL

errors: No known data errors

Вообще конечно если посмотреть на содержимое пула то мы увидим что он работает и на запись и на чтение.
Пробуем заменить неработающий диск на резервный (зачем? а для эксперимента)

freebsd8# zpool replace storage gpt/disk3 gpt/disk4
freebsd8# zpool status
  pool: storage
 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: resilver completed after 0h0m with 0 errors on Tue Jan 26 13:22:31 2010
config:

        NAME             STATE     READ WRITE CKSUM
        storage          DEGRADED     0     0     0
          raidz1         DEGRADED     0     0     0
            gpt/disk1    ONLINE       0     0     0  31.5K resilvered
            gpt/disk2    ONLINE       0     0     0  30.5K resilvered
            spare        DEGRADED     0     0     0
              gpt/disk3  UNAVAIL      0   328     0  cannot open
              gpt/disk4  ONLINE       0     0     0  51.5K resilvered
        spares
          gpt/disk4      INUSE     currently in use

errors: No known data errors
freebsd8# ls -l /storage
total 1
-rw-r--r--  1 root  wheel  0 Jan 26 13:15 test_file
freebsd8# cp /storage/test_file  /tmp/
freebsd8# ls -l /tmp/
total 10
drwxrwxrwt  2 root  wheel     512 Jan 26 13:21 .ICE-unix
drwxrwxrwt  2 root  wheel     512 Jan 26 13:21 .X11-unix
drwxrwxrwt  2 root  wheel     512 Jan 26 13:21 .XIM-unix
drwxrwxrwt  2 root  wheel     512 Jan 26 13:21 .font-unix
drwxrwxr-x  2 root  operator  512 Jan 26 08:47 .snap
-rw-r--r--  1 root  wheel       0 Jan 26 13:23 test_file
freebsd8# clear
freebsd8# zpool status
  pool: storage
 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: resilver completed after 0h0m with 0 errors on Tue Jan 26 13:22:31 2010
config:

        NAME             STATE     READ WRITE CKSUM
        storage          DEGRADED     0     0     0
          raidz1         DEGRADED     0     0     0
            gpt/disk1    ONLINE       0     0     0  31.5K resilvered
            gpt/disk2    ONLINE       0     0     0  30.5K resilvered
            spare        DEGRADED     0     0     0
              gpt/disk3  UNAVAIL      0   384     0  cannot open
              gpt/disk4  ONLINE       0     0     0  51.5K resilvered
        spares
          gpt/disk4      INUSE     currently in use

errors: No known data errors
freebsd8# touch /storage/qqqqqqqqqqqqqqqqqqq
freebsd8# ls -l /storage/
total 1
-rw-r--r--  1 root  wheel  0 Jan 26 13:24 qqqqqqqqqqqqqqqqqqq
-rw-r--r--  1 root  wheel  0 Jan 26 13:15 test_file

Убираем несуществующий диск:
freebsd8# zpool detach storage gpt/disk3
freebsd8# zpool status
  pool: storage
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Jan 26 13:22:31 2010
config:

        NAME           STATE     READ WRITE CKSUM
        storage        ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0  31.5K resilvered
            gpt/disk2  ONLINE       0     0     0  30.5K resilvered
            gpt/disk4  ONLINE       0     0     0  51.5K resilvered

errors: No known data errors
freebsd8#
 Видим что массив перешел в режим ONLINE.

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

Рушим все схемы и партиции на испытуемых дисках:
gpart delete -i 1 da1..da4
gpart destroy da1..da4

Создаем заново
gpart create -s GPT da1..da4
gpart add -b 34 -s 3145661 -i 1 -t freebsd-zfs -l disk1..disk4 da1..da4

Смотрим результат:
freebsd8# gpart show
=>      63  16777152  da0  MBR  (8.0G)
        63  16771797    1  freebsd  [active]  (8.0G)
  16771860      5355       - free -  (2.6M)

=>       0  16771797  da0s1  BSD  (8.0G)
         0    759808      1  freebsd-ufs  (371M)
    759808   4065964      2  freebsd-swap  (1.9G)
   4825772   1087488      4  freebsd-ufs  (531M)
   5913260    614400      5  freebsd-ufs  (300M)
   6527660  10244137      6  freebsd-ufs  (4.9G)

=>     34  3145661  da1  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

=>     34  3145661  da2  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

=>     34  3145661  da3  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

=>     34  3145661  da4  GPT  (1.5G)
       34  3145661    1  freebsd-zfs  (1.5G)

zpool create -f storage raidz gpt/disk1 gpt/disk2 gpt/disk3 spare gpt/disk4

Проверяем:
freebsd8# zpool status
  pool: storage
 state: ONLINE
 scrub: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        storage        ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
        spares
          gpt/disk4    AVAIL

errors: No known data errors

Создаем тестовый файл и проверяем его существование:
freebsd8# touch /storage/test_file
freebsd8# ls -l /storage/
total 1
-rw-r--r--  1 root  wheel  0 Jan 27 05:48 test_file

Выключаем сервер. "вынимаем" один из дисков.
Загружаемся.
freebsd8# zpool status
  pool: storage
 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
        storage        DEGRADED     0     0     0
          raidz1       DEGRADED     0     0     0
            gpt/disk1  UNAVAIL      0   184     0  cannot open
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
        spares
          gpt/disk4    AVAIL

errors: No known data errors
Видим что массив "деградировал"... смотрим содержимое нашего пула:
freebsd8# ls -l /storage/
total 1
-rw-r--r--  1 root  wheel  0 Jan 27 05:48 test_file

Файлы на месте.
Пробуем создать в нем новый файл.
freebsd8# touch /storage/test_file2

И проверяем:
freebsd8# ls -l /storage/
total 1
-rw-r--r--  1 root  wheel  0 Jan 27 05:48 test_file
-rw-r--r--  1 root  wheel  0 Jan 27 05:53 test_file2

То есть видим что массив работает на чтение и запись.

Как сохранить свои данные? Часть 2. Тестируем ZFS, моделируем отказы дисков.: 2 комментария

  1. Илья

    Я тестирую raidz на оснвое FreeNAS, FreeBSD 8.2, есть пул RaidZ с тремя членами gpt/ada0, gpt/ada2, ada3p2.
    Харды использовал заведомо полудохлые, чтоб научиться восстанавливать массив. Харды начались сыпаться по одному, в итоге я не могу удалить или вывести в offline ЛЮБОЙ член массива, даже реально существующие харды. На все zpool offline/detach система выдает cannot detach ada3p2: no valid replicas. Не знаю что делать, resilvering проходит до конца, но дальше массивом невозможно управлять. Замену делал на холодную, spare нет. Есть какие-нибудь мысли как отключить из массива несуществующие харды?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

CAPTCHA image
*