Замена диска в RAID массиве - потенциально опасная операция. Если в процессе замены заменяющий диск даст сбой, будут проблемы, от неприятных до фатальных. ZFS - надежная система. И в большинстве случаев выдерживает такую проблему. Но не всегда. Давайте аккуратно разберемся как заменять диск и каких действий избегать.
Прим. Серию экспериментов для этого поста проводил на виртуальной машине с nas4free 9.0.0.1 rev 249. Но на практике и на живом железе многократно менял диски в zfs raidz. И даже сталкивался с проблемой падения заменяющего диска. Так что с уверенностью скажу - на живом железе всё точно также. Только страшнее :)
ВАЖНО. Самое вредное, что можно сделать - это наобум набирать разные команды, особенно с ключём -f
См
пример того, как подобная команда привела к тому, что пул придётся бекапить, разбирать и собирать по новой. И это ещё повезло - команды есть и более деструктивные.
1. IMHO заменять диски надо через командную строку. Это гибче, функциональные и проще, чем через вебгуй. Как делать это через вебгуй - я не знаю, извините.
2. Заменяющий диск должен быть такого же объёма (или большего) как заменяемый. Обязательно проверьте его перед использованием,
например. Падение диска в процессе замены - неприятная штука. Если этот диск ранее использовался в zfs пуле, например для тестов - обнулите его.
zpool labelclear /dev/da0
3. Определитесь возможностью использования заменяемого диска в процессе замены (
Подробнее). Если с него хоть что-то читается, у вас есть свободный SATA порт и временное место ещё под один диск - подключите заменяющий диск параллельно заменяемому. Это улучшит шансы на хороший исход если что-то пойдёт не так.
Если заменяемый диск мертв или портов не хватает - переведите его в автономный режим.
nas4free:~# zpool offline Pool ada3
nas4free:~# zpool status
pool: Pool
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: resilvered 2.42G in 0h5m with 0 errors on Wed Mar 20 19:01:01 2013
config:
NAME STATE READ WRITE CKSUM
Pool DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
478512335560695467 OFFLINE 0 0 0 was /dev/ada3
ada2 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
4. Теперь внимательно смотрим на наш массив, на чем он сделан. Возможно много вариантов, но реально - три. На сырых дисках, на .nop устройствах и на gpt разделах. (устройства выглядят соответственно как ada0, ada0.nop и что-то вроде /dev/gpt/disk12WDG1708)
Наиболее надёжный вариант во FreeBSD - на gpt разделах, как это делать руками - см.
здесь. Но если вы создавали массив через вебгуй nas4free (как и я), то массив был создан на nop устройствах поверх сырых дисков.
По результатам проведённых опытов (см подробнее ниже) я считаю, что после создания массива от .nop устройств надо избавиться. Если этого не сделать - увеличивается вероятность при замене диска в худшем случае (падение заменяющего диска в процессезамены) потерять массив. Напишу про удаление .nop
отдельный пост. Пожалуй, если вы не удалили .nop устройства раньше, их стоит удалить перед заменой диска.
5. Собственно замена.
nas4free:~# zpool replace Pool ada3 ada4
nas4free:~# zpool status
pool: Pool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Wed Mar 20 18:30:56 2013
299M scanned out of 7.29G at 17.6M/s, 0h6m to go
98.1M resilvered, 4.00% done
config:
NAME STATE READ WRITE CKSUM
Pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
replacing-0 ONLINE 0 0 0
ada3 ONLINE 0 0 0
ada4 ONLINE 0 0 0 (resilvering)
ada2 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
Если меняем диск, который перевели в автономный режим - команда замены может выгдядеть как
nas4free:~# zpool replace Pool 478512335560695467 ada4
Вот собственно и всё. Начинается замена, за которой можно наблюдать командой status (или через вебгуй nas4free).
Это если всё было ОК.
Давайте рассмотрим возможные проблемы
Пусть у нас в процессе замены упал заменяющий диск
nas4free:~# zpool status pool: Pool
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Wed Mar 20 18:30:56 2013
5.90G scanned out of 7.29G at 1/s, (scan is slow, no estimated time)
514M resilvered, 80.98% done
config:
NAME STATE READ WRITE CKSUM
Pool DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
replacing-0 DEGRADED 0 0 0
ada3 ONLINE 0 0 0
16242751459157794503 UNAVAIL 0 0 0 was /dev/ada4
ada2 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
Если у вас такое произошло, упавший диск надо попытаться отключить.
nas4free:~# zpool detach Pool 16242751459157794503
nas4free:~# zpool status
pool: Pool
state: ONLINE
scan: resilvered 514M in 0h7m with 0 errors on Wed Mar 20 18:38:48 2013
config:
NAME STATE READ WRITE CKSUM
Pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ada3 ONLINE 0 0 0
ada2 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
Если всё получилось - везение на вашей стороне. Если нет и диск не отключается - имеем редкую неприятную проблему, см.
ZFS: Cannot replace a replacing device Аналогично, используем detach в случае, если в процессе замены стали недоступны оба диска - и заменяемый и заменяющий (убедитесь только, что дело в дисках, а не в гнилых кабелях)
nas4free:~# zpool status pool: Pool
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Wed Mar 20 18:42:22 2013
6.69G scanned out of 7.29G at 1/s, (scan is slow, no estimated time)
257M resilvered, 91.72% done
config:
NAME STATE READ WRITE CKSUM
Pool DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
replacing-0 UNAVAIL 0 0 0
2050528262512619809 UNAVAIL 0 0 0 was /dev/ada3
14504872036416078121 UNAVAIL 0 0 0 was /dev/ada4
ada2 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
nas4free:~# zpool detach Pool 2050528262512619809
nas4free:~# zpool status pool: Pool
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 scan: resilvered 257M in 0h6m with 0 errors on Wed Mar 20 18:48:39 2013
config:
NAME STATE READ WRITE CKSUM
Pool DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
14504872036416078121 UNAVAIL 0 0 0 was /dev/ada4
ada2 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
Отрывая диски от виртуальной машины мне удалось получить и более тяжёлую ситуацию
nas4free:~# zpool status
no pools available
nas4free:~# zpool import
pool: Pool
id: 8374523812252373009
state: UNAVAIL
status: One or more devices are missing from the system.
action: The pool cannot be imported. Attach the missing
devices and try again.
see:
http://www.sun.com/msg/ZFS-8000-3Cconfig:
Pool UNAVAIL insufficient replicas
raidz1-0 UNAVAIL insufficient replicas
replacing-0 ONLINE
ada1.nop ONLINE
ada2.nop ONLINE
15699628039254375131 UNAVAIL cannot open
13721477516992971685 UNAVAIL cannot open
Видно, что пул не виден и не может быть импортирован. Фактически, информация пропала. Почему так произошло есть только предположение. В предыдущем случае пул был на сырых дисках, ada0, при этом диски были последовательно подсоединены к SATA контроллеру. Во втором случае пул был построен на nop устройствах, ada0.nop, а диски подсоединены к портам контроллера вперемешку. В принципе, ни то ни другое обычно не представляет никакой проблемы, zfs всё находит и собирает. Но, как видим, в сложном случае при наложении одного на другое возможна проблема.
ЕМНИП в профильной ветке было сообщение от камрада, который получил подобную проблему при переносе пула на другой компьютер. Он сумел её решить, переставляя диски по портам контроллера с целью подобрать "правильную" последовательность.
Для уменьшения места для проблем советую удалить nop устройства, они нужны только при создании пула. А общее решение (для FreeBSD и Linux, но не рекомендованное под Solaris) - массивы на gpt разделах, ссылка была выше. К сожалению, если массив уже создан - это благое пожелание. Так как переделать массив на сырых дисках в массив на gpt разделах можно только его предварительно разрушив :(