Как сохранить свои данные? Часть 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
То есть видим что массив работает на чтение и запись.
Июнь 27th, 2011 в 8:22
Я тестирую raidz на оснвое FreeNAS, FreeBSD 8.2, есть пул RaidZ с тремя членами gpt/ada0, gpt/ada2, ada3p2.
Харды использовал заведомо полудохлые, чтоб научиться восстанавливать массив. Харды начались сыпаться по одному, в итоге я не могу удалить или вывести в offline ЛЮБОЙ член массива, даже реально существующие харды. На все zpool offline/detach система выдает cannot detach ada3p2: no valid replicas. Не знаю что делать, resilvering проходит до конца, но дальше массивом невозможно управлять. Замену делал на холодную, spare нет. Есть какие-нибудь мысли как отключить из массива несуществующие харды?
Сентябрь 19th, 2011 в 2:37
К сожалению с подобным не сталкивался.