Postgres и ClickHouse: сходные и различающиеся концепции
INSERT, UPDATE и DELETE. Хотя схожих результатов можно добиться и с помощью физической репликации, логическая репликация дает больше гибкости при выборе конкретных таблиц и операций, а также при преобразовании данных и поддержке разных версий Postgres.
В ClickHouse же сегменты и реплики — это два ключевых понятия, связанных с распределением данных и избыточностью. Реплики ClickHouse можно считать аналогом реплик Postgres, хотя репликация здесь не является строго синхронной и не предполагает основного узла. Сегментирование, в отличие от Postgres, поддерживается нативно.
Сегмент — это часть данных вашей таблицы. У вас всегда есть как минимум один сегмент. Сегментирование данных по нескольким серверам можно использовать для распределения нагрузки, если объем данных или вычислений превышает возможности одного сервера: в этом случае все сегменты используются для параллельного выполнения запроса. Вы можете вручную создавать сегменты для таблицы на разных серверах и вставлять данные непосредственно в них. В качестве альтернативы можно использовать distributed таблицу с ключом сегментирования, который определяет, в какой сегмент направляются данные. Ключ сегментирования может быть случайным или представлять собой результат работы хеш-функции. Важно, что сегмент может состоять из нескольких реплик.
Реплика — это копия ваших данных. В ClickHouse всегда есть как минимум одна копия ваших данных, поэтому минимальное число реплик равно одному. Добавление второй реплики ваших данных обеспечивает отказоустойчивость и потенциально дополнительные вычислительные ресурсы для обработки большего числа запросов (Parallel Replicas также можно использовать, чтобы распределить вычисления одного запроса и тем самым снизить задержку). Реплики реализуются с помощью движка таблицы ReplicatedMergeTree, который позволяет ClickHouse поддерживать синхронизацию нескольких копий данных на разных серверах. Репликация является физической: между узлами передаются только сжатые части, а не запросы.
Итак, реплика — это копия данных, которая обеспечивает избыточность и надежность (а также потенциально распределенную обработку), тогда как сегмент — это подмножество данных, которое позволяет реализовать распределенную обработку и балансировку нагрузки.
ClickHouse Cloud использует одну копию данных, хранящуюся в S3, и несколько вычислительных реплик. Данные доступны каждому узлу-реплике, и у каждого из них есть локальный кэш на SSD. Здесь используется только репликация метаданных через ClickHouse Keeper.
Согласованность в конечном счёте
Что это значит для пользователей
Рекомендации
Согласованная маршрутизация
ClickHouse Cloud
Обратитесь в службу поддержки, чтобы получить доступ к sticky endpoints.
ClickHouse OSS
session_id или user_id. Настройки prefer_localhost_replica=0, load_balancing=in_order должны быть заданы в запросе. Это гарантирует, что предпочтение будет отдаваться локальным репликам сегментов, а в остальных случаях реплики будут выбираться в порядке, указанном в конфигурации, — при условии, что у них одинаковое число ошибок; если ошибок больше, произойдет переключение с случайным выбором. В качестве альтернативы для такого детерминированного выбора сегмента также можно использовать load_balancing=nearest_hostname.
При создании distributed таблицы вы укажете кластер. Это определение кластера, заданное в config.xml, будет содержать список сегментов (и их реплик), что позволит пользователям управлять порядком их использования с каждого узла. Так можно обеспечить детерминированный выбор.
Последовательная согласованность
- Читать/писать в один и тот же узел - Если вы используете собственный протокол или сеанс для записи/чтения по HTTP, то должны быть подключены к одной и той же реплике: в этом случае вы читаете напрямую с того же узла, в который выполняете запись, поэтому чтение всегда будет согласованным.
- Синхронизировать реплики вручную - Если вы пишете в одну реплику, а читаете из другой, перед чтением можно выполнить
SYSTEM SYNC REPLICA LIGHTWEIGHT. - Включить последовательную согласованность - с помощью настройки запроса
select_sequential_consistency = 1. В OSS также необходимо указать настройкуinsert_quorum = 'auto'.
Подробнее о включении этих настроек см. здесь.
Использование последовательной согласованности создаёт дополнительную нагрузку на ClickHouse Keeper. В результате это может привести к замедлению вставок и чтения. SharedMergeTree, используемый в ClickHouse Cloud как основной движок таблицы, при последовательной согласованности создаёт меньше накладных расходов и лучше масштабируется. В OSS этот подход следует использовать с осторожностью и отслеживать нагрузку на Keeper.
Поддержка транзакций (ACID)
Сжатие
Query (Postgres)
Query (ClickHouse)
Response