Как восстановить репликацию в ClickHouse при рассинхронизации метаданных
Описание проблемы
При расхождении метаданных между ClickHouse и ZooKeeper могут возникать следующие ошибки:
Ошибка TABLE_IS_READ_ONLY
Received exception from server (version 22.2.2):
Code: 242. DB::Exception: Received from localhost:9000. DB::Exception: Table is in readonly mode (zookeeper path: /clickhouse/tables/demo_db/demo_table). (TABLE_IS_READ_ONLY)
Таблица переходит в режим "только для чтения" из-за проблем с репликацией.
Ошибка CANNOT_ASSIGN_ALTER
Received exception from server (version 22.2.2):
Code: 517. DB::Exception: Received from localhost:9000. DB::Exception: Metadata on replica is not up to date with common metadata in Zookeeper. It means that this replica still not applied some of previous alters. Probably too many alters executing concurrently (highly not recommended). You can retry this error. (CANNOT_ASSIGN_ALTER)
Метаданные реплики устарели, так как некоторые изменения (ALTER) не были применены.
Восстановление работоспособности
Удаление сломанной реплики
Подключаемся к ClickHouse-клиенту:
clickhouse-client --host localhost
Удаляем проблемную реплику:
ALTER TABLE demo_db.demo_table DROP REPLICA 'replica_name';
Остановка репликации
Приостанавливаем отправку данных и выполнение очереди репликации:
SYSTEM STOP REPLICATED SENDS demo_db.demo_table;
SYSTEM STOP REPLICATION QUEUES demo_db.demo_table;
Очистка данных в ZooKeeper
Подключаемся к ZooKeeper:
/usr/share/zookeeper/bin/zkCli.sh
Удаляем данные о таблице:
rmr /clickhouse/tables/demo_db/demo_table
Перезапуск ClickHouse
Перезапускаем сервер для применения изменений:
systemctl restart clickhouse-server
Повторное подключение таблицы
После перезапуска отключаем и повторно подключаем таблицу:
clickhouse-client --host localhost
DETACH TABLE demo_db.demo_table;
ATTACH TABLE demo_db.demo_table;
Восстанавливаем реплику:
SYSTEM RESTORE REPLICA demo_db.demo_table;
Проверка состояния репликации
Проверяем статус репликации:
SELECT * FROM system.replicas WHERE table = 'demo_table' AND database = 'demo_db'\G
Если is_readonly = 0
и queue_size = 0
, значит, репликация восстановлена.
Полезные команды
Просмотр структуры таблицы:
SHOW CREATE TABLE demo_db.demo_table;
Список таблиц в базе:
SHOW TABLES FROM demo_db;
Подключение всех разделов в таблице:
ALTER TABLE demo_db.demo_table ATTACH PARTITION ALL;
Перезапуск реплики, если в ZooKeeper были потеряны метаданные:
clickhouse-client --host localhost --query "SYSTEM RESTORE REPLICA demo_db.demo_table;"
Проверка состояния реплики на ноде:
clickhouse-client --host localhost --query "SELECT * FROM system.replicas WHERE table = 'demo_table'" --format=Vertical
Этот алгоритм позволит восстановить репликацию и устранить проблемы с расхождением метаданных между ClickHouse и ZooKeeper.
Комментарии
Отправить комментарий