Восстановление работы кластера ClickHouse

Содержание

Восстановление после потери кворума

Если координаторы теряют кворум, то в журналах сервера ClickHouse можно наблюдать ошибки Code: 999. Coordination::Exception: Session expired. (KEEPER_EXCEPTION) следующего вида:

2024.07.10 15:01:53.419106 [ 223559 ] {} <Error> redqueen.billing (db561f37-c0c1-4cd6-8c95-4411ce927181): void DB::StorageReplicatedMergeTree::queueUpdatingTask(): Code: 999. Coordination::Exception: Session expired. (KEEPER_EXCEPTION), Stack trace (when copying this message, always include the lines below):

Если проверить состояние реплицируемых таблиц с помощью следующего запроса:

SELECT is_readonly, last_queue_update_exception
FROM system.replicas\G

То можно увидеть, что таблицы находятся в состоянии "только чтение" с ошибкой вида Code: 999. Coordination::Exception: Session expired. (KEEPER_EXCEPTION).

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

$ echo rcvr | nc localhost 9181

Далее нужно по очереди запускать остальных координаторов. Когда количество работающих узлов координатора достигнет кворума, один из узлов сервиса координации возьмёт на себя роль leader, а другие возьмут на себя роли follower. Чтобы проверить текущую роль узла координации, можно воспользоваться такой командой:

$ echo mntr | nc localhost 9181 | awk '$1 == "zk_server_state" { print $2; }'

Следующим шагом будет восстановление информации о таблицах в координаторах. Для этого на исправном сервере ClickHouse, содержащем все данные, нужно выполнить запрос:

SYSTEM RESTORE REPLICA ON CLUSTER core;

Восстановление работы реплики

Если сервис координации исправен, но реплика долгое время отсутствовала в сети, то журналы изменений в сервисе координации могли уйти далеко от состояния, которое помнит реплика. В таком случае реплика не сможет проследить изменения по журналам координатора и синхронизировать своё состояние с исправными актуальными репликами. Для восстановления работы реплики в таких случаях необходимо сравнить собственное состояние с состоянием в координаторе и определить, какие фрагменты данных нуждаются в синхронизации. Сделать это можно с помощью такой команды:

SYSTEM RESTART REPLICAS;

Использованные материалы