Плановая замена диска в узле
Плановая замена — это когда диск ещё жив: он выработал ресурс, вышел из поддерживаемой модели или показывает предвестники отказа. От аварийной замены она отличается одним важным свойством: порядок задаёте вы, а не отказ. Значит можно подготовить донора, подсветить нужную корзину и заменить диск, не выводя пул из избыточности ни на минуту.
Диск в модели vStack Center описан тремя независимыми осями, и путать их — главный источник ошибок в этом сценарии. Ни одна ось не выводится из другой.
| Ось | Где видно | Что означает | Что меняет |
|---|---|---|---|
| Здоровье | Колонка Status на табе Disk props | Состояние носителя по факту | Узел, по факту |
| Роль | Только через API | Роль диска: свободен, размечен, член пула, запасной | Опрос диска, метка запасного, снятие метки, замена |
| Онлайн в кластере | Только через API | Диск выведен в кластерную фабрику и виден всем узлам | Вывод диска в кластер и снятие с кластера |
Сама замена — одна операция. Она не «вынимает» диск из корзины: она переводит пул на устройство-донора и запускает ресинхронизацию. Старый диск физически извлекают позже, когда пул перестанет на него опираться.
Операции с физическими дисками, кроме подсветки, в веб-интерфейсе не представлены: замену, метку запасного и снятие диска с кластера выполняет администратор через API — см. Справочник API. Интерфейс в этом сценарии отвечает за другое: показать диск, его место в корзине, состояние пула и ход ресинхронизации.
Замена — самая опасная операция дисковой подсистемы, поэтому у неё своя защита от потери данных. Перед отправкой команды vStack Center сам опрашивает узел о реальной роли донора и отправляет команду только если донор свободен — запасной или неиспользуемый. Если донор занят, если его состояние выяснить не удалось, или если сбойное и новое устройство совпадают, замена отклоняется до отправки на узел. Параллельные замены в один пул не допускаются.
Все команды дисковой подсистемы асинхронные: принятая команда означает «передано агенту узла». Реальный исход приходит ответом узла, и виден он в следующем чтении списка дисков или состояния пула.
Предусловия
- роль Cluster master (role_id=1) — её требуют все операции с физическими дисками;
- признак
feature.physical_disc_management— без него закрыта вся дисковая подсистема; признак лежит в опциях кластера; - диск-донор в том же узле: свободный или уже помеченный запасным. Донор в другом узле не подойдёт — замена работает в границах одного узла;
- известны имя пула и путь заменяемого устройства;
- в пуле не идёт другая замена: одна замена на пул за раз;
- версия vStack Center — 3.0.5: операции с физическими дисками появились в этом релизе.
Шаг 1. Найти диск и его место в корзине
Диск нужно опознать трижды: по учётной записи в списке дисков, по пути устройства (его требует команда замены) и по месту в корзине — чтобы вынуть правильный.
-
Откройте Provider Data Center → Server Nodes и выберите узел, затем разверните блок Disks. Тот же список по пулу лежит на карточке пула в разделе Pool Disks — откройте пул из таблицы ZFS pools раздела Storage Resources.
-
Переключайте табы: один и тот же список показан разными срезами. Колонка ID связывает строки всех табов между собой, а над таблицей есть поиск (Search in table).
Таб Колонки Зачем на этом шаге Disk props ID, Model, Size (GB), Status Опознать модель, размер и здоровье ZFS props Pool name, Vdev_pool_name, Vdev_guid, Vdev_pool_guid Убедиться, что диск в нужном пуле Placement Enclosure_device, Enclosure_id, Dev_index, Device Найти корзину и слот LED on panel Led_fault, Led_locate Проверить, что подсветка включилась Timestamps Created, Last_seen Понять, свежая ли запись о диске -
Выпишите узел и Device — они понадобятся для команды замены, а Enclosure_device и Dev_index — для подсветки. Заполненные Pool name и Vdev_pool_name подтверждают, что диск действительно член пула, а не свободный.
Роль диска и признак «выведен в кластер» в этих таблицах не показываются — их отдаёт API. Проверьте их до замены: донора выбирают именно по роли.
Шаг 2. Подсветить диск в корзине
Ошибка в слоте стоит второго диска, поэтому подсветку включают до выезда в машинный зал. Индикаторов два: «этот» и «отказ».
- В блоке Disks карточки узла перейдите на таб Front view или Inner view — у каждого диска там есть кнопки подсветки и индикации отказа.
- Включите индикатор «этот» на заменяемом диске.
- Проверьте, что индикатор действительно горит: таб LED on panel, колонки Led_fault и Led_locate.
Ту же операцию можно выполнить через API — тогда имя корзины передаётся в формате
/dev/sesN, а не так, как оно показано в колонке Enclosure_device. Другой
формат отклоняется с кодом -24307, неизвестная корзина — с -24316.
Шаг 3. Снять снимок здоровья пула до операции
Перед вмешательством зафиксируйте исходную картину — иначе после замены не с чем сравнивать.
- Откройте Provider Data Center → Storage Resources. Таблица ZFS pools несёт колонки GUID, Name, Health, Consuming, Scrubbing, Resilvering, Current node и Capacity (RAW).
- Запишите Health, Resilvering и Current node заменяемого пула. Плановую замену начинают только со здорового пула: у деградированного порядок другой, он описан в «Восстановлении деградированного пула».
- Откройте пул и посмотрите раздел Properties: Capacity, Provisioned, Used и Free покажут, хватит ли места на ресинхронизацию.
Таблица и страница пула отвечают из базы vStack Center и показывают последнее снятое состояние. Живое дерево пула с состоянием каждого устройства отдаёт API — оно понадобится, если картина в интерфейсе разойдётся с фактом.
Шаг 4. Подготовить донора
Донор должен быть свободен — иначе защита не пропустит команду. «Свободен» означает роль «запасной» или «неиспользуемый». Роль в базе может отставать от реальности, поэтому её сначала актуализируют живым опросом узла.
- Найдите кандидатов на карточке узла в блоке Disks: на табе ZFS props у свободного диска пустые Pool name и Vdev_pool_name. Сверьте Size (GB) — донор должен быть не меньше заменяемого.
- Обновите роль кандидата живым опросом узла через API: узел отвечает о диске по пути устройства, и vStack Center записывает актуальную роль. Для диска, ещё не учтённого инвентаризацией, опрос ничего не меняет — такой диск сначала нужно инвентаризовать со страницы узла.
- Если донор просто свободен, его можно оставить как есть: замена принимает и запасной, и неиспользуемый диск. Если вы держите в узле явный резерв, пометьте диск запасным через API. Операция деструктивная — узел пишет на диск служебную метку, поэтому на диске с живыми данными узел откажет, пока метку не потребуют принудительно.
- Перечитайте список дисков и убедитесь, что Pool name у донора остался пустым.
Шаг 5. Выполнить замену
Теперь одна команда — её выполняет администратор через API. Все проверки проходят до отправки на узел, поэтому ошибочный вызов до диска не доедет.
Что нужно подготовить:
- узел, в котором стоят оба диска;
- имя пула, в котором идёт замена;
- путь заменяемого устройства из колонки Device;
- путь донора — он должен отличаться от заменяемого устройства.
Принятая команда означает только «отправлено узлу». Реальный исход приходит ответом узла. При успехе новое устройство отмечается как член пула. При провале возвращается ошибка, и старый диск не помечается сбойным автоматически — его роль остаётся прежней.
Шаг 6. Дождаться ресинхронизации
Пул восстанавливает избыточность самостоятельно, vStack Center только показывает процесс.
- Откройте Storage Resources и следите за колонками Resilvering и Health заменяемого пула. Единица в Resilvering означает, что пул восстанавливает избыточность после замены.
- Замена считается завершённой, когда Resilvering вернулся к нулю, а Health остался здоровым.
- Сверьте состав пула: на карточке пула в разделе Pool Disks, таб Placement, на месте старого диска должен появиться донор.
Прогресс в процентах vStack Center не показывает — есть только признак «идёт или нет». Оценивайте время по объёму пула из раздела Properties.
Шаг 7. Отключить и извлечь старый диск
Пока диск онлайн в кластере, кластер считает его своим. Перед физическим извлечением снимите этот признак — операция идёт через API и удаляет LUN из фабрики. Диск указывают серийным номером (предпочтительно) или путём устройства.
Не выводите из кластера диск, который всё ещё член активного пула: пул деградирует. Убедитесь по разделу Pool Disks, что пул опирается на донора, а не на старый диск. Узел защищает живую разметку данных и вернёт отказ, но полагаться на этот отказ вместо проверки не стоит.
После вызова перечитайте список дисков: признак «выведен в кластер» у диска снимается. Теперь диск можно вынимать.
Завершение работ
- Погасите оба индикатора: карточка узла → блок Disks → таб Front view или Inner view. Проверьте результат на табе LED on panel.
- Восстановите резерв. Донор ушёл в пул, значит запасного диска в узле больше нет: выведите новый диск в кластер и пометьте его запасным через API.
- Обновите инвентарь после физических изменений — запустите инвентаризацию узла
по классам
ses, затемcam. Иначе в списке дисков останется запись про вынутый диск с устаревшим Last_seen. - Сверьте итоговую картину на табе ZFS props: у нового члена пула заполнены Pool name и Vdev_pool_name, у запасного — Pool name пустой.
Проверка результата
| Что проверяем | Где смотреть | Ожидаемо |
|---|---|---|
| Пул опирается на новый диск | Карточка пула, Pool Disks → Placement | На месте старого диска стоит донор |
| Ресинхронизация закончилась | Storage Resources | Resilvering = 0, Health здоровый |
| Новый диск учтён как член пула | Pool Disks → ZFS props | У донора заполнены Pool name и Vdev_pool_name |
| Старый диск выведен из кластера | Через API | Признак «выведен в кластер» снят |
| Индикация погашена | Блок Disks → LED on panel | Led_fault и Led_locate выключены |
| Резерв восстановлен | Через API | В узле есть диск с ролью «запасной» и пустым Pool name |
Если не получилось
| Что видите | Почему | Что делать |
|---|---|---|
| Код ошибки -24907 | Донор не свободен: его роль не «запасной» и не «неиспользуемый» | Освободите диск или возьмите другой; роль обновите живым опросом узла |
| Код ошибки -24908 | Состояние донора выяснить не удалось: узел не ответил или истёк тайм-аут | Замена отклонена намеренно. Проверьте связь с узлом и повторите опрос диска |
| Код ошибки -24905 | Заменяемое и новое устройство совпадают | Укажите разные устройства |
| Код ошибки -24906 | В этом пуле уже идёт замена | Дождитесь завершения текущей: одна замена на пул |
| Код ошибки -24902 | Пул пустой или не существует на узле | Сверьте имя пула с колонкой Name таблицы ZFS pools; пул может быть не импортирован на этом узле |
| Код ошибки -24903 | Не передан путь заменяемого устройства | Возьмите путь из колонки Device |
| Код ошибки -24904, -24502, -24402, -24803 | Путь устройства не прошёл проверку формата | Приведите путь к виду /dev/daN |
| Код ошибки -24504 | Над диском уже идёт деструктивная операция | Дождитесь ответа узла: два деструктива над одним диском не выполняются |
| Код ошибки -24503 | Диск уже помечен запасным | Повтор не нужен, проверьте роль диска |
| Код ошибки -24603 | Диск не помечен запасным, снимать нечего | Проверьте роль диска перед снятием метки |
| Код ошибки -24307 | Не тот формат имени корзины | Передавайте имя в виде /dev/sesN, а не так, как оно показано в колонке Enclosure_device |
| Код ошибки -24316 | Корзина не найдена | Сверьте Enclosure_id и Enclosure_device на табе Placement; при расхождении переснимите инвентарь |
| Код ошибки -24311, -24313, -24315 | Значение индикатора не 0 и не 1 либо не передан ни один индикатор | Передайте хотя бы один индикатор значением 0 или 1 |
| Код ошибки -24802 | Не задан ни серийный номер, ни путь диска | Передайте хотя бы один идентификатор диска |
| Код ошибки -24901, -24501, -24601, -24801, -24401, -24301, -24201 | Выключен признак feature.physical_disc_management | Включите управление физическими дисками в опциях кластера |
| Код ошибки -403 | Операция открыта только роли Cluster master | Войдите под ролью уровня кластера |
| Команда принята, а в списке дисков ничего не изменилось | Команда только передана агенту узла, исход приходит позже | Откройте экраны заново; свежесть смотрите по Last_seen |
| Метка запасного прошла, роль не изменилась | Диск ещё не учтён инвентаризацией — записывать роль некуда | Запустите инвентаризацию узла по классу cam, затем повторите |
| Пул ушёл в DEGRADED после извлечения диска | Диск вынули до того, как пул перешёл на донора | Верните диск в корзину и действуйте по сценарию восстановления |
| Замена прошла, но избыточности всё равно нет | Пул опирается на донора, а запасного в узле больше нет | Выведите в кластер новый диск и пометьте его запасным |
Ограничения
Проверку целостности пула (scrub) из vStack Center не запустить: такой операции нет. Колонка Scrubbing только сообщает, идёт ли процесс, начатый на узле.
Добавить диск в пул новым устройством vStack Center тоже не умеет — вывод диска в кластер делает его видимым узлам, но состав пула меняется на узле. Замена существующего члена пула — единственная операция над составом пула, доступная из vStack Center.
Свойство пула autoreplace отдаёт API. Если оно выключено, автоматической
подстановки запасного диска не будет, и замену всегда запускает администратор.
См. также
- Модель слоя хранения, откуда берутся ёмкость и состояние пула — «Пулы хранения».
- Карта пулов и живой опрос узла — «Как посмотреть пулы кластера».
- Аварийный порядок, когда пул уже потерял избыточность — «Восстановление деградированного пула».
- Вывод дисков нового узла в кластер — «Ввод нового узла в работу».
Методы API
Операции этой страницы в API: pd-list, pd-status-map, pd-led, pd-info,
pd-spare, pd-unspare, pd-replace, pd-use, pd-unuse,
pd-pools-status, pool-map-by-guid, pools-get, node-inventory — см.
Справочник API.