Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Как восстановиться после поврежденного снимка Keeper

Поврежденные или некорректные снимки ClickHouse Keeper могут приводить к серьезной нестабильности системы, например к несогласованности метаданных, переходу таблиц в состояние только для чтения, исчерпанию ресурсов или сбоям резервного копирования. В этой статье рассматриваются:

Обзор снимков Keeper

Что такое снимок?

Снимок — это сериализованное состояние внутренних данных Keeper (таких как метаданные о кластерах, путях координации таблиц и конфигурациях) на определённый момент времени. Снимки крайне важны для повторной синхронизации узлов Keeper в кластере, восстановления метаданных при сбоях, а также для процессов запуска и перезапуска, которым требуется заведомо корректное состояние Keeper.

Где найти снимки?

Снимки хранятся в виде файлов в локальной файловой системе узлов Keeper. По умолчанию они находятся в /var/lib/clickhouse/coordination/snapshots/ либо по пользовательскому пути, заданному параметром snapshot_storage_path в файле keeper_server.xml. Снимки именуются последовательно (например, snapshot.23): чем новее снимок, тем больше его номер.

В многоузловых кластерах у каждого узла Keeper есть свой каталог снимков.

Основные симптомы и проявления поврежденных снимков Keeper

В таблице ниже перечислены некоторые распространенные симптомы и проявления поврежденных снимков Keeper:

Категория Тип проблемы На что обратить внимание
Эксплуатационные проблемы Режим только для чтения Таблицы неожиданно переходят в режим только для чтения
Сбои запросов Постоянные сбои запросов с ошибками Coordination::Exception
Повреждение метаданных Устаревшие метаданные Удаленные таблицы не отображаются; сбои операций из-за устаревших метаданных
Перегрузка ресурсов Исчерпание системных ресурсов Узлы Keeper потребляют чрезмерно много CPU, памяти или дискового пространства; возможен простой
Диск переполнен Переполнение диска во время создания снимка
Резервное копирование и восстановление Сбои резервного копирования Сбой резервного копирования из-за отсутствующих или несогласованных метаданных Keeper
Создание/передача снимков Сбой Keeper Сбой Keeper во время создания снимка (ищите ошибки "SEGFAULT")
Повреждение при передаче снимка Повреждение во время передачи снимка между репликами
Состояние гонки Состояние гонки во время компактации журнала — фоновый поток коммита обращается к удаленным журналам
Сетевая синхронизация Сетевые проблемы, мешающие синхронизации снимка от лидера к ведомым узлам

Признаки в журналах:

Прежде чем диагностировать повреждение снимка, проверьте журналы Keeper на наличие характерных шаблонов ошибок:

Тип журнала На что обратить внимание
Ошибки повреждения снимка Aborting because of failure to load from latest snapshot with index
Failure to load from latest snapshot with index {}: {}. Manual intervention is necessary for recovery
Failed to preprocess stored log at index {}, aborting to avoid inconsistent state
• Сбои сериализации/загрузки снимка при запуске
Другие проблемы Keeper Coordination::Exception
Zookeeper::Session Timeout
• Проблемы с синхронизацией или выбором лидера
• Состояния гонки при компактации журнала

Восстановление после повреждения снимков Keeper

Прежде чем работать с какими-либо файлами, обязательно:

  1. Остановите все узлы Keeper, чтобы предотвратить дальнейшее повреждение данных
  2. Сделайте резервную копию всего содержимого, скопировав весь каталог coordination в безопасное место
  3. Проверьте кворум кластера, чтобы убедиться, что хотя бы на одном узле сохранились корректные данные

1. Восстановление из существующей резервной копии

Используйте этот способ, если:

  • Повреждение метаданных Keeper или снимков делает текущие данные невосстановимыми.
  • Существует резервная копия с заведомо корректным состоянием Keeper.

Чтобы восстановить данные из существующей резервной копии, выполните следующие шаги:

  1. Найдите и проверьте самую новую резервную копию на согласованность метаданных.
  2. Остановите сервисы ClickHouse и Keeper.
  3. Замените повреждённые снимки и журналы версиями из каталога резервной копии.
  4. Перезапустите кластер Keeper и проверьте синхронизацию метаданных.

2. Откат к более старому снимку

Используйте этот процесс в следующих случаях:

  • Недавние снимки повреждены, но более старые всё ещё пригодны к использованию.
  • Инкрементальные журналы не повреждены, что позволяет выполнить согласованное восстановление.

Чтобы откатиться к более старому снимку, выполните следующие шаги:

  1. Найдите и выберите корректный старый снимок (например, snapshot.19) в каталоге Keeper.
  2. Удалите более новые снимки и журналы.
  3. Перезапустите Keeper, чтобы он заново воспроизвёл журналы и восстановил состояние метаданных.

3. Восстановление метаданных с помощью SYSTEM RESTORE REPLICA

Следуйте этому процессу, если:

  • метаданные Keeper утрачены или повреждены, но данные таблицы по-прежнему есть на диске
  • таблицы перешли в режим только для чтения из-за отсутствия метаданных ZooKeeper/Keeper
  • вам нужно заново создать метаданные в Keeper на основе локально доступных частей данных

Чтобы восстановить метаданные, выполните следующие действия:

  1. Убедитесь, что данные таблицы локально присутствуют в пути к данным вашего clickhouse-server, заданном параметром <path> в конфигурации. (по умолчанию /var/lib/clickhouse/data/)

  2. Для каждой затронутой таблицы выполните:

SYSTEM RESTART REPLICA [db.]table_name;
SYSTEM RESTORE REPLICA [db.]table_name;
  1. Для восстановления на уровне базы данных (если используется движок базы данных Replicated):
SYSTEM RESTORE DATABASE REPLICA db_name;
  1. Дождитесь завершения синхронизации:
SYSTEM SYNC REPLICA [db.]table_name;
  1. Проверьте восстановление: убедитесь, что в system.replicas значение is_readonly = 0, и следите за system.detached_parts

4. Удаление и повторное создание метаданных реплики в Keeper

Используйте этот порядок действий, если:

  • Ошибка возникает только на одной реплике кластера, и её метаданные в Keeper повреждены или несогласованы
  • Вы сталкиваетесь с ошибками вида "Part XXXXX intersects previous part YYYYY"
  • Вам нужно полностью сбросить метаданные реплики в Keeper, сохранив локальные данные

Чтобы удалить и заново создать метаданные, выполните следующие действия:

  1. На затронутой реплике отсоедините таблицу:
DETACH TABLE [db.]table_name;
  1. Удалите метаданные реплики из Keeper (выполните на любой реплике):
SYSTEM DROP REPLICA 'replica_name' FROM ZKPATH '/clickhouse/tables/{shard}/table_name';

Чтобы найти правильный путь ZooKeeper:

SELECT zookeeper_path, replica_name FROM system.replicas WHERE table = 'table_name';
  1. Повторно выполните ATTACH таблицы (она будет в режиме только для чтения):
ATTACH TABLE [db.]table_name;
  1. Восстановите метаданные реплики:
SYSTEM RESTORE REPLICA [db.]table_name;
  1. Синхронизируйтесь с другими репликами:
SYSTEM SYNC REPLICA [db.]table_name;
  1. Проверьте system.detached_parts на всех репликах после восстановления

Альтернатива: использование флага force_restore_data

Для автоматического восстановления всех реплицируемых таблиц при запуске сервера:

  1. Остановите сервер ClickHouse
  2. Создайте флаг восстановления:
sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
  1. Запустите сервер ClickHouse
  2. Сервер автоматически удалит флаг и восстановит все реплицированные таблицы
  3. Следите за ходом восстановления в журналах

Этот подход полезен, когда нужно одновременно восстановить несколько таблиц.


5. Пересборка кластера Keeper

Используйте этот процесс в следующих случаях:

  • Для восстановления недоступны пригодные снимки, журналы или резервные копии.
  • Необходимо заново создать весь кластер Keeper и его метаданные.

Чтобы пересобрать кластер Keeper, выполните следующие шаги:

  1. Полностью остановите кластеры ClickHouse и Keeper.
  2. Сбросьте каждый узел Keeper, очистив каталоги снимков и журналов.
  3. Инициализируйте один узел Keeper в качестве лидера и постепенно добавляйте остальные узлы.
  4. Повторно импортируйте метаданные, если они доступны из внешних записей.
Navigation