Интеграция S3 с ClickHouse
Вы можете вставлять данные из S3 в ClickHouse, а также использовать S3 в качестве места экспорта, таким образом позволяя взаимодействовать с архитектурами "ДатаЛэйк". Более того, S3 может предоставить уровни "холодного" хранения и помочь в разделении хранения и вычислений. В разделах ниже мы используем набор данных такси Нью-Йорка, чтобы продемонстрировать процесс перемещения данных между S3 и ClickHouse, а также определить ключевые параметры конфигурации и дать советы по оптимизации производительности.
Функции таблиц S3
Функция таблицы s3
позволяет вам читать и записывать файлы из и в хранилище, совместимое с S3. Основная форма синтаксиса выглядит так:
где:
- path — URL корзины с путём к файлу. Поддерживаются следующие подстановочные знаки в режиме только для чтения:
*
,?
,{abc,def}
и{N..M}
гдеN
,M
— это числа,'abc'
,'def'
— это строки. Для получения дополнительной информации смотрите документацию по использованию подстановочных знаков в пути. - format — формат файла.
- structure — Структура таблицы. Формат
'column1_name column1_type, column2_name column2_type, ...'
. - compression — Параметр является опциональным. Поддерживаемые значения:
none
,gzip/gz
,brotli/br
,xz/LZMA
,zstd/zst
. По умолчанию будет автоматически определено сжатие по расширению файла.
Использование подстановочных знаков в выражении пути позволяет ссылаться на несколько файлов и открывает возможность параллелизма.
Подготовка
Перед созданием таблицы в ClickHouse вы можете сначала внимательно рассмотреть данные в корзине S3. Вы можете сделать это прямо из ClickHouse, используя оператор DESCRIBE
:
Результат оператора DESCRIBE TABLE
должен показать вам, как ClickHouse автоматически выведет эти данные, как это видно в корзине S3. Обратите внимание, что он также автоматически распознаёт и разжимает формат сжатия gzip:
Чтобы взаимодействовать с нашими данными на основе S3, мы подготавливаем стандартную таблицу MergeTree
в качестве нашего назначения. Оператор ниже создает таблицу с именем trips
в базе данных по умолчанию. Обратите внимание, что мы решили изменить некоторые из типов данных, как было выведено выше, особенно чтобы не использовать модификатор типа данных Nullable()
, который может вызвать ненужные дополнительные хранимые данные и дополнительные накладные расходы по производительности:
Обратите внимание на использование партиционирования по полю pickup_date
. Обычно ключ партиционирования предназначен для управления данными, но позже мы будем использовать этот ключ для параллелизации записей в S3.
Каждая запись в нашем наборе данных такси содержит поездку на такси. Эти анонимизированные данные состоят из 20 млн записей, сжатых в корзине S3 https://datasets-documentation.s3.eu-west-3.amazonaws.com/ под папкой nyc-taxi. Данные находятся в формате TSV с примерно 1 млн строк на файл.
Чтение данных из S3
Мы можем запрашивать данные S3 в качестве источника без необходимости сохранять их в ClickHouse. В следующем запросе мы выбираем 10 строк. Обратите внимание на отсутствие учетных данных, так как корзина является общедоступной:
Обратите внимание, что нам не нужно перечислять столбцы, поскольку формат TabSeparatedWithNames
кодирует названия столбцов в первой строке. Другие форматы, такие как CSV
или TSV
, вернут автоматически сгенерированные столбцы для этого запроса, например, c1
, c2
, c3
и т.д.
Запросы дополнительно поддерживают виртуальные столбцы, такие как _path
и _file
, которые предоставляют информацию о пути к корзине и имени файла соответственно. Например:
Подтвердите количество строк в этом выборочном наборе данных. Обратите внимание на использование подстановочных знаков для расширения файлов, чтобы мы могли учитывать все двадцать файлов. Этот запрос займет около 10 секунд, в зависимости от количества ядер на экземпляре ClickHouse:
Хотя это полезно для выборки данных и выполнения запросов, не рекомендуется регулярно читать данные непосредственно из S3. Когда пришло время заняться серьезными делами, импортируйте данные в таблицу MergeTree
в ClickHouse.
Использование clickhouse-local
Программа clickhouse-local
позволяет вам выполнять быструю обработку локальных файлов без развертывания и настройки сервера ClickHouse. Все запросы, использующие функцию таблицы s3
, можно выполнять с помощью этого инструмента. Например:
Вставка данных из S3
Чтобы использовать все возможности ClickHouse, мы далее читаем и вставляем данные в наш экземпляр. Мы комбинируем нашу функцию s3
с простым оператором INSERT
, чтобы достичь этого. Обратите внимание, что нам не нужно перечислять наши столбцы, так как целевая таблица предоставляет необходимую структуру. Это требует, чтобы столбцы появлялись в порядке, указанном в операторе DDL таблицы: столбцы сопоставляются в соответствии с их позицией в клаузе SELECT
. Вставка всех 10 млн строк может занять несколько минут в зависимости от экземпляра ClickHouse. Ниже мы вставляем 1 млн строк, чтобы обеспечить быструю реакцию. Настройте клаузу LIMIT
или выбор столбцов, чтобы импортировать подмножества по мере необходимости:
Удаленная вставка с использованием ClickHouse Local
Если политики безопасности сети препятствуют вашему кластеру ClickHouse осуществлять исходящие соединения, вы можете потенциально вставить данные из S3, используя clickhouse-local
. В следующем примере мы читаем из корзины S3 и вставляем в ClickHouse с использованием функции remote
:
Для выполнения этого через безопасное SSL соединение используйте функцию remoteSecure
.
Экспорт данных
Вы можете записывать файлы в S3, используя функцию таблицы s3
. Это потребует соответствующих разрешений. Мы передаём необходимые учетные данные в запросе, но смотрите страницу Управление учетными данными для получения дополнительных опций.
В простом примере ниже мы используем функцию таблицы в качестве назначения вместо источника. Здесь мы потоково передаем 10 000 строк из таблицы trips
в корзину, указывая сжатие lz4
и тип вывода CSV
:
Обратите внимание, как формат файла определяется по расширению. Нам также не нужно указывать столбцы в функции s3
— это можно определить из SELECT
.
Разделение больших файлов
Вряд ли вы захотите экспортировать ваши данные в виде одного файла. Большинство инструментов, включая ClickHouse, добиваются более высокой производительности при чтении и записи в несколько файлов благодаря возможности параллелизма. Мы могли бы выполнять нашу команду INSERT
несколько раз, нацеливаясь на подмножество данных. ClickHouse предлагает способ автоматического разделения файлов с использованием ключа PARTITION
.
В следующем примере мы создаем десять файлов, используя модуль функции rand()
. Обратите внимание, как результирующий идентификатор партиции ссылается на имя файла. Это приводит к созданию десяти файлов с числовым окончанием, например, trips_0.csv.lz4
, trips_1.csv.lz4
и т.д.:
В качестве альтернативы мы можем сослаться на поле в данных. Для этого набора данных payment_type
предоставляет естественный ключ партиционирования с кардинальностью 5.
Использование кластеров
Вышеуказанные функции ограничены выполнением на одном узле. Скорость чтения будет масштабироваться линейно с ядрами CPU до тех пор, пока не будет ограничен другие ресурсы (обычно сеть), позволяя пользователям вертикально масштабироваться. Однако этот подход имеет свои ограничения. Хотя пользователи могут облегчить часть давления на ресурсы, вставляя в распределённую таблицу при выполнении запроса INSERT INTO SELECT
, это всё равно оставляет один узел для чтения, разбора и обработки данных. Для решения этой проблемы и обеспечения масштабирования чтений по горизонтали у нас есть функция s3Cluster.
Узел, принимающий запрос, известный как инициатор, создает соединение с каждым узлом в кластере. Шаблон glob, определяющий, какие файлы нужно читать, разрешается в набор файлов. Инициатор распределяет файлы по узлам в кластере, которые выступают в роли рабочих. Эти рабочие, в свою очередь, запрашивают файлы для обработки по мере завершения чтения. Этот процесс обеспечивает возможность горизонтального масштабирования чтений.
Функция s3Cluster
принимает тот же формат, что и варианты с одним узлом, за исключением того, что требуется целевой кластер для обозначения рабочих узлов:
cluster_name
— имя кластера, который используется для построения набора адресов и параметров соединения для удалённых и локальных серверов.source
— URL к файлу или множеству файлов. Поддерживаются следующие подстановочные знаки в режиме только для чтения:*
,?
,{'abc','def'}
и{N..M}
где N, M — числа, abc, def — строки. Для получения дополнительной информации смотрите Подстановочные знаки в пути.access_key_id
иsecret_access_key
— ключи, которые указывают учетные данные для использования с указанным конечным пунктом. Опционально.format
— формат файла.structure
— структура таблицы. Формат 'column1_name column1_type, column2_name column2_type, ...'.
Как и в любом s3
, учетные данные являются опциональными, если корзина небезопасна или вы определяете безопасность через окружение, например, IAM роли. В отличие от функции s3, однако, структура должна быть указана в запросе, начиная с версии 22.3.1, то есть схема не считается автоматически.
Эта функция будет использоваться в большинстве случаев как часть INSERT INTO SELECT
. В этом случае вы часто будете вставлять в распределённую таблицу. Мы иллюстрируем простой пример ниже, где trips_all является распределённой таблицей. Хотя эта таблица использует кластер событий, согласованность узлов, используемых для чтения и записи, не является обязательной:
Вставки будут происходить против узла инициатора. Это означает, что в то время как чтения будут происходить на каждом узле, результирующие строки будут направляться к инициатору для распределения. В сценариях с высокой пропускной способностью это может стать узким местом. Для решения этой проблемы установите параметр parallel_distributed_insert_select для функции s3cluster
.
Движки таблиц S3
Хотя функции s3
позволяют выполнять ad-hoc запросы к данным, хранящимся в S3, они синтаксически громоздки. Движок таблиц S3
позволяет вам не указывать URL корзины и учетные данные снова и снова. Для этого ClickHouse предоставляет движок таблиц S3.
path
— URL корзины с путём к файлу. Поддерживаются следующие подстановочные знаки в режиме только для чтения:*
,?
,{abc,def}
и{N..M}
где N, M — числа, 'abc', 'def' — строки. Для получения дополнительной информации смотрите здесь.format
— формат файла.aws_access_key_id
,aws_secret_access_key
- Долгосрочные учетные данные для пользователя AWS. Вы можете использовать их для аутентификации ваших запросов. Параметр является опциональным. Если учетные данные не указаны, используются значения из файла конфигурации. Для получения дополнительной информации смотрите Управление учетными данными.compression
— Тип сжатия. Поддерживаемые значения: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. Параметр является опциональным. По умолчанию будет автоматически определено сжатие по расширению файла.
Чтение данных
В следующем примере мы создаем таблицу с именем trips_raw
, используя первые десять файлов TSV, расположенных в корзине https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/
. Каждый из этих файлов содержит по 1 млн строк:
Обратите внимание на использование шаблона {0..9}
, чтобы ограничить только первыми десятью файлами. После создания мы можем запрашивать эту таблицу так же, как и любую другую таблицу:
Вставка данных
Движок таблиц S3
поддерживает параллельное чтение. Записи поддерживаются только в том случае, если определение таблицы не содержит шаблонов glob. Таким образом, вышеуказанная таблица блокировала бы записи.
Чтобы продемонстрировать записи, создайте таблицу, указывающую на запись в S3:
Обратите внимание, что строки можно вставлять только в новые файлы. Не существует линейных циклов слияния или операций разделения файлов. Как только файл записывается, последующие вставки завершатся неудачей. У пользователей есть два варианта:
- Установить параметр
s3_create_new_file_on_insert=1
. Это приведет к созданию новых файлов при каждой вставке. Числовое окончание будет добавлено в конец каждого файла, что будет монотонно увеличиваться для каждой операции вставки. Для вышеуказанного примера последующая вставка приведёт к созданиюtrips_1.bin
. - Установить параметр
s3_truncate_on_insert=1
. Это приведет к усечению файла, т.е. он будет содержать только вновь вставленные строки после завершения.
Оба этих параметра по умолчанию установлены в 0 — таким образом, пользователю необходимо установить один из них. Если оба установлены, s3_truncate_on_insert
будет иметь приоритет.
Некоторые примечания об движке таблиц S3
:
- В отличие от традиционной таблицы из семьи
MergeTree
, удаление таблицыS3
не приведет к удалению подлежащих данным. - Полные настройки для этого типа таблиц можно найти здесь.
- Будьте внимательны к следующим ограничениям при использовании этого движка:
- Запросы ALTER не поддерживаются
- Операции SAMPLE не поддерживаются
- Нет понятия индексов, т.е. первичных или разреженных.
Управление учетными данными
В предыдущих примерах мы передавали учетные данные в функции s3
или определении таблицы S3
. Хотя это может быть приемлемо для время от времени, пользователи требуют менее явных механизмов аутентификации в производственной среде. Для решения этой проблемы ClickHouse предлагает несколько вариантов:
-
Укажите детали соединения в config.xml или аналогичном файле конфигурации в conf.d. Содержимое примера файла показано ниже, предполагая установку с использованием Debian-пакета.
Эти учетные данные будут использоваться для любых запросов, где указанный выше конечный пункт является точным префиксным соответствием для запрашиваемого URL. Также обратите внимание на возможность в этом примере объявить заголовок авторизации как альтернативу для ключей доступа и секретов. Полный список поддерживаемых настроек можно найти здесь.
-
Пример выше подчеркивает наличие параметра конфигурации
use_environment_credentials
. Этот параметр конфигурации также можно установить глобально на уровнеs3
:Эта настройка включает попытку получить учетные данные S3 из окружения, что позволяет получать доступ через IAM-ролей. В частности, выполняется следующий порядок извлечения:
- Поиск переменных окружения
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
иAWS_SESSION_TOKEN
- Проверка выполняется в $HOME/.aws
- Временные учетные данные, полученные через службу безопасности AWS Token — т.е. через API
AssumeRole
- Проверки учетных данных в переменных окружения ECS
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
илиAWS_CONTAINER_CREDENTIALS_FULL_URI
иAWS_ECS_CONTAINER_AUTHORIZATION_TOKEN
. - Получение учетных данных через метаданные экземпляра Amazon EC2, при этом имеется в виду, что AWS_EC2_METADATA_DISABLED не установлен в true.
- Эти же настройки также могут быть установлены для конкретного конечного пункта с использованием того же правила сопоставления префиксов.
- Поиск переменных окружения
Оптимизация производительности
Для оптимизации чтения и вставки с использованием функции S3 смотрите посвященное руководство по производительности.
Настройка хранения S3
Внутренне дерево слияния ClickHouse использует два основных формата хранения: Wide
и Compact
. Хотя текущее выполнение использует поведение по умолчанию ClickHouse (управляемое через настройки min_bytes_for_wide_part
и min_rows_for_wide_part
), мы ожидаем, что поведение S3 будет отличаться в будущих релизах, например, большее значение по умолчанию min_bytes_for_wide_part
, поощряющее более Compact
формат и, следовательно, меньшее количество файлов. Пользователи могут теперь захотеть настроить эти настройки при использовании исключительно хранилища S3.
MergeTree на основе S3
Функции s3
и связанный движок таблиц позволяют нам запрашивать данные в S3, используя привычный синтаксис ClickHouse. Однако, касаясь функций управления данными и производительности, они ограничены. Нет поддержки первичных индексов, поддержки no-cache, и операции вставки файлов необходимо управлять пользователем.
ClickHouse признает, что S3 представляет собой привлекательное решение для хранения, особенно когда производительность запросов на "более холодные" данные менее критична, и пользователи стремятся разделить хранение и вычисления. Чтобы помочь в этом, предусмотрена поддержка использования S3 в качестве хранилища для движка MergeTree. Это позволит пользователям использовать преимущества масштабируемости и экономии затрат S3, а также производительности вставки и запросов движка MergeTree.
Уровни хранения
Носители хранимых данных ClickHouse позволяют абстрагироваться от физических дисков в движке таблиц MergeTree. Любой отдельный носитель может состоять из упорядоченного набора дисков. Хотя в основном это позволяет использовать несколько блоковых устройств для хранения данных, такая абстракция также позволяет использовать другие типы хранения, включая S3. Части данных ClickHouse могут перемещаться между носителями и заполняемостью в соответствии с политиками хранения, тем самым создавая концепцию уровней хранения.
Уровни хранения разблокируют архитектуры горячего и холодного хранения, где самые свежие данные, которые обычно также запрашиваются чаще всего, требуют лишь небольшого объема на высокопроизводительных носителях, например, NVMe SSD. По мере старения данных, обязательства по времени выполнения запросов увеличиваются, как и частота запросов. Этот "толстый" хвост данных может храниться на более медленных, менее производительных носителях, таких как HDD или объектное хранилище, такое как S3.
Создание диска
Чтобы использовать S3 корзину в качестве диска, мы должны сначала объявить ее в файле конфигурации ClickHouse. Либо расширить config.xml, либо предпочтительно предоставить новый файл в директории conf.d. Пример объявления диска S3 показан ниже:
Полный список настроек, относящихся к этому объявлению диска, можно найти здесь. Обратите внимание, что учетные данные можно управлять здесь, используя те же подходы, описанные в Управлении учетными данными, т.е. use_environment_credentials
может быть установлен в true в приведенном выше блоке настроек, чтобы использовать роли IAM.
Создание политики хранения
После настройки этот "диск" может быть использован носителем, объявленным в политике. В приведенном ниже примере мы предполагаем, что s3 является нашим единственным хранилищем. Это игнорирует более сложные архитектуры горячего и холодного хранения, где данные могут перемещаться на основе TTL и заполняемости.
Создание таблицы
Предполагая, что вы настроили ваш диск для использования корзины с правами на запись, вы должны иметь возможность создать таблицу, как в приведенном ниже примере. Для краткости мы используем подмножество колонок такси NYC и передаем данные непосредственно в таблицу, поддерживаемую S3:
В зависимости от аппаратного обеспечения, эта последняя вставка 1 миллиона строк может занять несколько минут для выполнения. Вы можете подтвердить прогресс через таблицу system.processes. Не стесняйтесь увеличивать количество строк до лимита в 10 миллионов и исследовать некоторые тестовые запросы.
Модификация таблицы
Иногда пользователям может потребоваться модифицировать политику хранения конкретной таблицы. Хотя это возможно, это имеет ограничения. Новая целевая политика должна содержать все диски и носители предыдущей политики, т.е. данные не будут мигрированы, чтобы удовлетворить изменения в политике. При проверке этих ограничений носители и диски будут определяться по их имени, и попытки нарушения приведут к ошибке. Однако, если вы используете предыдущие примеры, следующие изменения допустимы.
Здесь мы повторно используем основной носитель в нашей новой политике s3_tiered и вводим новый горячий носитель. Это использует диск по умолчанию, который состоит только из одного диска, настроенного через параметр <path>
. Обратите внимание, что наши имена носителей и дисков не меняются. Новые вставки в таблицу будут находиться на диске по умолчанию, пока это не достигнет move_factor * disk_size
- после чего данные будут перемещены в S3.
Обработка репликации
Репликация с S3 дисками может быть выполнена с использованием движка таблиц ReplicatedMergeTree
. См. руководство по репликации одного шардирования через два региона AWS с использованием объектного хранилища S3 для подробностей.
Чтения и записи
Ниже приведены заметки, касающиеся реализации взаимодействия S3 с ClickHouse. Хотя они в основном информативны, они могут помочь читателям при Оптимизации производительности:
- По умолчанию максимальное количество потоков обработки запросов, используемых на любом этапе конвейера обработки запросов, равно количеству ядер. Некоторые этапы более параллелизируемы, чем другие, поэтому это значение дает верхний предел. Несколько этапов запроса могут выполняться одновременно, так как данные передаются с диска. Таким образом, точное количество потоков, используемых для запроса, может превышать это значение. Измените через настройку max_threads.
- Чтения в S3 асинхронные по умолчанию. Это поведение определяется настройкой
remote_filesystem_read_method
, установленной в значениеthreadpool
по умолчанию. При обслуживании запроса ClickHouse читает гранулы в полосах. Каждая из этих полос потенциально содержит множество колонок. Поток будет читать столбцы для своих гранул по одному. Вместо того, чтобы делать это синхронно, происходит предварительная выборка всех колонок перед ожиданием данных. Это предлагает значительные улучшения в производительности по сравнению с синхронным ожиданием на каждом столбце. Пользователям обычно не нужно изменять эту настройку - см. Оптимизацию производительности. - Записи выполняются параллельно, с максимум 100 одновременными потоками записи файлов.
max_insert_delayed_streams_for_parallel_write
, который имеет значение по умолчанию 1000, контролирует количество S3 блобов, записываемых параллельно. Поскольку для каждого записываемого файла требуется буфер (~1 МБ), это эффективно ограничивает потребление памяти при вставке. В низких сценариях памяти сервера может быть целесообразно снизить это значение.
Использование S3 объектного хранилища в качестве диска ClickHouse
Если вам нужны пошаговые инструкции по созданию корзин и роли IAM, то разверните Создание корзин S3 и роли IAM и следуйте инструкциям:
Create S3 buckets and an IAM user
This article demonstrates the basics of how to configure an AWS IAM user, create an S3 bucket and configure ClickHouse to use the bucket as an S3 disk. You should work with your security team to determine the permissions to be used, and consider these as a starting point.
Create an AWS IAM user
In this procedure, we'll be creating a service account user, not a login user.
-
Log into the AWS IAM Management Console.
-
In "users", select Add users

- Enter the user name and set the credential type to Access key - Programmatic access and select Next: Permissions

- Do not add the user to any group; select Next: Tags

- Unless you need to add any tags, select Next: Review

-
Select Create User
примечаниеThe warning message stating that the user has no permissions can be ignored; permissions will be granted on the bucket for the user in the next section

- The user is now created; click on show and copy the access and secret keys.
Save the keys somewhere else; this is the only time that the secret access key will be available.

- Click close, then find the user in the users screen.
- Copy the ARN (Amazon Resource Name) and save it for use when configuring the access policy for the bucket.

Create an S3 bucket
- In the S3 bucket section, select Create bucket

- Enter a bucket name, leave other options default
The bucket name must be unique across AWS, not just the organization, or it will emit an error.
- Leave
Block all Public Access
enabled; public access is not needed.

- Select Create Bucket at the bottom of the page

-
Select the link, copy the ARN, and save it for use when configuring the access policy for the bucket.
-
Once the bucket has been created, find the new S3 bucket in the S3 buckets list and select the link

- Select Create folder

- Enter a folder name that will be the target for the ClickHouse S3 disk and select Create folder

- The folder should now be visible on the bucket list

- Select the checkbox for the new folder and click on Copy URL Save the URL copied to be used in the ClickHouse storage configuration in the next section.

- Select the Permissions tab and click on the Edit button in the Bucket Policy section

- Add a bucket policy, example below:
You should work with your security team to determine the permissions to be used, consider these as a starting point. For more information on Policies and settings, refer to AWS documentation: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html
- Save the policy configuration.
Настройка ClickHouse для использования корзины S3 в качестве диска
Следующий пример основан на установленном пакете Deb Linux как службы с каталогами ClickHouse по умолчанию.
- Создайте новый файл в директории
config.d
ClickHouse для хранения конфигурации хранения.
- Добавьте следующее для конфигурации хранения; подставляя путь к корзине, ключ доступа и секретные ключи из предыдущих шагов.
Теги s3_disk
и s3_cache
внутри тега <disks>
являются произвольными метками. Их можно установить на что-то другое, но та же метка должна быть использована в теге <disk>
под тегом <policies>
, чтобы ссылаться на диск. Тег <S3_main>
также произвольный и являет собой имя политики, которое будет использоваться в качестве идентификатора для хранения при создании ресурсов в ClickHouse.
Представленная выше конфигурация предназначена для ClickHouse версии 22.8 и выше, если вы используете более старую версию, пожалуйста, смотрите хранение данных.
Для получения дополнительной информации о использовании S3: Руководство по интеграциям: MergeTree с поддержкой S3
- Обновите владельца файла на пользователя и группу
clickhouse
.
- Перезапустите экземпляр ClickHouse, чтобы изменения вступили в силу.
Тестирование
- Войдите через клиент ClickHouse, что-то вроде следующего.
- Создайте таблицу, указав новую политику хранения S3.
- Покажите, что таблица была создана с правильной политикой.
- Вставьте тестовые строки в таблицу.
- Просмотрите строки.
- В консоли AWS перейдите к корзинам и выберите новую, а также папку. Вы должны увидеть что-то похожее на следующее:

Репликация одного шардирования через два региона AWS с использованием объектного хранилища S3
Объектное хранилище используется по умолчанию в ClickHouse Cloud, вам не нужно следовать этой процедуре, если вы работаете в ClickHouse Cloud.
Планирование развертывания
Этот учебник основан на развертывании двух узлов сервера ClickHouse и трех узлов ClickHouse Keeper в AWS EC2. Хранилище данных для серверов ClickHouse - это S3. Используются два региона AWS, каждый из которых имеет сервер ClickHouse и корзину S3, чтобы поддерживать восстановление после сбоя.
Таблицы ClickHouse реплицируются между двумя серверами, а следовательно, и между двумя регионами.
Установка программного обеспечения
Узлы сервера ClickHouse
Обратитесь к инструкциям по установке при выполнении шагов развертывания на узлах сервера ClickHouse.
Развертывание ClickHouse
Разверните ClickHouse на двух хостах, в образцах конфигураций они называются chnode1
, chnode2
.
Поместите chnode1
в один регион AWS, а chnode2
- во второй.
Развертывание ClickHouse Keeper
Разверните ClickHouse Keeper на трех хостах, в образцах конфигураций они называются keepernode1
, keepernode2
и keepernode3
. keepernode1
можно развернуть в том же регионе, что и chnode1
, keepernode2
с chnode2
, а keepernode3
в любом регионе, но в другой доступной зоне по сравнению с узлом ClickHouse в этом регионе.
Обратитесь к инструкциям по установке при выполнении шагов развертывания на узлах ClickHouse Keeper.
Создание корзин S3
Создайте две корзины S3, одну в каждом из регионов, где вы разместили chnode1
и chnode2
.
Если вам нужны пошаговые инструкции по созданию корзин и роли IAM, то разверните Создание корзин S3 и роли IAM и следуйте инструкциям:
Create S3 buckets and an IAM user
This article demonstrates the basics of how to configure an AWS IAM user, create an S3 bucket and configure ClickHouse to use the bucket as an S3 disk. You should work with your security team to determine the permissions to be used, and consider these as a starting point.
Create an AWS IAM user
In this procedure, we'll be creating a service account user, not a login user.
-
Log into the AWS IAM Management Console.
-
In "users", select Add users

- Enter the user name and set the credential type to Access key - Programmatic access and select Next: Permissions

- Do not add the user to any group; select Next: Tags

- Unless you need to add any tags, select Next: Review

-
Select Create User
примечаниеThe warning message stating that the user has no permissions can be ignored; permissions will be granted on the bucket for the user in the next section

- The user is now created; click on show and copy the access and secret keys.
Save the keys somewhere else; this is the only time that the secret access key will be available.

- Click close, then find the user in the users screen.
- Copy the ARN (Amazon Resource Name) and save it for use when configuring the access policy for the bucket.

Create an S3 bucket
- In the S3 bucket section, select Create bucket

- Enter a bucket name, leave other options default
The bucket name must be unique across AWS, not just the organization, or it will emit an error.
- Leave
Block all Public Access
enabled; public access is not needed.

- Select Create Bucket at the bottom of the page

-
Select the link, copy the ARN, and save it for use when configuring the access policy for the bucket.
-
Once the bucket has been created, find the new S3 bucket in the S3 buckets list and select the link

- Select Create folder

- Enter a folder name that will be the target for the ClickHouse S3 disk and select Create folder

- The folder should now be visible on the bucket list

- Select the checkbox for the new folder and click on Copy URL Save the URL copied to be used in the ClickHouse storage configuration in the next section.

- Select the Permissions tab and click on the Edit button in the Bucket Policy section

- Add a bucket policy, example below:
You should work with your security team to determine the permissions to be used, consider these as a starting point. For more information on Policies and settings, refer to AWS documentation: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html
- Save the policy configuration.
Файлы конфигурации затем будут помещены в /etc/clickhouse-server/config.d/
. Вот пример файла конфигурации для одной корзины, другая аналогична с тремя отличиями, отмеченными:
Многие шаги в этом руководстве попросят вас разместить файл конфигурации в /etc/clickhouse-server/config.d/
. Это место по умолчанию для файлов переопределения конфигурации на системах Linux. Когда вы помещаете эти файлы в этот каталог, ClickHouse использует их содержимое для переопределения конфигурации по умолчанию. Помещая эти файлы в каталог переопределения, вы избегаете потери конфигурации при обновлении.
Настройка ClickHouse Keeper
При запуске ClickHouse Keeper в автономном режиме (отдельно от сервера ClickHouse) конфигурация представляет собой один XML файл. В этом учебном материале файл - /etc/clickhouse-keeper/keeper_config.xml
. Все три сервера Keeper используют одну и ту же конфигурацию, но с одной отличающейся настройкой; <server_id>
.
server_id
указывает ID, который будет назначен хосту, на котором используется файл конфигурации. В приведенном ниже примере server_id
равен 3
, и если вы еще раз взглянете на файл секции <raft_configuration>
, вы увидите, что сервер 3 имеет имя хоста keepernode3
. Таким образом, процесс ClickHouse Keeper знает, к каким другим серверам подключаться, выбирая лидера и выполняя все другие действия.
Скопируйте файл конфигурации для ClickHouse Keeper на место (не забывая установить <server_id>
):
Настройка сервера ClickHouse
Определение кластера
Кластеры ClickHouse определяются в разделе <remote_servers>
конфигурации. В этом примере определен один кластер, cluster_1S_2R
, который состоит из одного шарда с двумя репликами. Реплики находятся на хостах chnode1
и chnode2
.
При работе с кластерами полезно определить макросы, которые заполняют DDL-запросы данными о кластере, шарде и реплике. Этот образец позволяет вам указывать использование реплицированного движка таблицы без предоставления деталей о shard
и replica
. При создании таблицы вы можете увидеть, как макросы shard
и replica
используются, запрашивая system.tables
.
Вышеприведенные макросы предназначены для chnode1
, на chnode2
установите replica
на replica_2
.
Отключение репликации без копирования
В версиях ClickHouse 22.7 и ниже настройка allow_remote_fs_zero_copy_replication
по умолчанию установлена в true
для дисков S3 и HDFS. Эта настройка должна быть установлена в false
для этого сценария восстановления после сбоя, а в версии 22.8 и выше она по умолчанию установлена в false
.
Эта настройка должна быть ложной по двум причинам: 1) эта функция не готова к производству; 2) в случае восстановления после сбоя как данные, так и метаданные должны храниться в нескольких регионах. Установите allow_remote_fs_zero_copy_replication
в false
.
ClickHouse Keeper отвечает за координацию репликации данных между узлами ClickHouse. Чтобы сообщить ClickHouse об узлах ClickHouse Keeper, добавьте файл конфигурации на каждом из узлов ClickHouse.
Настройка сети
Смотрите список сетевых портов, когда вы настраиваете параметры безопасности в AWS, чтобы ваши серверы могли общаться друг с другом, и вы могли с ними общаться.
Все три сервера должны слушать сетевые подключения, чтобы они могли взаимодействовать между собой и с S3. По умолчанию ClickHouse слушает только на адресе обратной связи, поэтому это необходимо изменить. Это настраивается в /etc/clickhouse-server/config.d/
. Вот пример, который настраивает ClickHouse и ClickHouse Keeper для прослушивания всех интерфейсов IP v4. см. документацию или файл конфигурации по умолчанию /etc/clickhouse/config.xml
для получения дополнительной информации.
Запуск серверов
Запуск ClickHouse Keeper
На каждом сервере Keeper выполните команды для вашей операционной системы, например:
Проверка статуса ClickHouse Keeper
Отправьте команды ClickHouse Keeper с помощью netcat
. Например, mntr
возвращает состояние кластера ClickHouse Keeper. Если вы выполните команду на каждом из узлов Keeper, вы увидите, что один является лидером, а другие два - последователями:
Запуск сервера ClickHouse
На каждом сервере ClickHouse выполните
Проверка сервера ClickHouse
Когда вы добавили конфигурацию кластера, был определен один шард, реплицированный между двумя узлами ClickHouse. На этом этапе проверки вы будете проверять, был ли кластер построен при запуске ClickHouse и создадите реплицированную таблицу, использующую этот кластер.
-
Убедитесь, что кластер существует:
-
Создайте таблицу в кластере с использованием движка таблицы
ReplicatedMergeTree
: -
Понимание использования ранее определенных макросов
Макросы
shard
иreplica
были определены ранее, и на выделенной строчке ниже вы можете увидеть, где значения подставляются на каждом узле ClickHouse. Кроме того, используется значениеuuid
;uuid
не определен в макросах, поскольку он генерируется системой.примечаниеВы можете настроить путь к зоопарку
'clickhouse/tables/{uuid}/{shard}
показанный выше, установивdefault_replica_path
иdefault_replica_name
. Документация доступна здесь.
Тестирование
Эти тесты подтвердят, что данные реплицируются между двумя серверами и хранятся в корзинах S3, а не на локальном диске.
-
Добавьте данные из набора данных такси Нью-Йорка:
-
Убедитесь, что данные хранятся в S3.
Этот запрос показывает размер данных на диске и политику, используемую для определения, какой диск используется.
Проверьте размер данных на локальном диске. Из вышесказанного, размер на диске для миллионов строк составляет 36.42 MiB. Это должно быть на S3, а не на локальном диске. Вышеуказанный запрос также показывает, где на локальном диске хранятся данные и метаданные. Проверьте локальные данные:
Проверьте данные S3 в каждой корзине S3 (общие размеры не показаны, но в обеих корзинах после вставок хранится приблизительно 36 MiB):


S3Express
S3Express - это новый класс хранения с высокой производительностью в одной зоне доступности в Amazon S3.
Вы можете ознакомиться с этим блогом чтобы узнать о нашем опыте тестирования S3Express с ClickHouse.
S3Express хранит данные в пределах одной зоны доступности. Это означает, что данные будут недоступны в случае сбоя зоны доступности.
S3 диск
Создание таблицы с хранилищем на основе S3Express корзины включает в себя следующие шаги:
- Создайте корзину типа
Directory
- Установите соответствующую политику корзины, чтобы предоставить все необходимые права вашему пользователю S3 (например,
"Action": "s3express:*"
для простого разрешения неограниченного доступа) - При настройке политики хранения, пожалуйста, укажите параметр
region
Конфигурация хранения такая же, как для обычного S3 и может выглядеть следующим образом:
Затем создайте таблицу в новом хранилище:
S3 хранилище
S3 хранилище также поддерживается, но только для путей Object URL
. Например:
это также требует указания региона корзины в конфигурации:
Резервные копии
Возможно сохранить резервную копию на диске, который мы создали выше: