Часть 3. ClickHouse Keeper: кворум, ресурсы и грабли

Keeper — фундамент репликации: если он лёг, кластер уходит в read-only. Сколько нужно узлов, почему их число нечётное, какие ресурсы и диск давать и почему Keeper нельзя селить вместе с ClickHouse.
Опубликовано:

Keeper — самый недооценённый компонент инсталляции. Он не хранит ваши данные, потребляет мало ресурсов, и про него забывают — ровно до того момента, когда он теряет кворум и весь кластер переходит в read-only.

Зачем он нужен

ReplicatedMergeTree не хранит состояние репликации в самих узлах ClickHouse. Всё это живёт в Keeper:

Keeper — это встроенная в ClickHouse реализация того же протокола, что и ZooKeeper, но на Raft, заметно экономнее по ресурсам и рекомендуемая по умолчанию для новых установок. Если у вас legacy на ZooKeeper — он поддерживается, но новые кластеры делают на Keeper.

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

Сколько узлов

Всегда нечётное число, минимум 3. Кворум — это большинство:

УзловКворумПереживёт отказов
110 (нет отказоустойчивости)
321
532

Отсюда два практических правила:

Разносите узлы по зонам доступности. Классическая схема на три зоны: по одному Keeper в каждой — отказ зоны оставляет кворум 2 из 3.

Отдельно от ClickHouse

Самая частая архитектурная ошибка — держать Keeper тем же процессом или на тех же нодах, что и ClickHouse. Так делать не стоит:

Поэтому: отдельные поды, отдельные диски, podAntiAffinity обязателен — два узла Keeper на одной ноде обесценивают кворум.

YAML
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: clickhouse-keeper
        topologyKey: kubernetes.io/hostname
Нажмите, чтобы развернуть и увидеть больше

Обратите внимание на required, а не preferred: для кворума мягкое пожелание — это не гарантия.

Ресурсы и диск

Keeper небольшой, но требовательный к латентности записи, а не к объёму:

Отдельно: не экономьте на PDB. PodDisruptionBudget с maxUnavailable: 1 не даст drain’у ноды выбить два узла Keeper разом.

За чем следить

Минимальный набор сигналов, который стоит завести до первого инцидента:

Быстрая проверка состояния изнутри пода:

BASH
# четырёхбуквенные команды, как у ZooKeeper
echo mntr | nc localhost 9181
echo stat | nc localhost 9181
Нажмите, чтобы развернуть и увидеть больше

А со стороны базы — тревожный признак, который стоит вынести в алерт:

SQL
SELECT database, table, is_readonly, absolute_delay, queue_size
FROM system.replicas
WHERE is_readonly OR queue_size > 100;
Нажмите, чтобы развернуть и увидеть больше

Грабли, на которые наступают


Дальше: Часть 4. Storage: диски, PVC и tiered storage с S3.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша