ClickHouse Keeper (clickhouse-keeper)
Эта страница не относится к ClickHouse Cloud. Описанная здесь процедура выполняется автоматически в сервисах ClickHouse Cloud.
ClickHouse Keeper предоставляет систему координации для репликации данных и выполнения запросов распределённого DDL. ClickHouse Keeper совместим с ZooKeeper.
Детали реализации
ZooKeeper — одна из первых хорошо известных систем координации с открытым исходным кодом. Она реализована на Java и имеет довольно простую и мощную модель данных. Алгоритм координации ZooKeeper, ZooKeeper Atomic Broadcast (ZAB), не предоставляет гарантий линеаризуемости чтения, так как каждый узел ZooKeeper обрабатывает операции чтения локально. В отличие от ZooKeeper, ClickHouse Keeper написан на C++ и использует алгоритм RAFT в реализации. Этот алгоритм обеспечивает линеаризуемость для операций чтения и записи и имеет несколько реализаций с открытым исходным кодом на разных языках.
По умолчанию ClickHouse Keeper предоставляет те же гарантии, что и ZooKeeper: линеаризуемые записи и нелинеаризуемые чтения. Он использует совместимый клиент-серверный протокол, поэтому любой стандартный клиент ZooKeeper можно использовать для взаимодействия с ClickHouse Keeper. Снимки и журналы имеют формат, несовместимый с ZooKeeper, но инструмент clickhouse-keeper-converter позволяет преобразовать данные ZooKeeper в снимки ClickHouse Keeper. Межсерверный протокол в ClickHouse Keeper также несовместим с ZooKeeper, поэтому смешанный кластер ZooKeeper / ClickHouse Keeper невозможен.
ClickHouse Keeper поддерживает списки контроля доступа (ACL) так же, как и ZooKeeper. ClickHouse Keeper поддерживает тот же набор прав и имеет идентичные встроенные схемы: world, auth и digest. Схема аутентификации digest использует пару username:password, при этом пароль кодируется в Base64.
Внешние интеграции не поддерживаются.
Конфигурация
ClickHouse Keeper может использоваться как самостоятельная замена ZooKeeper или как внутренняя часть сервера ClickHouse. В обоих случаях конфигурация задаётся практически одинаковым .xml-файлом.
Параметры конфигурации Keeper
Основной конфигурационный тег ClickHouse Keeper — <keeper_server> и имеет следующие параметры:
| Parameter | Description | Default |
|---|---|---|
tcp_port | Порт для подключения клиента. | 2181 |
tcp_port_secure | Защищённый порт для SSL-подключения между клиентом и keeper-server. | - |
server_id | Уникальный идентификатор сервера, каждый участник кластера ClickHouse Keeper должен иметь уникальный номер (1, 2, 3 и так далее). | - |
log_storage_path | Путь к журналам координации; как и в ZooKeeper, журналы лучше хранить на незагруженных узлах. | - |
snapshot_storage_path | Путь к снимкам состояния координации. | - |
enable_reconfiguration | Включить динамическую переконфигурацию кластера с помощью reconfig. | False |
max_memory_usage_soft_limit | Мягкое ограничение в байтах на максимальное потребление памяти Keeper. | max_memory_usage_soft_limit_ratio * physical_memory_amount |
max_memory_usage_soft_limit_ratio | Если max_memory_usage_soft_limit не задан или установлен в ноль, используется это значение для определения значения мягкого ограничения по умолчанию. | 0.9 |
cgroups_memory_observer_wait_time | Если max_memory_usage_soft_limit не задан или установлен в 0, используется этот интервал для наблюдения за объёмом физической памяти. Как только объём памяти изменится, мягкое ограничение памяти Keeper будет пересчитано по max_memory_usage_soft_limit_ratio. | 15 |
http_control | Конфигурация интерфейса HTTP control. | - |
digest_enabled | Включить проверку согласованности данных в режиме реального времени. | True |
create_snapshot_on_exit | Создавать снимок состояния при завершении работы. | - |
hostname_checks_enabled | Включить базовые проверки имён хостов для конфигурации кластера (например, если localhost используется с удалёнными конечными точками). | True |
four_letter_word_white_list | Белый список команд 4lw. | conf, cons, crst, envi, ruok, srst, srvr, stat, wchs, dirs, mntr, isro, rcvr, apiv, csnp, lgif, rqld, ydld |
enable_ipv6 | Включить поддержку IPv6 | True |
Другие общие параметры наследуются из конфигурации сервера ClickHouse (listen_host, logger и так далее).
Internal coordination settings
Внутренние настройки координации находятся в секции <keeper_server>.<coordination_settings> и включают следующие параметры:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
operation_timeout_ms | Таймаут для одной клиентской операции (мс) | 10000 |
min_session_timeout_ms | Минимальный таймаут для клиентской сессии (мс) | 10000 |
session_timeout_ms | Максимальный таймаут для клиентской сессии (мс) | 100000 |
dead_session_check_period_ms | Как часто ClickHouse Keeper проверяет «мертвые» сессии и удаляет их (мс) | 500 |
heart_beat_interval_ms | Как часто лидер ClickHouse Keeper отправляет heartbeat-сообщения последователям (мс) | 500 |
election_timeout_lower_bound_ms | Если в течение этого интервала последователь не получает heartbeat от лидера, он может инициировать выборы лидера. Значение должно быть меньше или равно election_timeout_upper_bound_ms. В идеале они не должны быть равны. | 1000 |
election_timeout_upper_bound_ms | Если в течение этого интервала последователь не получает heartbeat от лидера, он обязан инициировать выборы лидера. | 2000 |
rotate_log_storage_interval | Сколько записей лога хранить в одном файле. | 100000 |
reserved_log_items | Сколько записей журнала координации хранить до выполнения компакции. | 100000 |
snapshot_distance | Как часто ClickHouse Keeper будет создавать новые снапшоты (в количестве записей в логах). | 100000 |
snapshots_to_keep | Сколько снапшотов хранить. | 3 |
stale_log_gap | Порог, при котором лидер считает последователя устаревшим и отправляет ему снапшот вместо логов. | 10000 |
fresh_log_gap | Условие, при котором узел считается «свежим». | 200 |
max_requests_batch_size | Максимальный размер батча по количеству запросов перед отправкой в RAFT. | 100 |
force_sync | Вызывать fsync при каждой записи в журнал координации. | true |
quorum_reads | Выполнять запросы на чтение как операции записи, проходящие через весь консенсус RAFT, с сопоставимой скоростью. | false |
raft_logs_level | Уровень текстового логирования о координации (trace, debug и т. д.). | system default |
auto_forwarding | Разрешить перенаправление запросов на запись от последователей к лидеру. | true |
shutdown_timeout | Ожидание завершения внутренних соединений и остановки (мс). | 5000 |
startup_timeout | Если сервер не подключается к другим участникам кворума в заданный таймаут, он завершает работу (мс). | 30000 |
async_replication | Включить асинхронную репликацию. Все гарантии записи и чтения сохраняются при повышенной производительности. Настройка отключена по умолчанию, чтобы не нарушать обратную совместимость. | false |
latest_logs_cache_size_threshold | Максимальный общий размер кэша в памяти для последних записей лога | 1GiB |
commit_logs_cache_size_threshold | Максимальный общий размер кэша в памяти для записей лога, необходимых для следующего подтверждения | 500MiB |
disk_move_retries_wait_ms | Время ожидания между повторами после сбоя, произошедшего при перемещении файла между дисками | 1000 |
disk_move_retries_during_init | Количество повторных попыток после сбоя, произошедшего при перемещении файла между дисками во время инициализации | 100 |
experimental_use_rocksdb | Использовать RocksDB как бэкенд-хранилище | 0 |
Конфигурация кворума находится в секции <keeper_server>.<raft_configuration> и содержит описание серверов.
Единственный параметр для всего кворума — secure, который включает зашифрованное соединение для взаимодействия между участниками кворума. Параметр может быть установлен в true, если для внутреннего обмена между узлами требуется SSL-соединение, или оставлен не заданным в противном случае.
Основные параметры для каждого <server>:
id— Идентификатор сервера в кворуме.hostname— Имя хоста, на котором размещён этот сервер.port— Порт, на котором этот сервер принимает подключения.can_become_leader— Установите вfalse, чтобы настроить сервер какlearner. Если параметр не указан, по умолчанию используется значениеtrue.
В случае изменения топологии вашего кластера ClickHouse Keeper (например, при замене сервера) обязательно сохраняйте соответствие между server_id и hostname и избегайте перестановок или повторного использования уже существующего server_id для других серверов (например, это может произойти, если вы полагаетесь на скрипты автоматизации для развертывания ClickHouse Keeper).
Если хост экземпляра Keeper может меняться, мы рекомендуем использовать hostname вместо «сырых» IP-адресов. Изменение hostname эквивалентно удалению сервера и повторному добавлению его в кластер, что в некоторых случаях может быть невозможно (например, недостаточно экземпляров Keeper для кворума).
async_replication по умолчанию отключена, чтобы не нарушать обратную совместимость. Если все ваши экземпляры Keeper в кластере работают на версии, которая поддерживает async_replication (v23.9+), мы рекомендуем включить её, так как это может улучшить производительность без каких-либо недостатков.
Примеры конфигураций кворума с тремя узлами можно найти в интеграционных тестах с префиксом test_keeper_. Пример конфигурации для сервера № 1:
Как запустить
ClickHouse Keeper входит в пакет сервера ClickHouse: просто добавьте конфигурацию <keeper_server> в /etc/your_path_to_config/clickhouse-server/config.xml и запустите сервер ClickHouse как обычно. Если вы хотите запустить ClickHouse Keeper как отдельный компонент, вы можете запустить его аналогичным образом:
Если у вас нет символической ссылки (clickhouse-keeper), вы можете создать её или указать keeper в качестве аргумента для clickhouse:
Команды из четырёх букв
ClickHouse Keeper также предоставляет команды 4lw, которые почти идентичны командам в ZooKeeper. Каждая команда состоит из четырёх букв, таких как mntr, stat и т. д. Есть несколько более интересных команд: stat предоставляет общую информацию о сервере и подключённых клиентах, тогда как srvr и cons выдают расширенные сведения о сервере и соединениях соответственно.
Для 4lw-команд существует конфигурационный параметр белого списка four_letter_word_white_list, который по умолчанию имеет значение conf,cons,crst,envi,ruok,srst,srvr,stat,wchs,dirs,mntr,isro,rcvr,apiv,csnp,lgif,rqld,ydld.
Вы можете отправлять команды ClickHouse Keeper через telnet или nc, подключаясь к клиентскому порту.
Ниже подробно описаны команды 4lw:
ruok: Проверяет, работает ли сервер без ошибок. Сервер ответитimok, если он запущен. В противном случае он не ответит вовсе. Ответimokне обязательно означает, что сервер вошёл в кворум, а лишь то, что серверный процесс активен и привязан к указанному клиентскому порту. Для получения подробной информации о состоянии в контексте кворума и сведений о клиентских подключениях используйте команду «stat».
mntr: Выводит список переменных, которые можно использовать для мониторинга работоспособности кластера.
srvr: Отображает полную информацию о сервере.
stat: Выводит краткую информацию о сервере и подключенных клиентах.
srst: Сбрасывает статистику сервера. Команда повлияет на результатыsrvr,mntrиstat.
conf: Вывести подробные сведения о конфигурации сервиса.
cons: Выводит полные сведения о соединениях/сеансах для всех клиентов, подключённых к этому серверу. Включает информацию о количестве полученных/отправленных пакетов, идентификаторе сеанса, задержках выполнения операций, последней выполненной операции и т. д.
crst: Сбросить статистику соединений/сеансов для всех подключений.
envi: Вывести сведения о рабочем окружении сервиса
dirs: Показывает общий размер файлов снапшотов и логов в байтах
isro: Проверяет, работает ли сервер в режиме только для чтения. Сервер ответитro, если он в режиме только для чтения, илиrw, если режим только для чтения не включён.
wchs: Выводит краткую сводную информацию о наблюдениях на сервере.
wchc: Выводит подробную информацию о наблюдениях (watches) на сервере, сгруппированную по сессиям. Возвращает список сессий (подключений) с соответствующими наблюдениями (путями). Обратите внимание: в зависимости от количества наблюдений эта операция может быть ресурсоёмкой (влиять на производительность сервера), поэтому используйте её с осторожностью.
wchp: Выводит подробную информацию о наблюдениях (watches) для сервера по путям. Результатом является список путей (znode-узлов) с соответствующими сессиями. Обратите внимание: в зависимости от количества наблюдений эта операция может быть ресурсоёмкой (то есть влиять на производительность сервера), используйте её с осторожностью.
dump: Выводит список незавершённых сессий и эфемерных узлов. Работает только на лидере.
csnp: Планирует задачу создания снапшота. Возвращает индекс последнего зафиксированного журнала запланированного снапшота в случае успеха илиFailed to schedule snapshot creation task.в случае ошибки. Обратите внимание, что командаlgifможет помочь определить, завершено ли создание снапшота.
lgif: Информация о логе Keeper.first_log_idx: мой первый индекс лога в хранилище логов;first_log_term: мой первый терм лога;last_log_idx: мой последний индекс лога в хранилище логов;last_log_term: мой последний терм лога;last_committed_log_idx: мой последний зафиксированный индекс лога в машине состояний;leader_committed_log_idx: зафиксированный индекс лога лидера в моём представлении;target_committed_log_idx: целевой индекс лога, который должен быть зафиксирован;last_snapshot_idx: максимальный зафиксированный индекс лога в последнем снапшоте.
rqld: Запрос на избрание новым лидером. ВозвращаетSent leadership request to leader.если запрос отправлен, илиFailed to send leadership request to leader.если запрос не отправлен. Обратите внимание, что если узел уже является лидером, результат будет таким же, как и при успешной отправке запроса.
ftfl: Отображает список всех feature-флагов и показывает, включены ли они для экземпляра Keeper.
ydld: Запрос на передачу лидерства и переход в состояние последователя. Если сервер, получающий запрос, является лидером, он сначала приостановит операции записи, затем дождётся, пока преемник (текущий лидер никогда не может быть преемником) не завершит догон по последним записям журнала, и после этого откажется от лидерства. Преемник будет выбран автоматически. Будет возвращеноSent yield leadership request to leader.если запрос отправлен, илиFailed to send yield leadership request to leader.если запрос не был отправлен. Обратите внимание, что если узел уже является последователем, результат будет таким же, как если бы запрос был отправлен.
pfev: Возвращает значения для всех собранных событий. Для каждого события возвращает его имя, значение и описание.
HTTP-контроль
ClickHouse Keeper предоставляет HTTP-интерфейс для проверки готовности реплики к приему трафика. Он может использоваться в облачных средах, таких как Kubernetes.
Пример конфигурации, которая включает конечную точку /ready:
Флаги возможностей
Keeper полностью совместим с ZooKeeper и его клиентами, но также добавляет несколько уникальных возможностей и типов запросов, которые могут использоваться клиентом ClickHouse.
Поскольку эти возможности могут вносить изменения, несовместимые с предыдущими версиями, большинство из них по умолчанию отключено и может быть включено с помощью параметра конфигурации keeper_server.feature_flags.
Все возможности могут быть явно отключены.
Если вы хотите включить новую возможность для кластера Keeper, мы рекомендуем сначала обновить все экземпляры Keeper в кластере до версии, которая поддерживает эту возможность, а затем включить саму возможность.
Пример конфигурации флагов возможностей, которая отключает multi_read и включает check_not_exists:
Доступны следующие возможности:
| Feature | Description | Default |
|---|---|---|
multi_read | Поддержка запроса множественного чтения (read multi) | 1 |
filtered_list | Поддержка запроса list, который фильтрует результаты по типу узла (эфемерный или постоянный) | 1 |
check_not_exists | Поддержка запроса CheckNotExists, который проверяет, что узел не существует | 1 |
create_if_not_exists | Поддержка запроса CreateIfNotExists, который пытается создать узел, если он не существует. Если он уже существует, изменения не применяются и возвращается ZOK | 1 |
remove_recursive | Поддержка запроса RemoveRecursive, который удаляет узел вместе с его поддеревом | 1 |
Начиная с версии 25.7 некоторые флаги функций включены по умолчанию.
Рекомендуемый способ обновления Keeper до версии 25.7+ — сначала обновиться до версии 24.9+.
Миграция с ZooKeeper
Бесшовная миграция с ZooKeeper на ClickHouse Keeper невозможна. Необходимо остановить кластер ZooKeeper, преобразовать данные и запустить ClickHouse Keeper. Утилита clickhouse-keeper-converter позволяет преобразовать журналы и снимки состояния ZooKeeper в снимок состояния ClickHouse Keeper. Она работает только с ZooKeeper > 3.4. Шаги миграции:
-
Остановите все узлы ZooKeeper.
-
Необязательно, но рекомендуется: найдите ведущий (leader) узел ZooKeeper, запустите и снова остановите его. Это заставит ZooKeeper создать согласованный снимок состояния.
-
Запустите
clickhouse-keeper-converterна ведущем узле, например:
- Скопируйте снимок (snapshot) на серверные узлы ClickHouse с настроенным
keeperили запустите ClickHouse Keeper вместо ZooKeeper. Снимок должен храниться на всех узлах, иначе пустые узлы могут работать быстрее, и один из них может стать лидером.
Инструмент keeper-converter недоступен в отдельном бинарнике Keeper.
Если у вас установлен ClickHouse, вы можете использовать этот бинарник напрямую:
В противном случае вы можете скачать исполняемый файл и запустить инструмент, как описано выше, без установки ClickHouse.
Восстановление после потери кворума
Поскольку ClickHouse Keeper использует Raft, он может выдерживать определённое количество сбоев узлов в зависимости от размера кластера.
Например, в кластере из 3 узлов он будет продолжать корректную работу, если выйдет из строя только 1 узел.
Конфигурацию кластера можно динамически изменять, но есть некоторые ограничения. Переконфигурация также опирается на Raft, поэтому для добавления или удаления узла из кластера необходим кворум. Если вы потеряете слишком много узлов кластера одновременно и не сможете запустить их снова, Raft перестанет работать и не позволит вам переконфигурировать кластер обычным способом.
Тем не менее, в ClickHouse Keeper есть режим восстановления, который позволяет принудительно переконфигурировать кластер, используя только один узел. К этому следует прибегать только в самом крайнем случае, если вы не можете заново запустить узлы или развернуть новый экземпляр на том же endpoint.
Важные замечания перед продолжением:
- Убедитесь, что вышедшие из строя узлы не смогут снова подключиться к кластеру.
- Не запускайте ни один из новых узлов, пока это не будет явно указано в шагах.
После того как вы убедились, что вышеперечисленные условия соблюдены, выполните следующие действия:
- Выберите один узел Keeper в качестве нового лидера. Имейте в виду, что данные этого узла будут использоваться для всего кластера, поэтому рекомендуется выбирать узел с наиболее актуальным состоянием.
- Прежде чем что-либо делать, создайте резервную копию каталогов
log_storage_pathиsnapshot_storage_pathвыбранного узла. - Переконфигурируйте кластер на всех узлах, которые вы планируете использовать.
- Отправьте четырёхбуквенную команду
rcvrна выбранный узел, что переведёт его в режим восстановления, ИЛИ остановите экземпляр Keeper на выбранном узле и запустите его снова с аргументом--force-recovery. - По одному запускайте экземпляры Keeper на новых узлах, убеждаясь, что
mntrвозвращаетfollowerв полеzk_server_stateперед запуском следующего. - В режиме восстановления ведущий (лидирующий) узел будет возвращать сообщение об ошибке на команду
mntrдо тех пор, пока не достигнет кворума с новыми узлами, и будет отклонять любые запросы от клиента и ведомых узлов. - После достижения кворума ведущий узел вернётся в нормальный режим работы и начнёт принимать все запросы через Raft — проверьте это с помощью
mntr, который должен вернутьleaderв полеzk_server_state.
Использование дисков с Keeper
Keeper поддерживает ограниченный набор внешних дисков для хранения снимков, файлов журнала и файла состояния.
Поддерживаемые типы дисков:
- s3_plain
- s3
- local
Ниже приведён пример описаний дисков в файле конфигурации.
Чтобы использовать диск для логов, параметр конфигурации keeper_server.log_storage_disk должен содержать имя диска.
Чтобы использовать диск для снимков (snapshots), параметр конфигурации keeper_server.snapshot_storage_disk должен содержать имя диска.
Дополнительно для последних логов и снимков могут использоваться разные диски с помощью параметров keeper_server.latest_log_storage_disk и keeper_server.latest_snapshot_storage_disk соответственно.
В этом случае Keeper будет автоматически перемещать файлы на соответствующие диски при создании новых логов или снимков.
Чтобы использовать диск для файла состояния, параметр конфигурации keeper_server.state_storage_disk должен содержать имя диска.
Перемещение файлов между дисками безопасно, и нет риска потери данных, даже если Keeper остановится посреди передачи. Пока файл не будет полностью перенесён на новый диск, он не удаляется со старого.
Keeper с параметром keeper_server.coordination_settings.force_sync, установленным в true (true по умолчанию), не может обеспечить некоторые гарантии для всех типов дисков.
В данный момент только диски типа local поддерживают надёжный sync на диск.
Если используется force_sync, log_storage_disk должен быть диском типа local, если latest_log_storage_disk не используется.
Если используется latest_log_storage_disk, он всегда должен быть диском типа local.
Если force_sync отключён, диски любых типов могут использоваться в любой конфигурации.
Возможная конфигурация хранилища для экземпляра Keeper может выглядеть следующим образом:
Этот экземпляр будет хранить все логи, кроме последних, на диске log_s3_plain, а последние логи — на диске log_local.
Такая же логика применяется к снапшотам: все, кроме последних снапшотов, будут храниться на snapshot_s3_plain, а последний снапшот — на диске snapshot_local.
Изменение конфигурации дисков
Перед применением новой конфигурации дисков вручную создайте резервную копию всех логов и снапшотов Keeper.
Если настроена многоуровневая конфигурация дисков (используются отдельные диски для последних файлов), Keeper попытается автоматически переместить файлы на нужные диски при запуске. Гарантии остаются такими же, как и раньше: пока файл полностью не перенесён на новый диск, он не удаляется со старого, поэтому можно безопасно выполнять несколько перезапусков.
Если необходимо перенести файлы на полностью новый диск (или перейти с конфигурации с двумя дисками на конфигурацию с одним диском), можно использовать несколько определений параметров keeper_server.old_snapshot_storage_disk и keeper_server.old_log_storage_disk.
Следующая конфигурация показывает, как можно перейти с предыдущей конфигурации с двумя дисками на полностью новую конфигурацию с одним диском:
При запуске все файлы журналов будут перемещены с дисков log_local и log_s3_plain на диск log_local2.
Кроме того, все файлы снимков состояния будут перемещены с дисков snapshot_local и snapshot_s3_plain на диск snapshot_local2.
Настройка кэша логов
Чтобы минимизировать объём данных, читаемых с диска, Keeper кэширует записи журнала в памяти. Если запросы большие, журнальные записи будут занимать слишком много памяти, поэтому объём кэшируемых логов ограничен. Этот предел настраивается с помощью следующих двух конфигурационных параметров:
latest_logs_cache_size_threshold— общий размер последних логов, хранящихся в кэшеcommit_logs_cache_size_threshold— общий размер следующих по порядку логов, которые предстоит закоммитить
Если значения по умолчанию слишком велики, вы можете сократить потребление памяти, уменьшив значения этих двух параметров.
Вы можете использовать команду pfev, чтобы проверить объём логов, прочитанных из каждого кэша и из файла.
Также вы можете использовать метрики с эндпоинта Prometheus для отслеживания текущего размера обоих кэшей.
Prometheus
Keeper может предоставлять метрики для сбора с помощью Prometheus.
Настройки:
endpoint– HTTP-эндпоинт для сбора метрик сервером Prometheus. Должен начинаться с '/'.port– Порт дляendpoint.metrics– Флаг, включающий экспорт метрик из таблицы system.metrics.events– Флаг, включающий экспорт метрик из таблицы system.events.asynchronous_metrics– Флаг, включающий экспорт текущих значений метрик из таблицы system.asynchronous_metrics.
Пример
Проверьте (замените 127.0.0.1 на IP-адрес или имя хоста сервера ClickHouse):
См. также раздел ClickHouse Cloud Интеграция с Prometheus.
Руководство пользователя ClickHouse Keeper
В этом руководстве приведены простые и минимальные настройки для конфигурации ClickHouse Keeper с примером проверки распределённых операций. Пример выполняется с использованием 3 узлов под управлением Linux.
1. Настройка узлов с параметрами Keeper
-
Установите 3 экземпляра ClickHouse на 3 хоста (
chnode1,chnode2,chnode3). (См. раздел Быстрый старт для получения подробной информации по установке ClickHouse.) -
На каждом узле добавьте следующую запись, чтобы разрешить внешние подключения через сетевой интерфейс.
-
Добавьте следующую конфигурацию ClickHouse Keeper на все три сервера, обновив параметр
<server_id>для каждого сервера; дляchnode1он будет1, дляchnode2—2и т. д.Ниже приведены базовые настройки, использованные выше:
Parameter Description Example tcp_port порт, используемый клиентами Keeper 9181 — значение по умолчанию, аналогичное 2181 в ZooKeeper server_id идентификатор для каждого сервера ClickHouse Keeper, используемый в конфигурации Raft 1 coordination_settings секция с параметрами, такими как тайм-ауты тайм-ауты: 10000, уровень логирования: trace server определение сервера-участника список определений каждого сервера raft_configuration настройки для каждого сервера в кластере Keeper сервер и настройки для каждого id числовой идентификатор сервера для сервисов Keeper 1 hostname имя хоста (hostname), IP-адрес или FQDN каждого сервера в кластере Keeper chnode1.domain.comport порт для прослушивания межсерверных подключений Keeper 9234 -
Включите компонент Zookeeper. Он будет использовать движок ClickHouse Keeper:
Ниже приведены базовые настройки, использованные выше:
Parameter Description Example node список узлов для подключений ClickHouse Keeper запись настроек для каждого сервера host имя хоста (hostname), IP-адрес или FQDN каждого узла ClickHouse Keeper chnode1.domain.comport клиентский порт ClickHouse Keeper 9181 -
Перезапустите ClickHouse и убедитесь, что каждый экземпляр Keeper запущен. Выполните следующую команду на каждом сервере. Команда
ruokвозвращаетimok, если Keeper запущен и находится в исправном состоянии: -
В базе данных
systemесть таблица с именемzookeeper, которая содержит сведения о ваших экземплярах ClickHouse Keeper. Посмотрим содержимое таблицы:
Таблица выглядит так:
2. Настройте кластер в ClickHouse
-
Настроим простой кластер с 2 шардами и только одной репликой на 2 из узлов. Третий узел будет использоваться для достижения кворума, требуемого в ClickHouse Keeper. Обновите конфигурацию на
chnode1иchnode2. Следующий кластер определяет по 1 шарду на каждом узле, всего 2 шарда без репликации. В этом примере часть данных будет находиться на одном узле, а часть — на другом:Parameter Description Example shard список реплик в определении кластера список реплик для каждого шарда replica список настроек для каждой реплики записи настроек для каждой реплики host hostname, IP или FQDN сервера, на котором будет размещаться реплика шарда chnode1.domain.comport порт, используемый для связи через нативный tcp‑протокол 9000 user имя пользователя, которое будет использоваться для аутентификации в экземплярах кластера default password пароль для пользователя, определённого для разрешения подключений к экземплярам кластера ClickHouse123! -
Перезапустите ClickHouse и убедитесь, что кластер был создан:
Вы должны увидеть свой кластер:
3. Создайте и протестируйте распределённую таблицу
-
Создайте новую базу данных на новом кластере, используя ClickHouse client на
chnode1. ОператорON CLUSTERавтоматически создаёт базу данных на обоих узлах. -
Создайте новую таблицу в базе данных
db1. Как и раньше,ON CLUSTERсоздаёт таблицу на обоих узлах. -
На узле
chnode1добавьте пару строк: -
Добавьте пару строк на узле
chnode2: -
Обратите внимание, что выполнение запроса
SELECTна каждом узле показывает только данные, находящиеся на этом узле. Например, наchnode1:На
chnode2: -
-
Вы можете создать таблицу
Distributed, которая будет представлять данные на двух шардах. Таблицы с движкомDistributedне хранят собственные данные, но обеспечивают распределённую обработку запросов по нескольким серверам. Чтения выполняются по всем шардам, а записи могут распределяться между шардами. Выполните следующий запрос наchnode1: -
Обратите внимание, что запрос к
dist_tableвозвращает все четыре строки данных с двух шардов:
Итоги
В этом руководстве показано, как настроить кластер с использованием ClickHouse Keeper. С ClickHouse Keeper вы можете настраивать кластеры и создавать распределённые таблицы, которые могут реплицироваться по шардам.
Настройка ClickHouse Keeper с уникальными путями
Эта страница не относится к ClickHouse Cloud. Описанная здесь процедура выполняется автоматически в сервисах ClickHouse Cloud.
Описание
В этой статье описывается, как использовать встроенную настройку макроса {uuid}
для создания уникальных записей в ClickHouse Keeper или ZooKeeper. Уникальные
пути полезны при частом создании и удалении таблиц, поскольку это позволяет
избежать ожидания в течение нескольких минут, пока сборщик мусора Keeper
удалит записи путей: каждый раз при создании пути в нём используется новый uuid,
пути никогда не переиспользуются.
Пример окружения
Кластер из трёх узлов, который будет настроен таким образом, что ClickHouse Keeper будет работать на всех трёх узлах, а ClickHouse — на двух из этих узлов. Это обеспечивает три узла для ClickHouse Keeper (включая узел-арбитр) и один шард ClickHouse, состоящий из двух реплик.
| node | description |
|---|---|
chnode1.marsnet.local | узел данных — кластер cluster_1S_2R |
chnode2.marsnet.local | узел данных — кластер cluster_1S_2R |
chnode3.marsnet.local | узел-арбитр ClickHouse Keeper |
Пример конфигурации для кластера:
Процедуры по настройке таблиц для использования {uuid}
- Настройте макросы на каждом сервере
пример для сервера 1:
Обратите внимание, что мы определяем макросы для shard и replica, но {uuid} здесь не определён — это встроенный параметр, и его не нужно задавать вручную.
- Создайте базу данных
- Создайте таблицу на кластере, используя макросы и
{uuid}
┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ chnode1.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ │ chnode2.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
Тестирование
- Добавьте данные на первый узел (например,
chnode1)
- Запишите данные на второй узел (например,
chnode2)
- Просмотр записей через распределённую таблицу
Альтернативы
Путь репликации по умолчанию можно заранее задать с помощью макросов, включая {uuid}.
- Задать значение по умолчанию для таблиц на каждом узле
Вы также можете задать макрос {database} на каждом узле, если отдельные узлы используются для конкретных баз данных.
- Создайте таблицу без явных параметров:
ID запроса: ab68cda9-ae41-4d6d-8d3b-20d8255774ee
┌─хост──────────────────┬─порт─┬─статус─┬─ошибка─┬─число_оставшихся_хостов─┬─число_активных_хостов─┐ │ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ │ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ └───────────────────────┴──────┴────────┴────────┴───────────────────────────────┴──────────────────────────────┘
2 строки в наборе. Время выполнения: 1.175 сек.
Устранение неполадок
Пример команды для получения информации о таблице и UUID:
Пример команды для получения информации о таблице в ZooKeeper, содержащей UUID таблицы, указанной выше
База данных должна быть типа Atomic. Если вы выполняете обновление с предыдущей версии, то
база данных default, скорее всего, имеет тип Ordinary.
Чтобы проверить:
Например,
Динамическая переконфигурация ClickHouse Keeper
Эта страница не относится к ClickHouse Cloud. Описанная здесь процедура выполняется автоматически в сервисах ClickHouse Cloud.
Описание
ClickHouse Keeper частично поддерживает команду ZooKeeper reconfig
для динамической переконфигурации кластера, если параметр keeper_server.enable_reconfiguration включён.
Если этот параметр выключен, вы можете переконфигурировать кластер, вручную изменив секцию raft_configuration
реплики. Убедитесь, что вы редактируете файлы на всех репликах, так как только лидер применит изменения.
В качестве альтернативы вы можете отправить запрос reconfig через любой клиент, совместимый с ZooKeeper.
Виртуальный узел /keeper/config содержит последнюю зафиксированную конфигурацию кластера в следующем формате:
- Каждая запись о сервере располагается на отдельной строке.
server_typeможет иметь значениеparticipantилиlearner(learner не участвует в выборах лидера).server_priority— неотрицательное целое число, определяющее, какие узлы должны иметь приоритет на выборах лидера. Приоритет 0 означает, что сервер никогда не станет лидером.
Пример:
Вы можете использовать команду reconfig, чтобы добавлять новые серверы, удалять существующие и изменять их приоритеты. Ниже приведены примеры (с использованием clickhouse-keeper-client):
Вот несколько примеров для kazoo:
Изменить приоритет существующего сервера на 8
reconfig(joining="server.5=localhost:5123;participant;8", leaving=None)
Преобразование одиночного узла Keeper в кластер
Иногда требуется расширить экспериментальный узел Keeper до полноценного кластера. Ниже приведена пошаговая схема, как это сделать для кластера из 3 узлов:
- ВАЖНО: новые узлы необходимо добавлять партиями, меньшими, чем текущий кворум, иначе они смогут выбрать лидера среди себя. В этом примере узлы добавляются по одному.
- Для существующего узла Keeper должен быть включён конфигурационный параметр
keeper_server.enable_reconfiguration. - Запустите второй узел с полной новой конфигурацией кластера Keeper.
- После его запуска добавьте его к узлу 1 с помощью
reconfig. - Теперь запустите третий узел и добавьте его с помощью
reconfig. - Обновите конфигурацию
clickhouse-server, добавив туда новый узел Keeper, и перезапустите сервер для применения изменений. - Обновите конфигурацию Raft на узле 1 и, при необходимости, перезапустите его.
Чтобы лучше освоить этот процесс, можно воспользоваться репозиторием-песочницей.
Неподдерживаемые функции
Хотя ClickHouse Keeper стремится быть полностью совместимым с ZooKeeper, есть несколько функций, которые в настоящее время не реализованы (разработка продолжается):
createне поддерживает возврат объектаStatcreateне поддерживает TTLaddWatchне работает с постоянными наблюдениямиPERSISTENTremoveWatchиremoveAllWatchesне поддерживаютсяsetWatchesне поддерживается- Создание узлов znode типа
CONTAINERне поддерживается - Аутентификация по
SASLне поддерживается