Learning Platform
Глоссарий Troubleshooting
Урок 10.06 · 30 мин
Продвинутый
quoruminsert_quorumselect_sequential_consistencyconsistency

Кворумные записи и консистентность

По умолчанию ClickHouse использует eventual consistency: INSERT считается успешным, как только данные записаны на одну реплику, остальные реплики догоняют асинхронно через лог репликации в Keeper. Для большинства аналитических сценариев это приемлемо. Но некоторые workload-ы требуют более строгих гарантий: финансовые журналы, audit trails, критические метрики.

Кворумные настройки позволяют добавить гарантии durability и read-your-writes поверх реплицированной архитектуры ClickHouse.


Кворумный INSERT

insert_quorum требует, чтобы данные были записаны на заданное количество реплик до подтверждения клиенту:

-- Требуем подтверждения от 2 реплик из 3
INSERT INTO events_local
SETTINGS
    insert_quorum = 2,
    insert_quorum_timeout = 60000  -- 60 секунд ожидания
VALUES
    (1001, 'payment', 99.99, now());

-- insert_quorum='auto': большинство реплик (majority quorum)
-- При 3 репликах -- это 2; при 5 репликах -- это 3
INSERT INTO events_local
SETTINGS
    insert_quorum = 'auto',
    insert_quorum_timeout = 60000
VALUES
    (1002, 'refund', 49.99, now());

Если в течение insert_quorum_timeout миллисекунд кворум не достигнут (реплика недоступна или отстаёт), INSERT завершается с ошибкой. Данные при этом могут быть уже записаны на часть реплик — нужно учитывать при повторных попытках.

TIP

insert_quorum='auto' — наиболее практичный подход для production: автоматически выбирает большинство реплик. Не нужно вручную вычислять значение при изменении топологии кластера.


Sequential consistency при чтении

select_sequential_consistency=1 гарантирует, что SELECT видит только данные, записанные с кворумным подтверждением. Это реализует read-your-writes семантику:

-- Запрос видит только quorum-confirmed данные
SELECT event_id, amount, event_time
FROM events_local
WHERE event_date = today()
SETTINGS select_sequential_consistency = 1;

-- Типичный паттерн: write with quorum, read with sequential consistency
INSERT INTO events_local
SETTINGS insert_quorum = 'auto'
VALUES (1003, 'withdrawal', 200.00, now());

-- Этот SELECT гарантированно увидит строку выше
SELECT * FROM events_local
WHERE event_id = 1003
SETTINGS select_sequential_consistency = 1;

select_sequential_consistency=1 делает дополнительный запрос к Keeper перед SELECT, чтобы проверить номер последней quorum-записи. Это добавляет latency и нагрузку на Keeper.


SYSTEM SYNC REPLICA

Более лёгкая альтернатива для точечной синхронизации — дождаться, пока конкретная реплика догонит очередь репликации:

-- Полная синхронизация: ждёт пока очередь репликации опустеет
SYSTEM SYNC REPLICA db.events_local;

-- LIGHTWEIGHT: только ждёт применения последней quorum-записи
-- Не ждёт всех pending merge/mutate операций -- значительно быстрее
SYSTEM SYNC REPLICA db.events_local LIGHTWEIGHT;

-- PULL: принудительно запускает получение записей из Keeper
SYSTEM SYNC REPLICA db.events_local PULL;

SYSTEM SYNC REPLICA LIGHTWEIGHT полезен после INSERT с insert_quorum, когда нужно убедиться, что конкретная реплика видит записанные данные перед чтением с неё.


Сравнение подходов к консистентности

Подходы к консистентности в реплицированном ClickHouse

Подход

Подход к консистентности -- как обеспечивается гарантия видимости данных после записи. Четыре основных варианта отличаются по уровню гарантий, производительности и сложности.

Консистентность

Уровень гарантии консистентности: eventual (eventually consistent, без гарантий временных рамок), quorum (N из M реплик подтвердили), sequential (read-your-writes через Keeper), point-in-time (конкретная реплика синхронизирована).

Производительность

Влияние на производительность записи и чтения. Каждый уровень гарантий требует дополнительного I/O или сетевых запросов.

Применение

Типичный сценарий применения.

Eventual (default)

Default поведение ClickHouse: INSERT подтверждён когда данные записаны на одну реплику. Другие реплики догоняют асинхронно. SELECT может видеть данные только на части реплик. Подходит для большинства аналитических задач.

Eventual

Нет гарантий временных рамок -- реплика может отставать от секунд до часов при задержках в сети или нагрузке. Для read-запросов нет гарантии видеть последнюю запись.

Максимальная

Максимальная производительность записи: нет ожидания реплик, нет запросов к Keeper на чтение. INSERT latency минимальна.

Аналитика, логи

Аналитика, метрики, логи -- где небольшое отставание реплик некритично. 95%+ случаев использования ClickHouse.

insert_quorum=N

insert_quorum=N: INSERT ждёт подтверждения от N реплик. Защищает от потери данных при отказе одного узла сразу после записи.

Quorum durability

N из M реплик подтвердили запись. Данные выживут при одновременном отказе M-N узлов. Не гарантирует read-your-writes без select_sequential_consistency.

Сниженная

INSERT latency растёт: нужно ждать самую медленную из N реплик. При insert_quorum=2 и 3 репликах -- ждёт вторую реплику подтверждения. Throughput снижается.

Финансы, audit

Финансовые транзакции, audit logs -- где важно, что данные пережили запись на несколько реплик.

select_sequential_consistency

select_sequential_consistency=1: SELECT делает запрос к Keeper для проверки последней quorum-записи перед выполнением. Гарантирует read-your-writes.

Sequential

Read-your-writes: SELECT гарантированно видит данные, записанные с quorum. Полная sequential consistency в распределённой системе.

Высокая нагрузка Keeper

Дополнительный запрос к Keeper на каждый SELECT. При высокой нагрузке SELECT-запросов создаёт значительную нагрузку на Keeper cluster. Используйте только на hot-path где гарантии critical.

Critical reads

Critical reads: показания счётчиков, балансы -- где устаревшее чтение недопустимо.

SYNC REPLICA LIGHTWEIGHT

SYSTEM SYNC REPLICA LIGHTWEIGHT: ждёт пока реплика применит последние quorum-записи. Одноразовая операция, не влияет на каждый последующий SELECT.

Point-in-time

Point-in-time consistency: конкретная реплика синхронизирована на момент вызова. Не гарантирует будущие чтения с той же реплики.

Умеренная (разовая)

Одноразовая блокировка: дождаться синхронизации. Потом читать можно без Keeper-запросов. Значительно дешевле select_sequential_consistency при нечастом использовании.

После DDL, обслуживание

Après maintenance, после DDL, при ручной проверке состояния реплики -- когда нужна одноразовая гарантия.

NOTE

SharedMergeTree (ClickHouse Cloud)

В ClickHouse Cloud используется SharedMergeTree — cloud-native замена ReplicatedMergeTree. В SharedMergeTree все INSERT автоматически являются кворумными: данные пишутся на общее объектное хранилище (S3/GCS), которое обеспечивает durability без настройки insert_quorum. Параметры insert_quorum и select_sequential_consistency в SharedMergeTree не нужны и не имеют смысла.


Ключевые выводы

  1. Eventual consistency (default) подходит для большинства аналитических workload-ов — никакой дополнительной конфигурации не требуется.
  2. insert_quorum добавляет durability гарантии: данные записаны на N реплик до подтверждения клиенту. insert_quorum='auto' проще в обслуживании.
  3. select_sequential_consistency=1 обеспечивает read-your-writes, но добавляет нагрузку на Keeper при каждом SELECT. Не включайте на горячих аналитических запросах.
  4. SYSTEM SYNC REPLICA LIGHTWEIGHT — лёгкая альтернатива для точечной синхронизации без постоянных Keeper-запросов.
  5. SharedMergeTree (Cloud) — кворумность встроена, дополнительные настройки не нужны.
Isolation levels: что обещает SQL и что реально даёт Postgres Идемпотентность: повтор не ломает данные

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 3. Финансовый audit log требует гарантии, что каждая транзакция записана минимум на 2 реплики из 3 до подтверждения клиенту. Какая настройка обеспечивает это требование?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 11