Интеграция S3 с ClickHouse
Вы можете вставлять данные из S3 в ClickHouse, а также использовать S3 в качестве места экспорта, что позволяет взаимодействовать с архитектурами "Data Lake". Более того, 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.
Каждая запись в нашем наборе данных такси содержит поездку на такси. Эти анонимные данные состоят из 20M записей, сжимаемых в ведре S3 по адресу https://datasets-documentation.s3.eu-west-3.amazonaws.com/ в папке nyc-taxi. Данные находятся в формате TSV с примерно 1M строк на файл.
Чтение данных из 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
. Вставка всех 10M строк может занять несколько минут в зависимости от экземпляра ClickHouse. Ниже мы вставляем 1M строк, чтобы обеспечить быстрый ответ. Отрегулируйте оператор 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/
. Каждый из них содержит по 1M строк:
Обратите внимание на использование шаблона {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 - т.е. через 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
, способствующее более компактному формату и, таким образом, меньшему количеству файлов. Пользователи могут теперь захотеть настроить эти параметры при использовании исключительно S3 хранения.
MergeTree на основе S3
Функции s3
и связанный с ними движок таблиц позволяют нам выполнять запросы к данным в S3, используя знакомый синтаксис ClickHouse. Однако, что касается функций управления данными и производительности, они ограничены. Нет поддержки первичных индексов, нет поддержки кэширования, а вставка файлов должна управляться пользователем.
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 МБ), это эффективно ограничивает потребление памяти INSERT. В сценариях с низким объемом памяти на сервере может быть уместно уменьшить это значение.
Использование Объектного Хранилища S3 в качестве Диска ClickHouse
Если вам нужны пошаговые инструкции для создания корзин и IAM-ролей, разверните Создание корзин S3 и IAM-ролей и следуйте инструкциям:
Создание S3 бакетов и пользователя IAM
В этой статье описаны основы настройки учетной записи пользователя AWS IAM, создания S3 бакета и настройки ClickHouse для использования этого бакета в качестве S3 диска. Вы должны работать с вашей командой безопасности, чтобы определить права доступа, которые необходимо использовать, и рассматривать это как отправную точку.
Создание пользователя AWS IAM
В этой процедуре мы создадим пользователя учетной записи сервиса, а не пользователя для входа.
-
Войдите в консоль управления AWS IAM.
-
В разделе "Пользователи" выберите Добавить пользователей

- Введите имя пользователя и выберите тип учетных данных Ключ доступа - Программный доступ, затем выберите Далее: Права

- Не добавляйте пользователя в какую-либо группу; выберите Далее: Теги

- Если вам не нужно добавлять теги, выберите Далее: Обзор

-
Выберите Создать пользователя
примечаниеСообщение об ошибке, указывающее на то, что у пользователя нет прав, можно игнорировать; права будут предоставлены на бакете для пользователя в следующем разделе

- Пользователь теперь создан; нажмите на показать и скопируйте ключи доступа и секретный ключ.
Сохраните ключи где-нибудь еще; это последний раз, когда секретный ключ доступа будет доступен.

- Закройте окно, затем найдите пользователя на экране пользователей.
- Скопируйте ARN (имя ресурса Amazon) и сохраните его для использования при настройке политики доступа для бакета.

Создание S3 бакета
- В разделе бакетов S3 выберите Создать бакет

- Введите имя бакета, оставив остальные параметры по умолчанию
Имя бакета должно быть уникальным в AWS, а не только в организации, в противном случае будет ошибка.
- Оставьте
Block all Public Access
включенным; доступ для публичных пользователей не нужен.

- Внизу страницы выберите Создать бакет

-
Выберите ссылку, скопируйте ARN и сохраните его для использования при настройке политики доступа для бакета.
-
После создания бакета найдите новый S3 бакет в списке бакетов S3 и выберите ссылку

- Выберите Создать папку

- Введите имя папки, которая будет целью для S3 диска ClickHouse, и выберите Создать папку

- Папка теперь должна отображаться в списке бакетов

- Выберите флажок новой папки и нажмите Копировать URL Сохраните скопированный URL для использования в конфигурации хранилища ClickHouse в следующем разделе.

- Выберите вкладку Права доступа и нажмите кнопку Редактировать в разделе Политика бакета

- Добавьте политику бакета, пример ниже:
Вы должны работать с вашей командой безопасности, чтобы определить права доступа, которые необходимо использовать, и рассматривать это как отправную точку. Для получения дополнительной информации о политиках и настройках обратитесь к документации AWS: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html
- Сохраните конфигурацию политики.
Настройка ClickHouse для использования корзины S3 в качестве диска
Следующий пример основан на пакете Deb, установленном как служба с использованием стандартных каталогов 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 Server и трех узлов 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-ролей и следуйте инструкциям:
Создание S3 бакетов и пользователя IAM
В этой статье описаны основы настройки учетной записи пользователя AWS IAM, создания S3 бакета и настройки ClickHouse для использования этого бакета в качестве S3 диска. Вы должны работать с вашей командой безопасности, чтобы определить права доступа, которые необходимо использовать, и рассматривать это как отправную точку.
Создание пользователя AWS IAM
В этой процедуре мы создадим пользователя учетной записи сервиса, а не пользователя для входа.
-
Войдите в консоль управления AWS IAM.
-
В разделе "Пользователи" выберите Добавить пользователей

- Введите имя пользователя и выберите тип учетных данных Ключ доступа - Программный доступ, затем выберите Далее: Права

- Не добавляйте пользователя в какую-либо группу; выберите Далее: Теги

- Если вам не нужно добавлять теги, выберите Далее: Обзор

-
Выберите Создать пользователя
примечаниеСообщение об ошибке, указывающее на то, что у пользователя нет прав, можно игнорировать; права будут предоставлены на бакете для пользователя в следующем разделе

- Пользователь теперь создан; нажмите на показать и скопируйте ключи доступа и секретный ключ.
Сохраните ключи где-нибудь еще; это последний раз, когда секретный ключ доступа будет доступен.

- Закройте окно, затем найдите пользователя на экране пользователей.
- Скопируйте ARN (имя ресурса Amazon) и сохраните его для использования при настройке политики доступа для бакета.

Создание S3 бакета
- В разделе бакетов S3 выберите Создать бакет

- Введите имя бакета, оставив остальные параметры по умолчанию
Имя бакета должно быть уникальным в AWS, а не только в организации, в противном случае будет ошибка.
- Оставьте
Block all Public Access
включенным; доступ для публичных пользователей не нужен.

- Внизу страницы выберите Создать бакет

-
Выберите ссылку, скопируйте ARN и сохраните его для использования при настройке политики доступа для бакета.
-
После создания бакета найдите новый S3 бакет в списке бакетов S3 и выберите ссылку

- Выберите Создать папку

- Введите имя папки, которая будет целью для S3 диска ClickHouse, и выберите Создать папку

- Папка теперь должна отображаться в списке бакетов

- Выберите флажок новой папки и нажмите Копировать URL Сохраните скопированный URL для использования в конфигурации хранилища ClickHouse в следующем разделе.

- Выберите вкладку Права доступа и нажмите кнопку Редактировать в разделе Политика бакета

- Добавьте политику бакета, пример ниже:
Вы должны работать с вашей командой безопасности, чтобы определить права доступа, которые необходимо использовать, и рассматривать это как отправную точку. Для получения дополнительной информации о политиках и настройках обратитесь к документации AWS: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html
- Сохраните конфигурацию политики.
Конфигурационные файлы будут помещены в /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
.
Эта настройка должна быть равна 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
не определен в макросах, так как он сгенерирован системой.примечаниеВы можете настроить путь zookeeper
'clickhouse/tables/{uuid}/{shard}
показанный выше, установивdefault_replica_path
иdefault_replica_name
. Документация доступна здесь.
Тестирование
Эти тесты подтвердят, что данные реплицируются между двумя серверами и что они хранятся в корзинах S3, а не на локальном диске.
-
Добавьте данные из набора данных такси Нью-Йорка:
-
Убедитесь, что данные хранятся в S3.
Этот запрос показывает размер данных на диске и политику, используемую для определения, какой диск используется.
Проверьте размер данных на локальном диске. Из приведенного выше следует, что размер на диске для миллионов строк составляет 36.42 MiБ. Эти данные должны храниться в S3, а не на локальном диске. Запрос выше также показывает, где на локальном диске хранятся данные и метаданные. Проверьте местные данные:
Проверьте данные в S3 в каждой корзине S3 (итоги не показаны, но в обеих корзинах после вставок хранится примерно 36 МБ):


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