К основному контенту

Восстановление репликации в ClickHouse после расхождения метаданных с ZooKeeper

Как восстановить репликацию в 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.

Комментарии

Популярные сообщения из этого блога

Настройка и подключение IPSec в Windows

Настройка IPSec на Windows включает в себя создание правил безопасности и фильтров для защиты сетевого трафика. Ниже — пошаговое руководство. Включение службы IPSec Перед настройкой убедитесь, что служба IPSec Policy Agent запущена: Нажмите Win + R , введите services.msc и нажмите Enter . Найдите IPsec Policy Agent . Если она не работает, нажмите ПКМ → Свойства . Установите Тип запуска: Автоматически , затем нажмите Запустить . Настройка политики IPSec через «Локальную политику безопасности» Нажмите Win + R , введите secpol.msc , нажмите Enter . Перейдите в Политики IP-безопасности в локальном компьютере . В правом окне нажмите Создать политику IP-безопасности → Далее . Укажите имя политики (например, "IPSec VPN"), снимите флажок Активировать правило по умолчанию , нажмите Далее . Нажмите Добавить , чтобы создать правило. Транспортный или туннельный режим : Если IPSec для защищенной локальной сети – выберите Транспортный режим . Если IPSec для VPN – выберите Туннельн...

Debian 11: настройка сети и имени хоста /etc/network/interfaces, NetworkManager и systemd-networkd

Как настроить сеть в Debian 11? 🔹 1. Настройка через /etc/network/interfaces (Традиционный способ) Этот метод удобен для серверов и минималистичных систем без NetworkManager . Открываем конфигурационный файл: sudo nano /etc/network/interfaces 🔹 DHCP (Автоматическое получение IP) auto eth0 iface eth0 inet dhcp 🔹 Статический IP auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4 🔹 Wi-Fi (WPA2) auto wlan0 iface wlan0 inet dhcp wpa-ssid "Название_сети" wpa-psk "Пароль" 📌 Применение изменений: sudo systemctl restart networking 🔹 2. Настройка через NetworkManager (Удобно для десктопов) Проверяем статус: systemctl status NetworkManager Если не установлен, ставим: sudo apt install network-manager sudo systemctl enable --now NetworkManager 🔹 Графический интерфейс (TUI) nmtui Выберите Edit a connection , настройте параметры и сохраните. 🔹 Консольный способ ( nmcli ...

Как найти и изменить репозитарии для CentOS 8

В CentOS 8 официальные репозитории (BaseOS, AppStream и Extras) управляются с помощью dnf и файлов конфигурации в /etc/yum.repos.d/ . Вот как их найти и изменить: 1. Просмотр текущих репозиториев dnf repolist Если нужно увидеть подробную информацию: dnf repolist all 2. Изменение репозиториев Файлы конфигурации репозиториев находятся в /etc/yum.repos.d/ . Например, основной репозиторий может быть в файле CentOS-AppStream.repo . Открыть его можно так: nano /etc/yum.repos.d/CentOS-AppStream.repo Внутри можно изменить: enabled=1 → включает репозиторий enabled=0 → отключает репозиторий baseurl= или mirrorlist= → задать новый источник пакетов 3. Замена недоступных репозиториев CentOS 8 достиг конца поддержки , и официальные зеркала больше не работают. Вместо них можно подключить Vault или AlmaLinux/Rocky Linux : Использование архивного репозитория CentOS Vault Создайте резервную копию старых .repo файлов: mkdir /root/repo-backup && mv /etc/yum.repos.d/*.repo /root/repo-backu...