Заменяем диск в zfs raidz

Mar 21, 2013 00:15

Замена диска в 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-3C
config:
        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 разделах можно только его предварительно разрушив :(

руками, zfs

Previous post Next post
Up