Learning Platform
Глоссарий Troubleshooting
Урок 11.03 · 25 мин
Продвинутый
S3replicationzero-copyexperimental

Zero-copy Replication на S3

При стандартной репликации на S3 каждая реплика хранит собственную копию данных в S3-бакете. Если две реплики содержат идентичные данные, S3-хранилище используется вдвойне. Zero-copy replication пытается решить эту проблему, заставляя реплики ссылаться на одни и те же S3-объекты.


Концепция: общие объекты вместо копирования

Стандартная репликация vs Zero-copy на S3
Replica-1Стандартная репликация: Replica-1 записывает part в S3 и сохраняет полную копию объектов. Part занимает место дважды: отдельная копия на каждой реплике. Надёжно: потеря одного S3-prefix не влияет на другую реплику.
пишет свою копию
s3://bucket/replica1/part_dataS3 bucket / replica1 prefix: полный набор объектов для Replica-1. При потере этого prefix данные остаются на Replica-2. Стандартный подход — надёжный, предсказуемый.
Replica-2Стандартная репликация: Replica-2 также пишет свою независимую копию. Данные идентичны Replica-1, но физически хранятся отдельно в S3. Общий объём S3 = 2x данных.
пишет свою копию
s3://bucket/replica2/part_dataS3 bucket / replica2 prefix: полный набор объектов для Replica-2. Независимая копия от Replica-1. Стоимость хранения удваивается при 2 репликах.
zero-copy: общие объекты
Replica-1 (metadata only)Zero-copy Replica-1: хранит только metadata-файл с указателем на shared S3-объект. Физические данные НЕ копируются в отдельный prefix. Reference counting в Keeper отслеживает, сколько реплик ссылаются на объект.
Replica-2 (metadata only)Zero-copy Replica-2: также хранит только metadata-файл, ссылающийся на тот же S3-объект. Данные хранятся один раз. ПРОБЛЕМА: при сбое и потере reference count возможна преждевременная 'сборка мусора' — удаление объекта, на который ещё ссылается другая реплика.
Shared S3 objects (одна копия)Shared S3 объект: один physical file, на который ссылаются обе реплики через metadata. Reference count хранится в Keeper. Экономия: 50% S3 при 2 репликах. Риск: неточный reference count → data corruption или premature deletion.

Настройка: allow_remote_fs_zero_copy_replication

Параметр задаётся в конфигурационном файле ClickHouse-сервера:

<!-- /etc/clickhouse-server/config.d/storage.xml -->
<!-- РЕКОМЕНДУЕМАЯ PRODUCTION НАСТРОЙКА: -->
<clickhouse>
  <allow_remote_fs_zero_copy_replication>false</allow_remote_fs_zero_copy_replication>
</clickhouse>
<!-- НЕ ИСПОЛЬЗУЙТЕ В PRODUCTION: -->
<clickhouse>
  <allow_remote_fs_zero_copy_replication>true</allow_remote_fs_zero_copy_replication>
</clickhouse>
WARNING

allow_remote_fs_zero_copy_replication выключен по умолчанию (false) и должен оставаться выключенным в production. Feature была экспериментальной с 2021 года. Официальная документация ClickHouse явно рекомендует не включать в production-среде. Включение этого параметра может привести к data corruption при сбоях узлов или S3 операциях.


Кавеаты и риски

Data corruption при сбоях

Reference counting реализован через Keeper (ZooKeeper-совместимый сервис). При одновременном сбое нескольких реплик или Keeper-узлов возможны следующие сценарии:

  • Неточный reference count: объект удаляется, когда на него ещё ссылается другая реплика
  • Потеря данных: объект “собран мусорщиком” раньше времени; реплика теряет доступ к своим данным
  • Несогласованность: Keeper видит объект удалённым, но S3 хранит его (или наоборот)

DR (Disaster Recovery) сценарии ненадёжны

При использовании zero-copy replication классические DR-сценарии (переключение на вторую реплику при отказе первой) ненадёжны: вторая реплика может не иметь полных данных, если reference objects были удалены или не были корректно переданы.

Операции на эфемерных узлах

Feature была разработана для read-heavy workloads с эфемерными узлами (Kubernetes pods), где дублирование данных особенно затратно. Однако именно такие окружения (kubernetes, spot instances) увеличивают вероятность сбоев, которые trigg’ерят описанные выше проблемы.


Когда zero-copy допустимо

СценарийРекомендация
Production кластерНе использовать (официальная рекомендация ClickHouse)
Dev / staging средаДопустимо, если потеря данных некритична
Read-heavy S3 с эфемерными узлами (non-production)Допустимо с пониманием рисков
DR-critical workloadsКатегорически нельзя
Kubernetes productionНельзя (эфемерные поды + риск data corruption)

Рекомендуемая альтернатива

Вместо zero-copy replication используйте стандартный подход:

  1. Каждая реплика хранит свою копию данных на S3 — надёжно, предсказуемо
  2. s3_cache на каждой реплике — ускоряет повторные чтения без data-sharing рисков
  3. JBOD + Standard replication — масштабирование ёмкости без zero-copy рисков
-- Безопасный паттерн: стандартная репликация + s3_cache для ускорения
CREATE TABLE events_replicated
(
    event_time DateTime,
    payload    String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events', '{replica}')
ORDER BY event_time
SETTINGS storage_policy = 'tiered_with_cache';  -- s3_cache без zero-copy

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

  1. Zero-copy replication позволяет репликам разделять S3-объекты вместо хранения копий, экономя ~50% S3 при 2 репликах.
  2. allow_remote_fs_zero_copy_replication=false — рекомендуемый production-дефолт; официальная документация явно рекомендует не включать в production.
  3. Риски: data corruption при сбоях из-за неточного reference counting в Keeper, ненадёжные DR-сценарии.
  4. Допустимо только в dev/staging-средах, где потеря данных некритична.
  5. Безопасная альтернатива: стандартная репликация (каждая реплика хранит свою копию) + s3_cache для ускорения повторных чтений.
Delta Lake: transaction log и ACID на object storage Iceberg, Delta Lake, Hudi: open table formats

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

Результат: 0 из 0
Прикладной
Вопрос 1 из 3. Администратор настраивает ClickHouse 26.3 кластер с S3 tiered storage. Какое значение параметра allow_remote_fs_zero_copy_replication рекомендуется для production-среды согласно официальной документации ClickHouse?

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

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

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

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