Репликация данных

Репликация поддерживается только для таблиц семейства MergeTree:
  • ReplicatedMergeTree;
  • ReplicatedSummingMergeTree;
  • ReplicatedReplacingMergeTree;
  • ReplicatedAggregatingMergeTree;
  • ReplicatedCollapsingMergeTree;
  • ReplicatedVersionedCollapsingMergeTree;
  • ReplicatedGraphiteMergeTree.
Репликация работает на уровне отдельных таблиц, а не всего сервера. То есть, на сервере могут быть расположены одновременно реплицируемые и нереплицируемые таблицы.
Репликация не зависит от шардирования. На каждом шарде репликация работает независимо.
Реплицируются сжатые данные запросов INSERT, ALTER.
Запросы CREATE, DROP, ATTACH, DETACH и RENAME выполняются на одном сервере и не реплицируются.
Запрос CREATE TABLE создаёт новую реплицируемую таблицу на том сервере, где его выполнили. Если таблица уже существует на других серверах, запрос добавляет новую реплику.
DROP TABLE удаляет реплику, расположенную на том сервере, где выполняется запрос.
Запрос RENAME переименовывает таблицу на одной реплике. Другими словами, реплицируемые таблицы на разных репликах могут называться по-разному.
ADQM хранит метаинформацию о репликах в Apache ZooKeeper. Используйте ZooKeeper 3.4.5 или новее.
Для использования репликации установите параметры в секции zookeeper конфигурации сервера.
Не пренебрегайте настройками безопасности. ADQM поддерживает ACL-схему digest подсистемы безопасности ZooKeeper.
Пример указания адресов кластера ZooKeeper
<zookeeper>
    <node index="1">
        <host>example1</host>
        <port>2181</port>
    </node>
    <node index="2">
        <host>example2</host>
        <port>2181</port>
    </node>
    <node index="3">
        <host>example3</host>
        <port>2181</port>
    </node>
</zookeeper>
Можно указать любой имеющийся у вас ZooKeeper-кластер - система будет использовать в нём одну директорию для своих данных (директория указывается при создании реплицируемой таблицы).
Если в конфигурационном файле не настроен ZooKeeper, то вы не сможете создать реплицируемые таблицы, а уже имеющиеся реплицируемые таблицы будут доступны в режиме только на чтение.
При запросах SELECT ZooKeeper не используется, то еесть репликация не влияет на производительность SELECT, и запросы работают так же быстро, как и для нереплицируемых таблиц. При запросах к распределенным реплицированным таблицам поведение ADQM регулируется настройками max_replica_delay_for_distributed_queries and fallback_to_stale_replicas_for_distributed_queries.
При каждом запросе INSERT, делается несколько (около десяти) записей в ZooKeeper в рамках нескольких транзакций. (Это делается для каждого вставленного блока данных; запрос INSERT содержит один блок или один блок на max_insert_block_size = 1048576 строк.) Это приводит к некоторому увеличению задержек при INSERT, по сравнению с нереплицируемыми таблицами. Но если придерживаться рекомендации вставлять данные не более одного INSERT в секунду, то это не составляет проблем. На всём кластере ADQM, использующем для координации один кластер ZooKeeper, может быть в совокупности несколько сотен INSERT в секунду. Пропускная способность при вставке данных (количество строчек в секунду) такая же высокая, как для нереплицируемых таблиц.
Для очень больших кластеров можно использовать разные кластеры ZooKeeper для разных шардов.
Репликация асинхронная, мульти-мастер. Запросы INSERT и ALTER можно направлять на любой доступный сервер. Данные вставятся на сервер, где выполнен запрос, а затем скопируются на остальные серверы. В связи с асинхронностью, только что вставленные данные появляются на остальных репликах с небольшой задержкой. Если часть реплик недоступна, данные на них запишутся тогда, когда они станут доступны. Если реплика доступна, то задержка составляет столько времени, сколько требуется для передачи блока сжатых данных по сети. Количество потоков для выполнения фоновых задач можно задать с помощью настройки background_schedule_pool_size.
Движок ReplicatedMergeTree использует отдельный пул потоков для скачивания частей данных. Размер пула ограничен настройкой background_fetches_pool_size, которую можно указать при перезапуске сервера.
По умолчанию запрос INSERT ждёт подтверждения записи только от одной реплики. Если данные были успешно записаны только на одну реплику, и сервер с этой репликой перестал существовать, то записанные данные будут потеряны. Вы можете включить подтверждение записи от нескольких реплик, используя настройку insert_quorum.
Каждый блок данных записывается атомарно. Запрос INSERT разбивается на блоки данных размером до max_insert_block_size = 1048576 строк. То есть, если в запросе INSERT менее 1048576 строк, то он делается атомарно.
Блоки данных дедуплицируются. При многократной записи одного и того же блока данных (блоков данных одинакового размера, содержащих одни и те же строчки в одном и том же порядке), блок будет записан только один раз. Это сделано для того, чтобы в случае сбоя в сети, когда клиентское приложение не может понять, были ли данные записаны в БД, можно было просто повторить запрос INSERT. При этом не имеет значения, на какую реплику будут отправлены INSERT-ы с одинаковыми данными. Запрос INSERT идемпотентный. Параметры дедуплицирования регулируются настройками сервера merge_tree.
При репликации по сети передаются только исходные вставляемые данные. Дальнейшие преобразования данных (слияния) координируются и делаются на всех репликах одинаковым образом. За счет этого минимизируется использование сети, благодаря чему репликация хорошо работает при расположении реплик в разных дата-центрах. Дублирование данных в разных дата-центрах является основной задачей репликации.
Количество реплик одних и тех же данных может быть произвольным.
Система следит за синхронностью данных на репликах и умеет восстанавливаться после сбоя. Восстановление после сбоя автоматическое (в случае небольших различий в данных) или полуавтоматическое (когда данные отличаются слишком сильно, что может свидетельствовать об ошибке конфигурации).
Предыдущий раздел
ReplacingMergeTree
Следующий раздел
Создание реплицируемых таблиц
Была ли страница полезной?