---
metadata:
  - name: generator
    content: Diplodoc Platform v5.62.0
alternate:
  - https://ydb.tech/docs/en/devops/concepts/selfheal-storage.md?version=main
  - https://ydb.tech/docs/ru/devops/concepts/selfheal-storage.md?version=main
  - href: https://ydb.tech/docs/ru/devops/concepts/selfheal-storage.md?version=main
    type: text/markdown
    title: Markdown version
  - href: https://ydb.tech/docs/ru/llms.txt?revision=5f9509b7856960211eefd47b7217d87c71bdf904&version=main
    rel: describedby
sourcePath: ru/core/devops/concepts/selfheal-storage.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt?revision=5f9509b7856960211eefd47b7217d87c71bdf904&version=main

# SelfHeal хранилища

SelfHeal хранилища — механизм автоматического восстановления отказоустойчивости хранилища YDB.

Общий обзор механизмов и условий их работы приведён в разделе [SelfHeal](https://ydb.tech/docs/ru/devops/concepts/selfheal.md?version=main). Восстановление реплик State Storage, Board и SchemeBoard описано в разделе [SelfHeal подсистем распространения метаданных](https://ydb.tech/docs/ru/devops/concepts/selfheal-metadata-distribution.md?version=main).

## Как работает SelfHeal хранилища {#how-it-works}

Компонент Sentinel, входящий в [CMS](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#cms), постоянно следит за состоянием [PDisk](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#pdisk) и узлов. Если неисправность сохраняется достаточно долго (по умолчанию около часа), Sentinel инициирует перенос затронутых [VDisk](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#vdisk) на исправное оборудование, чтобы снова соблюдалась [модель отказа](https://ydb.tech/docs/ru/concepts/topology.md?version=main#cluster-config).

Команду исполняет [Blob Storage Controller](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#ds-controller): данные реплицируются в фоне. Сам перенос может занять от минут до суток в зависимости от объёма данных и оборудования. После принятия команды для CMS задача уже поставлена; завершение репликации обеспечивает распределённое хранилище.

SelfHeal хранилища включён по умолчанию для [динамических групп](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#dynamic-group). В кластерах с конфигурацией V2 можно также включить [SelfHeal статической группы](https://ydb.tech/docs/ru/devops/configuration-management/configuration-v2/static-group-self-heal.md?version=main). На конфигурации V1 SelfHeal статической группы включить нельзя.

## Включение и выключение SelfHeal {#on-off}

Вы можете включать и выключать SelfHeal с помощью утилиты [YDB DSTool](https://ydb.tech/docs/ru/reference/ydb-dstool/index.md?version=main).

Чтобы включить SelfHeal выполните команду:

```bash
ydb-dstool -e <bs_endpoint> cluster set --enable-self-heal
```

`<bs_endpoint>` — эндпоинт произвольного [узла хранения](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#storage-node) кластера.

Чтобы выключить SelfHeal выполните команду:

```bash
ydb-dstool -e <bs_endpoint> cluster set --disable-self-heal
```

### Когда отключать SelfHeal {#when-to-disable}

Обычно SelfHeal оставляют включённым. Временно отключить его имеет смысл только тогда, когда автоматический перенос опаснее ожидания, например, если:

* обнаружена ошибка в SelfHeal, из-за которой перенос создаёт риск потери данных;
* одновременно отказало много узлов, кластер перегружен, а дополнительная фоновая репликация увеличит нагрузку и помешает оператору восстановить работоспособность кластера.

{% note warning %}

Пока SelfHeal отключён, VDisk с неисправных PDisk автоматически не переносятся. Контролируйте состояние хранилища и снова включите SelfHeal сразу после стабилизации кластера.

{% endnote %}

## Настройки SelfHeal {#settings}

Параметры ниже управляют разными этапами работы Sentinel: опросом состояния PDisk, подтверждением устойчивого состояния и повторами при передаче нового статуса в [Blob Storage Controller](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#ds-controller). Для каждого состояния время до его подтверждения определяется произведением **State update interval** и лимита циклов для этого состояния. Например, для большинства отказных состояний значения по умолчанию составляют 60 секунд и 60 циклов, поэтому переход в `FAULTY` начинается примерно через час. Интервалы обновления конфигурации и повторов смены статуса в это произведение не входят.

{% note warning %}

В штатной эксплуатации менять эти параметры не требуется. Значения по умолчанию подобраны для типичных кластеров. Меняйте их только если понимаете, как сдвиг задержки повлияет на скорость реакции SelfHeal, например по рекомендации разработчиков YDB.

{% endnote %}

Вы можете настроить SelfHeal в **Viewer** → **Cluster Management System** → **CmsConfigItems**.

Чтобы создать настройки впервые, нажмите кнопку **Create**. Если вам нужно изменить существующие настройки, нажмите кнопку ![карандаш](../../_assets/pencil.svg).

Доступны следующие настройки:

| **Параметр**                             | **Описание**                                                                                                                                                             |
|:---------------------------------------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Status**                               | Включение и выключение SelfHeal в CMS. |
| **Dry run**                              | Включение и выключение режима, в котором CMS не изменяет настройку BSC. |
| **Config update interval (sec.)**        | Период обновления конфигурации из BSC. |
| **Retry interval (sec.)**                | Период повторных попыток обновления конфигурации. |
| **State update interval (sec.)**         | Период обновления состояний PDisk'ов. |
| **Timeout (sec.)**                       | Таймаут обновления состояний PDisk'ов. |
| **Change status retries**                | Количество повторных попыток на изменение статуса PDisk в BSC (`ACTIVE`, `FAULTY`, `BROKEN` и др.). |
| **Change status retry interval (sec.)**  | Задержка между повторными попытками передать новый статус PDisk в BSC. |
| **Default state limit**                  | Для состояний, для которых не указана настройка, может использоваться это значение «по умолчанию». Для неизвестных состояний PDisk, для которых нет настройки, тоже используется это значение. Это значение используется, если значение не задано для состояний `Initial`, `InitialFormatRead`, `InitialSysLogRead`, `InitialCommonLogRead`, `Normal`. |
| **Initial**                              | PDisk начинает инициализацию. Переход в `FAULTY`. |
| **InitialFormatRead**                    | PDisk читает свою запись формата. Переход в `FAULTY`. |
| **InitialFormatReadError**               | PDisk получил ошибку при чтении своей записи формата. Переход в `FAULTY`. |
| **InitialSysLogRead**                    | PDisk читает системный лог. Переход в `FAULTY`. |
| **InitialSysLogReadError**               | PDisk получил ошибку при чтении системного лога. Переход в `FAULTY`. |
| **InitialSysLogParseError**              | PDisk получил ошибку при парсинге или проверке консистентности системного лога. Переход в `FAULTY`. |
| **InitialCommonLogRead**                 | PDisk читает общий лог VDisk'ов. Переход в `FAULTY`. |
| **InitialCommonLogReadError**            | PDisk получил ошибку при чтении общего лога VDisk'ов. Переход в `FAULTY`. |
| **InitialCommonLogParseError**           | PDisk получил ошибку при парсинге или проверке консистентности общего лога. Переход в `FAULTY`. |
| **CommonLoggerInitError**                | PDisk получил ошибку при инициализации внутренних структур предназначенных для записи в общий лог. Переход в `FAULTY`. |
| **Normal**                               | PDisk завершил инициализацию и работает нормально. Переход в `ACTIVE` произойдет через указанное количество циклов (например, если `Normal` держится 5 минут, диск переходит в состояние `ACTIVE`). |
| **OpenFileError**                        | PDisk получил ошибку при открытии файла диска. Переход в `FAULTY`. |
| **Missing**                              | Нода отвечает, но в её списке нет данного PDisk. Переход в `FAULTY`. |
| **Timeout**                              | Нода не ответила за отведенный таймаут. Переход в `FAULTY`. |
| **NodeDisconnected**                     | Отключение ноды. Переход в `FAULTY`. |
| **Stopped**                              | PDisk остановлен. Переход в `FAULTY`. |
| **Unknown**                              | Неожиданный ответ, например, ответ `TEvUndelivered` на запрос состояния. Переход в `FAULTY`. |

## Работа с дисками-донорами {#disks}

Диск-донор — это предыдущий VDisk после переноса данных, который продолжает хранить свои данные и отвечает только на запросы чтения от нового VDisk'а. При переносе с включенными дисками-донорами предыдущие VDisk'и продолжают функционировать до тех пор, пока данные не будут полностью перенесены на новые диски. Чтобы предотвратить потерю данных при переносе VDisk'а, включите возможность использования дисков-доноров:

```bash
ydb-dstool -e <bs_endpoint> cluster set --enable-donor-mode
```

Чтобы выключить диски-доноры, введите команду:

```bash
ydb-dstool -e <bs_endpoint> cluster set --disable-donor-mode
```
