Включение/выключение SelfHeal {#selfheal}

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

Механизм SelfHeal состоит из двух частей. Детектирование неисправных дисков и перевоз их в щадящем режиме не допуская потери данных и развала групп хранения.

По умолчанию SelfHeal включен.
Ниже инструкция по включению в случае если он выключен, аналогично SelfHeal можно выключить.

  1. Включение детектирования

    Открыть страницу

    http://localhost:8765/cms#show=config-items-25

    Можно включить через viewer -> Cluster Management System -> CmsConfigItems

    Поле Status: Enable

    Или через cli

    • Зайти на любой узел

    • Составить файл с измененными конфигурациями

      Пример файла config.txt

      Actions {
          AddConfigItem {
              ConfigItem {
                  Config {
                      CmsConfig {
                          SentinelConfig {
                              Enable: true
                          }
                      }
                  }
              }
          }
      }
      
    • Обновить конфиг на кластере

      kikimr admin console configs update config.txt
      
  2. Включение перевоза

    kikimr -s <endpoint> admin bs config invoke --proto 'Command{EnableSelfHeal{Enable: true}}'
    

Выключение аналогично, с установкой значения false.

Настройки SelfHeal

viewer -> Cluster Management System -> CmsConfigItems
Если настроек еще нет, то нажать на кнопку Create, если есть, то на кнопку "карандашик" в углу.

  • Status - Включение-выключение Self Heal в CMS.
  • Dry run - Включение-выключение режима, в котором CMS не изменяет настройку BSC.
  • Config update interval (sec.) - Период обновления конфига из BSC.
  • Retry interval (sec.) - Период ретраев обновления конфига.
  • State update interval (sec.) - Период обновления Состояний PDisk-ов, Состояние - это то что мы наблюдаем (через whiteboard, например)
  • Timeout (sec.) - таймаут обновления Состояний PDisk-ов
  • Change status retries - количество ретраев на изменение Статуса PDisk в BSC, Статус - это то, что хранится в BSC (ACTIVE, FAULTY, BROKEN, etc).
  • Change status retry interval (sec.) - задержка между попытками на изменение Статуса PDisk в BSC
    CMS наблюдает Состояние диска с интервалом State update interval. Если диск пребывает в одном состояний несколько циклов Status update interval, то CMS меняет его Статус в BSC.
    Дальше идут настройки количества циклов обновления, через которое CMS будет изменять Статус диска. Если Состояние диска Normal, то диск переводится в Статус ACTIVE, в остальных состояниях диск переводится в статус FAULTY. Значение 0 выключает изменение Статуса для состояния (так сделано для Unknown по умолчанию).
    Например, при настройках по умолчанию, если CMS наблюдает состояние диска Initial на протяжении 5 циклов Status update interval по 60 с каждый, Статус диска будет изменен на FAULTY.
  • 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.
  • Unknown - Что-то неожиданное, например ответ TEvUndelivered на запрос состояния. Переход в FAULTY.

Включение/выключение дисков-доноров

При выключенных дисках донорах, при перевозе VDisk'а, его данные теряются, и их приходится восстанавливать согласно выбранному erasure.

Операция восстановления дороже, чем обычный перевоз данных. Также происходит потеря данных, что может повлечь за собой потерю данных при выходе за рамки модели отказа.

Для предотвращения выше перечисленных проблем, существуют диски доноры.

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

Диск донор, это старый VDisk'ов после перевоза, который продолжает хранить свои данные и отвечает только на запросы чтения от нового VDisk'а.

При получении запроса на чтения на данные, которые новый VDisk еще не успел перенести, он перенаправляет запрос к диску донору.

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

$ kikimr admin bs config invoke --proto 'Command { UpdateSettings { EnableDonorMode: true } }'

Аналогично при изменении настройки на false, команда выключить режим.