Интеграция S3 с ClickHouse
Вы можете загружать данные из S3 в ClickHouse, а также использовать S3 как целевое хранилище для экспорта, что позволяет интегрироваться с архитектурами озёр данных (Data Lake). Кроме того, S3 может обеспечивать уровни «холодного» хранилища и помогать в разделении хранения и вычислительных ресурсов. В следующих разделах мы используем набор данных о такси Нью‑Йорка, чтобы продемонстрировать процесс переноса данных между S3 и ClickHouse, а также определить ключевые параметры конфигурации и дать рекомендации по оптимизации производительности.
Табличные функции S3
Табличная функция s3 позволяет читать и записывать файлы в хранилище, совместимое с S3, и из него. Общий вид синтаксиса следующий:
где:
- path — URL бакета с путем к файлу. Поддерживаются следующие подстановочные символы в режиме только для чтения:
*,?,{abc,def}и{N..M}, гдеN,M— числа,'abc','def'— строки. Для получения дополнительной информации см. документацию по использованию подстановочных шаблонов в path. - 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. Для этого потребуются соответствующие права доступа. Мы передаём необходимые учётные данные в запросе, но для других вариантов см. страницу Managing Credentials.
В простом примере ниже мы используем табличную функцию в качестве пункта назначения, а не источника. Здесь мы передаём поток из 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 файла или набора файлов. Поддерживает следующие шаблоны (wildcards) в режиме только для чтения:*,?,{'abc','def'}и{N..M}, где N, M — числа, abc, def — строки. Для получения дополнительной информации см. Wildcards In Path.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 — это распределённая таблица. Хотя эта таблица использует кластер events, согласованность узлов, используемых для чтения и записи, не является обязательной:
Вставки будут выполняться на узле‑инициаторе. При этом чтение будет происходить на каждом узле, а полученные строки будут перенаправляться к инициатору для распределения. В сценариях с высокой пропускной способностью это может стать узким местом. Чтобы решить эту проблему, установите параметр 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. Вы можете использовать их для аутентификации запросов. Параметр является необязательным. Если учетные данные не указаны, используются значения из конфигурационного файла. Для получения дополнительной информации см. раздел Managing credentials.compression— тип сжатия. Поддерживаемые значения: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. Параметр является необязательным. По умолчанию тип сжатия автоматически определяется по расширению файла.
Чтение данных
В следующем примере мы создаём таблицу trips_raw, используя первые десять TSV‑файлов, расположенных в S3‑бакете https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/. Каждый из них содержит по 1 000 000 строк:
Обратите внимание на использование шаблона {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-пакета.
Эти учетные данные будут использоваться для любых запросов, где указанный выше endpoint является точным префиксным совпадением запрашиваемого URL. Также обратите внимание на возможность в этом примере задать заголовок авторизации как альтернативу access- и secret-ключам. Полный список поддерживаемых настроек можно найти здесь.
-
Приведенный выше пример показывает наличие параметра конфигурации
use_environment_credentials. Этот параметр конфигурации также может быть задан глобально на уровнеs3:Эта настройка включает попытку получить учетные данные S3 из окружения, тем самым позволяя доступ через IAM-роли. В частности, выполняется следующий порядок получения:
- Поиск значений переменных окружения
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYиAWS_SESSION_TOKEN. - Проверка в каталоге $HOME/.aws.
- Получение временных учетных данных через AWS Security 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.
- Эти же настройки также могут быть заданы для конкретного endpoint с использованием того же правила префиксного совпадения.
- Поиск значений переменных окружения
Оптимизация производительности
Информацию об оптимизации чтения и вставки данных с использованием функции S3 см. в специальном руководстве по производительности.
Настройка хранилища S3
Внутри ClickHouse семейство MergeTree использует два основных формата хранения: 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. Однако с точки зрения возможностей управления данными и производительности они ограничены. Не поддерживаются первичные индексы, отсутствует кеширование, а вставки файлов (file inserts) необходимо организовывать пользователю самостоятельно.
ClickHouse рассматривает S3 как привлекательное решение для хранения данных, особенно когда производительность запросов к «более холодным» данным менее критична, а пользователи стремятся разделить хранение и вычисления. Чтобы упростить это, предусмотрена поддержка использования S3 как хранилища для движка MergeTree. Это позволит вам сочетать масштабируемость и экономичность S3 с производительностью вставки и выполнения запросов движка MergeTree.
Уровни хранения
Тома хранения ClickHouse позволяют абстрагировать физические диски от движка таблицы MergeTree. Любой отдельный том может состоять из упорядоченного набора дисков. Хотя в первую очередь это даёт возможность использовать несколько блочных устройств для хранения данных, такая абстракция также позволяет применять и другие типы хранилищ, включая S3. Части данных ClickHouse могут перемещаться между томами и распределяться по ним в соответствии с политиками хранения, формируя тем самым концепцию уровней хранения.
Уровни хранения позволяют реализовывать архитектуры «горячее–холодное» хранилище, когда наиболее свежие данные, которые обычно и запрашиваются чаще всего, занимают лишь небольшой объём на высокопроизводительном хранилище, например NVMe SSD. По мере устаревания данных SLA по времени выполнения запросов увеличиваются, как и их суммарная частота. Этот «длинный хвост» данных может храниться на более медленном, менее производительном хранилище, таком как HDD, или объектном хранилище, таком как S3.
Создание диска
Чтобы использовать бакет S3 в качестве диска, сначала необходимо объявить его в конфигурационном файле ClickHouse. Можно либо расширить config.xml, либо, что предпочтительнее, добавить новый файл в каталог conf.d. Пример объявления диска S3 приведён ниже:
Полный список настроек, относящихся к этому описанию диска, можно найти здесь. Обратите внимание, что учетными данными можно управлять здесь же, используя те же подходы, которые описаны в разделе Managing credentials, то есть параметр use_environment_credentials можно установить в true в приведённом выше блоке настроек, чтобы использовать роли IAM.
Создание политики хранения
После настройки этот «диск» может использоваться томом хранения, объявленным в политике. В примере ниже предполагается, что S3 — наш единственный тип хранилища. Здесь не рассматриваются более сложные архитектуры «горячего» и «холодного» хранения, где данные могут перемещаться на основе TTL и степени заполнения.
Создание таблицы
Если вы настроили диск на использование бакета с правами на запись, вы сможете создать таблицу, как показано в примере ниже. Для краткости мы используем подмножество столбцов датасета NYC Taxi и записываем данные напрямую в таблицу на диске 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 читает гранулы полосами (stripes). Каждая такая полоса потенциально содержит множество столбцов. Поток будет поочерёдно читать столбцы для своих гранул. Вместо того чтобы выполнять это синхронно, предварительно инициируется чтение (prefetch) всех столбцов до ожидания данных. Это даёт значительный прирост производительности по сравнению с синхронным ожиданием для каждого столбца. В большинстве случаев пользователям не потребуется изменять эту настройку — см. раздел Optimizing for Performance. - Запись выполняется параллельно, с максимум 100 одновременных потоков записи файлов. Параметр
max_insert_delayed_streams_for_parallel_write, который по умолчанию имеет значение 1000, управляет количеством S3 blob-объектов, записываемых параллельно. Поскольку для каждого записываемого файла требуется буфер (~1 МБ), это фактически ограничивает объём памяти, потребляемой операцией INSERT. В сценариях с ограниченным объёмом памяти сервера может иметь смысл уменьшить это значение.
Использование объектного хранилища S3 как диска ClickHouse
Если вам нужны пошаговые инструкции по созданию бакетов и роли IAM, разверните раздел Create S3 buckets and an IAM role и следуйте инструкциям:
Создание корзин S3 и пользователя IAM
В данной статье рассматриваются основы настройки пользователя AWS IAM, создания корзины S3 и конфигурирования ClickHouse для использования корзины в качестве диска S3. Согласуйте с командой безопасности используемые разрешения; приведённые здесь настройки следует рассматривать как отправную точку.
Создание пользователя AWS IAM
В данной процедуре создаётся служебная учётная запись, а не пользователь для входа в систему.
-
Войдите в консоль управления AWS IAM.
-
В разделе «users» выберите Add users

- Введите имя пользователя, установите тип учётных данных Access key - Programmatic access и выберите Next: Permissions

- Не добавляйте пользователя ни в одну группу; выберите Next: Tags

- Если не требуется добавлять теги, выберите Next: Review

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

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

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

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

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

- Нажмите Create Bucket в нижней части страницы

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

- Нажмите Create folder

- Введите имя папки, которая будет использоваться в качестве целевой для диска S3 ClickHouse, и нажмите Create folder

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

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

- Перейдите на вкладку Permissions и нажмите кнопку Edit в разделе Bucket Policy

- Добавьте политику корзины, пример приведен ниже:
| Параметр | Описание | Пример значения |
|---|---|---|
| Version | Версия интерпретатора политики, оставьте без изменений | 2012-10-17 |
| Sid | Определяемый пользователем идентификатор политики | abc123 |
| Effect | Будут ли запросы пользователя разрешены или отклонены | Allow |
| Principal | Учетные записи или пользователи, которым будет предоставлен доступ | arn:aws:iam::921234567898:user/mars-s3-user |
| Action | Какие операции разрешены для корзины | s3:* |
| Resource | Для каких ресурсов в корзине будут разрешены операции | "arn:aws:s3:::mars-doc-test", "arn:aws:s3:::mars-doc-test/*" |
Рекомендуется согласовать используемые разрешения с вашей командой безопасности; приведенные настройки можно использовать в качестве отправной точки. Дополнительную информацию о политиках и настройках см. в документации AWS: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html
- Сохраните конфигурацию политики.
Настройка ClickHouse для использования бакета S3 в качестве диска
Следующий пример основан на Deb-пакете для Linux, установленном как служба с каталогами ClickHouse по умолчанию.
- Создайте новый файл в каталоге
config.dClickHouse для хранения конфигурации хранилища.
- Для настройки хранилища добавьте следующее, подставив путь к бакету, ключ доступа и секретный ключ, полученные на предыдущих шагах
Идентификаторы s3_disk и s3_cache внутри тега <disks> являются произвольными. Их можно задать по‑другому, но тот же идентификатор должен использоваться в теге <disk> в разделе <policies>, чтобы ссылаться на диск.
Тег <S3_main> также является произвольным и представляет собой имя политики, которая будет использоваться как идентификатор целевого хранилища при создании ресурсов в ClickHouse.
Показанная выше конфигурация предназначена для ClickHouse версии 22.8 и выше. Если вы используете более старую версию, обратитесь к разделу документации storing data.
Дополнительная информация об использовании S3: Руководство по интеграциям: S3 Backed MergeTree
- Измените владельца файла на пользователя и группу
clickhouse.
- Перезапустите экземпляр ClickHouse, чтобы изменения вступили в силу.
Тестирование
- Войдите в систему с помощью клиента ClickHouse, например, следующей командой:
- Создайте таблицу, указав новую политику хранения в S3
- Убедитесь, что таблица создана с правильной политикой хранения
- Добавьте тестовые строки в таблицу
- Просмотрите строки
- В консоли AWS перейдите к разделу бакетов, выберите новый бакет и папку. Вы должны увидеть примерно следующее:

Репликация одного сегмента между двумя регионами AWS с использованием объектного хранилища S3
Объектное хранилище по умолчанию используется в ClickHouse Cloud, вам не нужно выполнять эту процедуру, если вы используете ClickHouse Cloud.
Планирование развертывания
Это руководство основано на развертывании двух узлов ClickHouse Server и трех узлов ClickHouse Keeper в AWS EC2. Хранилищем данных для серверов ClickHouse является S3. Для обеспечения аварийного восстановления используются два региона AWS, в каждом регионе размещены ClickHouse Server и бакет S3.
Таблицы ClickHouse реплицируются между двумя серверами, а следовательно, и между двумя регионами.
Установка программного обеспечения
Узлы ClickHouse Server
Обратитесь к инструкциям по установке при выполнении шагов развертывания на узлах ClickHouse Server.
Развертывание 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, раскройте раздел Create S3 buckets and an IAM role и выполните указанные шаги:
Создание корзин S3 и пользователя IAM
В данной статье рассматриваются основы настройки пользователя AWS IAM, создания корзины S3 и конфигурирования ClickHouse для использования корзины в качестве диска S3. Согласуйте с командой безопасности используемые разрешения; приведённые здесь настройки следует рассматривать как отправную точку.
Создание пользователя AWS IAM
В данной процедуре создаётся служебная учётная запись, а не пользователь для входа в систему.
-
Войдите в консоль управления AWS IAM.
-
В разделе «users» выберите Add users

- Введите имя пользователя, установите тип учётных данных Access key - Programmatic access и выберите Next: Permissions

- Не добавляйте пользователя ни в одну группу; выберите Next: Tags

- Если не требуется добавлять теги, выберите Next: Review

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

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

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

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

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

- Нажмите Create Bucket в нижней части страницы

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

- Нажмите Create folder

- Введите имя папки, которая будет использоваться в качестве целевой для диска S3 ClickHouse, и нажмите Create folder

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

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

- Перейдите на вкладку Permissions и нажмите кнопку Edit в разделе Bucket Policy

- Добавьте политику корзины, пример приведен ниже:
| Параметр | Описание | Пример значения |
|---|---|---|
| Version | Версия интерпретатора политики, оставьте без изменений | 2012-10-17 |
| Sid | Определяемый пользователем идентификатор политики | abc123 |
| Effect | Будут ли запросы пользователя разрешены или отклонены | Allow |
| Principal | Учетные записи или пользователи, которым будет предоставлен доступ | arn:aws:iam::921234567898:user/mars-s3-user |
| Action | Какие операции разрешены для корзины | s3:* |
| Resource | Для каких ресурсов в корзине будут разрешены операции | "arn:aws:s3:::mars-doc-test", "arn:aws:s3:::mars-doc-test/*" |
Рекомендуется согласовать используемые разрешения с вашей командой безопасности; приведенные настройки можно использовать в качестве отправной точки. Дополнительную информацию о политиках и настройках см. в документации 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 указывает идентификатор, который будет присвоен хосту, на котором используется конфигурационный файл. В приведённом ниже примере значение 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 прослушивает только локальный (loopback) адрес, поэтому это необходимо изменить. Это настраивается в /etc/clickhouse-server/config.d/. Ниже приведён пример, который настраивает ClickHouse и ClickHouse Keeper на прослушивание всех интерфейсов IPv4. См. документацию или файл конфигурации по умолчанию /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 (сводные итоги не показаны, но в обоих бакетах после вставок хранится примерно 36 MiB):


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