Интеграция 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()
. Обратите внимание, как идентификатор результирующей партиции ссылается на имя файла. Это приводит к созданию десяти файлов с числовым суффиксом, например trips_0.csv.lz4
, trips_1.csv.lz4
и т. д.:
В качестве альтернативы мы можем сослаться на поле в данных. Для этого набора данных payment_type
предоставляет естественный ключ партиционирования с кардинальностью 5.
Использование кластеров
Вышеупомянутые функции ограничены выполнением на одном узле. Скорость чтения будет линейно масштабироваться с количеством ядер CPU, пока не будут насыщены другие ресурсы (обычно сеть), что позволит пользователям вертикально масштабироваться. Однако этот подход имеет свои ограничения. Хотя пользователи могут снизить давление на ресурсы, вставляя данные в распределенную таблицу при выполнении запроса INSERT INTO SELECT
, это все же оставляет единственный узел для чтения, парсинга и обработки данных. Для решения этой проблемы и обеспечения масштабируемости чтения по горизонтали у нас есть функция s3Cluster.
Узел, который получает запрос, известен как инициатор, создает соединение с каждым узлом в кластере. Шаблон glob, определяющий, какие файлы нужно прочитать, разрешается в набор файлов. Инициатор распределяет файлы по узлам кластера, которые действуют как рабочие. Эти рабочие узлы, в свою очередь, запрашивают файлы для обработки по мере завершения чтения. Этот процесс обеспечивает возможность масштабирования чтения по горизонтали.
Функция s3Cluster
имеет тот же формат, что и варианты для одного узла, за исключением того, что требуется целевой кластер для обозначения рабочих узлов:
cluster_name
— Имя кластера, используемого для создания набора адресов и параметров соединения для удаленных и локальных серверов.source
— URL к файлу или набору файлов. Поддерживает следующие подстановочные знаки в режиме только для чтения:*
,?
,{'abc','def'}
и{N..M}
, где N, M — числа, abc, def — строки. Для получения дополнительной информации см. Подстановочные знаки в пути.access_key_id
иsecret_access_key
— Ключи, которые указывают учетные данные для использования с указанной конечной точкой. Необязательные.format
— формат файла.structure
— Структура таблицы. Формат 'column1_name column1_type, column2_name column2_type, ...'.
Как и в любых функциях s3
, учетные данные являются необязательными, если корзина небезопасна или вы определяете безопасность через окружение, например, IAM роли. В отличие от функции s3, однако, с 22.3.1 структура должна быть указана в запросе, т.е. схема не выводится автоматически.
Эта функция будет использоваться в большинстве случаев в рамках INSERT INTO SELECT
. В этом случае вы часто будете вставлять в распределенную таблицу. Мы иллюстрируем простой пример ниже, где trips_all является распределенной таблицей. Хотя эта таблица использует кластер событий, согласованность узлов, используемых для чтения и записи, не является обязательной:
Вставки будут происходить против инициатора узла. Это означает, что, хотя чтения происходят на каждом узле, результирующие строки будут направляться к инициатору для распределения. В сценах с высокой пропускной способностью это может привести к узкому месту. Чтобы решить этот вопрос, установите параметр parallel_distributed_insert_select для функции s3cluster
.
Движки таблиц S3
Хотя функции s3
позволяют выполнять запросы ad-hoc на данные, хранящиеся в S3, они являются синтаксически многословными. Движок таблицы S3
позволяет вам не указывать URL корзины и учетные данные снова и снова. Для решения этой проблемы ClickHouse предоставляет движок таблицы S3.
path
— URL корзины с путем к файлу. Поддерживает следующие подстановочные знаки в режиме только для чтения:*
,?
,{abc,def}
и{N..M}
, где N, M — числа, 'abc', 'def' — строки. Для получения дополнительной информации смотрите здесь.format
— формат файла.aws_access_key_id
,aws_secret_access_key
- Долговременные учетные данные для пользователя учетной записи AWS. Вы можете использовать их для аутентификации своих запросов. Параметр является необязательным. Если учетные данные не указаны, используются значения из файла конфигурации. Для получения дополнительной информации смотрите Управление учетными данными.compression
— Тип сжатия. Поддерживаемые значения: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. Параметр является необязательным. По умолчанию будет автоматически определен тип сжатия по расширению файла.
Чтение данных
В следующем примере мы создаем таблицу с именем trips_raw
, используя первые десять TSV файлов, расположенных в корзине https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/
. Каждый из этих файлов содержит по 1 миллиону строк:
Обратите внимание на использование шаблона {0..9}
для ограничения до первых десяти файлов. После создания мы можем запрашивать эту таблицу как любую другую таблицу:
Вставка данных
Движок таблицы S3
поддерживает параллельные чтения. Записи поддерживаются только в том случае, если определение таблицы не содержит шаблонов glob. Поэтому вышеуказанная таблица будет блокировать записи.
Чтобы продемонстрировать записи, создайте таблицу, которая указывает на записываемую корзину S3:
Обратите внимание, что строки могут быть вставлены только в новые файлы. Нет циклов слияния или операций разделения файлов. Как только файл написан, дальнейшие вставки будут завершены с ошибкой. У пользователей есть два варианта:
- Укажите настройку
s3_create_new_file_on_insert=1
. Это приведет к созданию новых файлов при каждой вставке. Числовой суффикс будет добавлен в конец каждого файла, который будет монотонно увеличиваться для каждой операции вставки. Для вышеуказанного примера последующая вставка вызовет создание файла trips_1.bin. - Укажите настройку
s3_truncate_on_insert=1
. Это приведет к усечению файла, т.е. он будет содержать только вновь вставленные строки после завершения.
Обе эти настройки по умолчанию установлены в 0 - таким образом, пользователю придется установить одну из них. s3_truncate_on_insert
будет иметь преимущество, если обе установлены.
Несколько заметок о движке таблицы S3
:
- В отличие от традиционной таблицы семейства
MergeTree
, удаление таблицыS3
не приведет к удалению основных данных. - Полные настройки для этого типа таблиц можно найти здесь.
- Обратите внимание на следующие ограничения при использовании этого движка:
- Запросы ALTER не поддерживаются.
- Операции SAMPLE не поддерживаются.
- Понятие индексов отсутствует, т.е. первичных или индексов пропуска.
Управление учетными данными
В предыдущих примерах мы передавали учетные данные в функции s3
или определении таблицы S3
. Хотя это может быть приемлемо для эпизодического использования, пользователи требуют менее явных механизмов аутентификации в производственной среде. Для решения этой проблемы ClickHouse предлагает несколько вариантов:
- Укажите детали соединения в config.xml или эквивалентном конфигурационном файле в разделе conf.d. Содержимое примера файла показано ниже, предполагая установку с использованием debian-пакета.
Эти учетные данные будут использоваться для любых запросов, где приведенный выше конечный пункт является точным префиксным соответствием для запрашиваемого URL. Также обратите внимание на возможность в этом примере объявить заголовок авторизации как альтернативу ключам доступа и секретным ключам. Полный список поддерживаемых настроек можно найти здесь.
- Пример выше подчеркивает наличие параметра конфигурации
use_environment_credentials
. Этот параметр конфигурации также может быть установлен глобально на уровнеs3
:
Эта настройка включает попытку получить S3 учетные данные из окружения, что позволяет доступ через IAM роли. В частности, выполняется следующий порядок извлечения:
- Поиск переменных окружения
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
иAWS_SESSION_TOKEN
- Проверка выполняется в $HOME/.aws
- Временные учетные данные получены через AWS 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.
- Эти же настройки также могут быть установлены для конкретной конечной точки, используя то же правило префиксного соответствия.
Оптимизация производительности
Для оптимизации чтения и вставки с использованием функции 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 является нашим единственным хранилищем. Это игнорирует более сложную архитектуру горячего-холодного хранения, где данные могут перемещаться в зависимости от сроков хранения и уровней заполнения.
Создание таблицы
Предполагая, что вы настроили диск для использования корзины с правами на запись, вы должны иметь возможность создать таблицу, как в примере ниже. В целях краткости мы используем подмножество столбцов такси Нью-Йорка и потоково передаем данные непосредственно в таблицу на основе 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 объектов, записываемых параллельно. Поскольку для каждого записываемого файла требуется буфер (~1MB), это эффективно ограничивает использование памяти при вставке. В сценариях с низкой памятью сервера может быть уместно понизить это значение.
Использование объектного хранилища S3 как диска для ClickHouse
Если вам нужны пошаговые инструкции по созданию корзин и роли IAM, то разверните Создание корзин S3 и роли IAM и следуйте этому примеру:
Создание корзин S3 и пользователя IAM
В этой статье рассматриваются основы настройки пользователя AWS IAM, создания корзины S3 и настройки ClickHouse для использования корзины в качестве диска S3. Вам следует работать с вашей командой безопасности, чтобы определить необходимые разрешения и рассматривать их как отправную точку.
Создание пользователя AWS IAM
В этой процедуре мы создадим пользователя сервисной учетной записи, а не пользователя с правом входа.
-
Войдите в консоль управления AWS IAM.
-
В разделе "пользователи" выберите Добавить пользователей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- Выберите флажок для новой папки и нажмите Копировать 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
. Пример:
Это также требует указания региона корзины в конфигурации:
Резервные копии
Существует возможность хранить резервную копию на диске, который мы создали выше: