Интеграция 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.
Каждая запись в нашем наборе данных такси содержит поездку на такси. Эти анонимизированные данные состоят из 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()
. Обратите внимание, как результирующий ID партиции ссылается на имя файла. Это приведет к созданию десяти файлов с числовым суффиксом, например trips_0.csv.lz4
, trips_1.csv.lz4
и т.д.:
В качестве альтернативы мы можем сослаться на поле в данных. Для этого набора данных payment_type
предоставляет естественный ключ партиционирования с кардинальностью 5.
Использование кластеров
Все вышеуказанные функции ограничены выполнением на одном узле. Скорость чтения будет линейно увеличиваться с количеством ядер ЦПУ, пока не будут исчерпаны другие ресурсы (обычно сеть), что позволит пользователям вертикально масштабироваться. Тем не менее, этот подход имеет свои ограничения. Хотя пользователи могут уменьшить нагрузку на некоторые ресурсы, вставляя в распределенную таблицу при выполнении запроса 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
позволяют выполнять разовые запросы на данные, хранящиеся в 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
поддерживает параллельные чтения. Запись поддерживается только в том случае, если определение таблицы не содержит глобальных шаблонов. Таким образом, приведенная выше таблица будет блокировать записи.
Чтобы продемонстрировать записи, создайте таблицу, указывающую на записываемое ведро 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. Содержимое примерного файла показано ниже, предполагая установку с использованием deb-пакета.
Эти учетные данные будут использоваться для любых запросов, где указанная конечная точка является точным префиксным совпадением для запрашиваемого URL. Также обратите внимание на возможность в этом примере объявить заголовок авторизации как альтернативу ключам доступа и секретным ключам. Полный список поддерживаемых настроек можно найти здесь.
-
Пример выше подчеркивает доступность параметра конфигурации
use_environment_credentials
. Этот параметр конфигурации также может быть установлен глобально на уровнеs3
:Эта настройка включает попытку извлечь учетные данные S3 из окружения, что позволяет доступ через роли IAM. В частности, выполняется следующий порядок извлечения:
- Поиск переменных окружения
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
иAWS_SESSION_TOKEN
- Проверка в $HOME/.aws
- Временные учетные данные, полученные через Службу безопасности AWS Token Service — т.е. через 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 движок объединения использует два основных формата хранения: Широкий
и Компактный
. Хотя текущая реализация использует поведение по умолчанию 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. По мере старения данных, SLA для времени запросов возрастают, как и частота запросов. Этот "толстый хвост" данных может храниться на более медленном, менее производительном хранилище, таком как 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 Object Storage для получения дополнительной информации.
Чтения и Записи
Следующие заметки касаются реализации взаимодействия S3 с ClickHouse. Хотя это в основном информативно, это может помочь читателям при Оптимизации Производительности:
- По умолчанию максимальное количество потоков обработки запросов, используемых на любом этапе конвейера обработки запросов, равно количеству ядер. Некоторые этапы более восприимчивы к параллелизму, чем другие, поэтому это значение предоставляет верхнюю границу. Несколько этапов запроса могут выполняться одновременно, так как данные передаются с диска. Точное количество потоков, используемых для запроса, может превышать это количество. Измените это значение с помощью настройки max_threads.
- Чтения из S3 по умолчанию асинхронны. Это поведение определяется настройкой
remote_filesystem_read_method
, которая по умолчанию установлена в значениеthreadpool
. При обслуживании запроса ClickHouse читает гранулы по полосам. Каждая из этих полос потенциально содержит много колонок. Поток будет читать колонки для своих гранул по одной. Вместо того чтобы делать это синхронно, выполняется предзагрузка для всех колонок, прежде чем ждать данные. Это обеспечивает значительное улучшение производительности по сравнению с синхронными ожиданиями для каждой колонки. В большинстве случаев пользователи не будут менять эту настройку - см. Оптимизацию Производительности. - Записи выполняются параллельно, с максимальным количеством 100 потоков записи файлов одновременно.
max_insert_delayed_streams_for_parallel_write
, который по умолчанию имеет значение 1000, управляет количеством S3 blob'ов, записываемых параллельно. Поскольку буфер необходим для каждого файла, который записывается (~1 МБ), это эффективно ограничивает потребление памяти для INSERT. В сценариях с низкой памятью сервера может быть целесообразно уменьшить это значение.
Использование S3 Object Storage в качестве диска ClickHouse
Если вам нужны пошаговые инструкции по созданию ведер и роли IAM, разверните Создание ведер S3 и роли IAM и следуйте инструкциям:
Создание S3 корзин и IAM пользователя
Эта статья демонстрирует основы настройки IAM пользователя AWS, создания S3 корзины и настройки ClickHouse для использования корзины в качестве S3 диска. Вам следует работать с командой безопасности, чтобы определить использующиеся разрешения, и рассматривать их как отправную точку.
Создание AWS IAM пользователя
В этой процедуре мы будем создавать учетную запись сервисного пользователя, а не пользователя для входа.
-
Войдите в консоль управления AWS IAM.
-
В разделе "пользователи" выберите Добавить пользователей

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

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

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

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

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

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

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

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

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

-
Выберите ссылку, скопируйте 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 на Linux с директориями ClickHouse по умолчанию.
- Создайте новый файл в директории
config.d
ClickHouse для хранения конфигурации хранения.
- Добавьте следующее для конфигурации хранения; заменяя путь ведра, ключ доступа и секретные ключи с предыдущих шагов.
Теги s3_disk
и s3_cache
внутри тега <disks>
являются произвольными метками. Их можно задать другими именами, но та же метка должна быть использована в теге <disk>
под тегом <policies>
, чтобы ссылаться на диск.
Тег <S3_main>
также произволен и является именем политики, которая будет использоваться в качестве идентификатора целевого хранилища при создании ресурсов в ClickHouse.
Показанная выше конфигурация предназначена для версии ClickHouse 22.8 или выше, если вы используете более старую версию, пожалуйста, обратитесь к документации по хранению данных.
Дополнительную информацию о использовании S3 смотрите в Руководстве по интеграциям: S3 Backed MergeTree.
- Обновите владельца файла на пользователя и группу
clickhouse
.
- Перезагрузите экземпляр ClickHouse, чтобы изменения вступили в силу.
Тестирование
- Войдите с помощью клиента ClickHouse, например, следующим образом:
- Создайте таблицу, указав новую политику хранения S3.
- Проверьте, что таблица была создана с правильной политикой.
- Вставьте тестовые строки в таблицу.
- Просмотрите строки.
- В консоли AWS перейдите к ведрам и выберите новое ведро и папку. Вы должны увидеть что-то похожее на следующее:

Репликация одного шард по двум регионам AWS с использованием S3 Object Storage
Объектное хранилище используется по умолчанию в 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 и следуйте инструкциям:
Создание S3 корзин и IAM пользователя
Эта статья демонстрирует основы настройки IAM пользователя AWS, создания S3 корзины и настройки ClickHouse для использования корзины в качестве S3 диска. Вам следует работать с командой безопасности, чтобы определить использующиеся разрешения, и рассматривать их как отправную точку.
Создание AWS IAM пользователя
В этой процедуре мы будем создавать учетную запись сервисного пользователя, а не пользователя для входа.
-
Войдите в консоль управления AWS IAM.
-
В разделе "пользователи" выберите Добавить пользователей

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

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

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

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

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

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

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

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

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

-
Выберите ссылку, скопируйте 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
.
Эта настройка должна быть ложной по двум причинам: 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 MiB. Это должно быть на S3, а не на локальном диске. Запрос выше также говорит нам, где на локальном диске хранятся данные и метаданные. Проверьте локальные данные:
Проверьте данные S3 в каждом ведре S3 (итоги не показаны, но в каждом ведре примерно 36 MiB хранятся после вставок):


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