Повышение отказоустойчивости ZFS пула

О чём эта статья?

Термины

Введение

В один из дней обратил внимание на то, что один из дисков в ZFS пуле на домашнем сервере не прошёл smart проверку по одному из параметров. В целом, благодаря отказоустойчивости ZFS как технологии — это не старшно. При правильной настройке отказ одного из дисков не повлияет на сохранность файлов. Диск о котором идёт речь, объединён в two-way зеркало. Это означает, что есть второй диск, который имеет идентичное содержание. На следующий день я приобрёл в ближайшем магазине новый диск на замену.

Выбор диска

Все HDD, которые сейчас размещены в домашнем сервере — это бывшие диски из ноутбуков. Эти диски были заменены на SSD накопители, для более быстрой и комфортной работы на ноутбуках. А HDD так и оставались лежать у меня мёртвым грузом, пока не решил развернуть у себя дома полноценный сервер. Который отвечает за файло-обмен, удалённый доступ, разворачивание тестовой инфраструктуры, работу с сетью и т.п. Поэтому в нём стоит 2 диска по 0.5TB и 2 диска по 1TB от разных брендов, разного возраста и разной скорости вращения. Объединив эти диски в два зеркала в соответствии с их размером — получаем используемый объём как 1.5TB. Поскольку сервер показал себя как очень полезный инструмент повседневной жизни, нужно приобрести для него нормальные диски. Выбор пал на Seagate IronWolf версии на 2TB. Серия IronWolf специально разработана и заточена под использование в NAS системах. Это CMR, а не SMR диски (что принципиально важно для NAS и ZFS в частности), для разворачивания вместе от 1 до 8 дисков в одном корпусе. Надёжность для NAS решений достигается за счёт большого кол-ва внутренних сенсоров. А так же механизма ускорения-замедления вращения, для вывода диска из гармоничного вращение с другими дискам, для защиты диска от фатальных вибраций. На текущий момент этот диск у меня только один. Потому что в наличии в ближайшем магазине был только один. Но планирую докупить ещё таких же дисков, возможно большего объёма.

Подключение диска

Это стандартная процедура добавления нового HDD/SSD в компьютер. Выключаем компьютер. Подключаем к новому диску питание, данные через SATA кабель и крепко фиксируем диск в корпусе всеми доступными винтами. На этом этапе задерживаться не буду, т.к. у людей работающих с компьютерами этот навык уже развит, а для новичков есть масса инструкций в интернете.

Настройка

После включения системы находим новый HDD. Он получил идентификатор sdg.

root@homeserver:~# lsblk  | grep disk
sda        8:0    0 111.8G  0 disk
sdb        8:16   0 447.1G  0 disk
sdc        8:32   0 465.8G  0 disk
sdd        8:48   0 931.5G  0 disk
sde        8:64   0 465.8G  0 disk
sdf        8:80   0 931.5G  0 disk
sdg        8:96   0   1.8T  0 disk

Перепроверяем здоровье дисков с помощью программы skdump. В моём случае я заранее знаю, что sdc проблемный диск. Перепроверяю его. Вижу no для параметра airflow-temperature-celsius. Это означает, что диск систематически перегревается. Даже несмотря на то, что на него направлен обдув свежим воздухом внутри корпуса и перегрев происходить не должен.

Проверим состояние пула, что бы определить куда нужно добавить диск.

root@homeserver:~# zpool status zroot
  pool: zroot
 state: ONLINE
  scan: scrub repaired 0B in 02:06:42 with 0 errors on Sun Jul 23 04:11:39 2023
config:

        NAME                                          STATE     READ WRITE CKSUM
        zroot                                         ONLINE       0     0     0
          mirror-0                                    ONLINE       0     0     0
            9cad13fc-f66c-48f8-ad54-53431bc875d8      ONLINE       0     0     0
            7ef347a3-d687-4837-8844-e34aeaf36841      ONLINE       0     0     0
          mirror-1                                    ONLINE       0     0     0
            1e94af20-874e-44a4-89b1-7036d09770f5      ONLINE       0     0     0
            d8e0580e-9fe5-40fb-957e-4bad12d5abc4      ONLINE       0     0     0
        special
          ata-KINGSTON_SA400S37480G_50026B73816CB210  ONLINE       0     0     0

errors: No known data errors

У меня диски привязаны к пулу по их partuuid. Поэтому дополнительно установлю какой partuuid относиться к sdc диску.

root@homeserver:~# ls -alh /dev/disk/by-partuuid/ | grep sdc
lrwxrwxrwx 1 root root  10 Jul 29 18:19 7ef347a3-d687-4837-8844-e34aeaf36841 -> ../../sdc2
lrwxrwxrwx 1 root root  10 Jul 29 18:19 dbef25d2-4c7e-41b2-b27e-709865a14f5f -> ../../sdc1

Видим, что партиция, участвующая в пуле, диска sdc имеет uuid 7ef347a3-d687-4837-8844-e34aeaf36841.

Итак, теперь самое главное. Присоединяем дополнительный диск к зеркалу, в котором участвует проблемный диск

root@homeserver:~# zpool attach zroot 7ef347a3-d687-4837-8844-e34aeaf36841 /dev/sdg

Это запустить процесс resilvering. Что можно описать как “процесс приведения диска к нужному актуальному состоянию”. Наблюдать за прогрессом можно с помощью команды:

root@homeserver:~# zpool status zroot
  pool: zroot
 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 Sat Jul 29 17:07:51 2023
        981G scanned at 10.0G/s, 579G issued at 5.91G/s, 981G total
        467M resilvered, 59.06% done, 00:01:07 to go
config:

        NAME                                          STATE     READ WRITE CKSUM
        zroot                                         ONLINE       0     0     0
          mirror-0                                    ONLINE       0     0     0
            9cad13fc-f66c-48f8-ad54-53431bc875d8      ONLINE       0     0     0
            7ef347a3-d687-4837-8844-e34aeaf36841      ONLINE       0     0     0
            sdg                                       ONLINE       0     0     0  (resilvering)
          mirror-1                                    ONLINE       0     0     0
            1e94af20-874e-44a4-89b1-7036d09770f5      ONLINE       0     0     0
            d8e0580e-9fe5-40fb-957e-4bad12d5abc4      ONLINE       0     0     0
        special
          ata-KINGSTON_SA400S37480G_50026B73816CB210  ONLINE       0     0     0

errors: No known data errors

Когда процесс закончиться, мы увидим следующее:

root@homeserver:~# zpool status zroot
  pool: zroot
 state: ONLINE
  scan: resilvered 402G in 01:09:21 with 0 errors on Sat Jul 29 18:17:12 2023
config:

        NAME                                          STATE     READ WRITE CKSUM
        zroot                                         ONLINE       0     0     0
          mirror-0                                    ONLINE       0     0     0
            9cad13fc-f66c-48f8-ad54-53431bc875d8      ONLINE       0     0     0
            7ef347a3-d687-4837-8844-e34aeaf36841      ONLINE       0     0     0
            sdg                                       ONLINE       0     0     0
          mirror-1                                    ONLINE       0     0     0
            1e94af20-874e-44a4-89b1-7036d09770f5      ONLINE       0     0     0
            d8e0580e-9fe5-40fb-957e-4bad12d5abc4      ONLINE       0     0     0
        special
          ata-KINGSTON_SA400S37480G_50026B73816CB210  ONLINE       0     0     0

errors: No known data errors

То, что теперь один из дисков имеет имя устройства, а не partuuid — это не совсем эстетично. Давайте опционально исправим это. Временно выключим всё, что использует наш пул (например: контейнеры, пользователей, VM и прочее) и запустим такую команду: zpool export zroot && zpool import -d /dev/disk/by-partuuid/ zroot.

Проверим, что всё отработало как мы ожидали.

root@homeserver:~# zpool status zroot
  pool: zroot
 state: ONLINE
  scan: resilvered 402G in 01:09:21 with 0 errors on Sat Jul 29 18:17:12 2023
config:

        NAME                                      STATE     READ WRITE CKSUM
        zroot                                     ONLINE       0     0     0
          mirror-0                                ONLINE       0     0     0
            9cad13fc-f66c-48f8-ad54-53431bc875d8  ONLINE       0     0     0
            7ef347a3-d687-4837-8844-e34aeaf36841  ONLINE       0     0     0
            77e5ce62-88a0-db42-b0d8-a895c4171e91  ONLINE       0     0     0
          mirror-1                                ONLINE       0     0     0
            1e94af20-874e-44a4-89b1-7036d09770f5  ONLINE       0     0     0
            d8e0580e-9fe5-40fb-957e-4bad12d5abc4  ONLINE       0     0     0
        special
          2ddb513e-a16f-b940-a6ee-dbf31ab0b8c0    ONLINE       0     0     0

errors: No known data errors

Отлично. Всё как и ожидалось. Все диски теперь имеют partuuid наименования и сохранят их при перезагрузке.

Завершение

По ходу этой статьи мы успешно повысили надежность пула. Пока что доступный к использованию размер пула не увеличился, т.к. ZFS выравнивает зеркала по размеру наименьшего диска. На данный момент для меня было важно для перестраховки добавить ещё один диск к пулу, что бы не потерять данные и потом не тратить время на восстановление из бэкапов. А расширением места и переконфигурацией дисков можно будет заняться позже, когда будут доставлены оставшиеся диски.