Перейти к основному содержимому
Перейти к основному содержимому

Интеграция S3 с ClickHouse

Вы можете вставлять данные из S3 в ClickHouse, а также использовать S3 в качестве места экспорта, что позволяет взаимодействовать с архитектурами "Озеро данных". Более того, S3 может предоставлять уровни "холодного" хранения и помогать отделять хранение и вычисления. В следующих разделах мы используем набор данных такси Нью-Йорка, чтобы продемонстрировать процесс перемещения данных между S3 и ClickHouse, а также выявить ключевые параметры конфигурации и предложить советы по оптимизации производительности.

Табличные функции S3

Табличная функция s3 позволяет вам читать и записывать файлы из и в совместимое с S3 хранилище. Основной синтаксис для этой функции:

где:

  • path — URL корзины с путем к файлу. Поддерживает следующие подстановочные символы в режиме только для чтения: *, ?, {abc,def} и {N..M}, где N, M — числа, 'abc', 'def' — строки. Дополнительную информацию смотрите в документации по использованию подстановочных символов в пути.
  • format — формат файла.
  • structure — Структура таблицы. Формат 'column1_name column1_type, column2_name column2_type, ...'.
  • compression — Параметр является необязательным. Поддерживаемые значения: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. По умолчанию будет автоматически определен формат сжатия по расширению файла.

Использование подстановочных символов в выражении пути позволяет ссылаться на несколько файлов и открывает возможности для параллелизма.

Подготовка

Перед созданием таблицы в ClickHouse вам может понадобиться сначала подробнее ознакомиться с данными в корзине S3. Вы можете сделать это непосредственно из ClickHouse, используя оператор DESCRIBE:

Результат выполнения оператора DESCRIBE TABLE должен показать, как ClickHouse автоматически определит эти данные, как они выглядят в корзине S3. Обратите внимание, что он также автоматически распознает и распаковывает формат сжатия gzip:

Чтобы взаимодействовать с нашими наборами данных на основе S3, мы подготавливаем стандартную таблицу MergeTree в качестве нашего места назначения. Оператор ниже создает таблицу с именем trips в базе данных по умолчанию. Обратите внимание, что мы решили изменить некоторые из типов данных, как было определено выше, особенно чтобы не использовать Nullable() модификатор типа данных, который может привести к излишнему хранилищу данных и дополнительным накладным расходам на производительность:

Обратите внимание на использование партиционирования по полю pickup_date. Обычно ключ партиционирования используется для управления данными, но позже мы будем использовать этот ключ для параллелизации записей в S3.

Каждая запись в нашем наборе данных такси содержит одну поездку на такси. Эти анонимные данные состоят из 20 миллионов записей, сжатых в корзине S3 https://datasets-documentation.s3.eu-west-3.amazonaws.com/ в папке nyc-taxi. Данные находятся в формате TSV с примерно 1 миллионом строк в файле.

Чтение данных из S3

Мы можем запрашивать данные S3 как источник без необходимости сохранения в ClickHouse. В следующем запросе мы выбираем 10 строк. Обратите внимание на отсутствие учетных данных здесь, так как корзина общедоступна:

Обратите внимание, что нам не нужно перечислять столбцы, так как формат TabSeparatedWithNames кодирует имена столбцов в первой строке. Другие форматы, такие как CSV или TSV, будут возвращать автоматически сгенерированные столбцы для этого запроса, например, c1, c2, c3 и т. д.

Запросы также поддерживают виртуальные колонки, такие как _path и _file, которые предоставляют информацию о пути к корзине и имени файла соответственно. Например:

Подтвердите количество строк в этом образцовом наборе данных. Обратите внимание на использование подстановочных символов для расширения файлов, так что мы рассматриваем все двадцать файлов. Этот запрос займет около 10 секунд, в зависимости от количества ядер на экземпляре ClickHouse:

Хотя это полезно для выборки данных и выполнения исследовательских запросов, чтение данных непосредственно из S3 не является чем-то, что вы хотите делать регулярно. Когда станет время серьезно заняться этим, импортируйте данные в таблицу MergeTree в ClickHouse.

Использование clickhouse-local

Программа clickhouse-local позволяет вам выполнять быструю обработку на локальных файлах без развертывания и настройки сервера ClickHouse. Любые запросы, использующие табличную функцию s3, могут выполняться с помощью этого утилиты. Например:

Вставка данных из S3

Чтобы использовать все возможности ClickHouse, мы следующий шаг — чтение и вставка данных в наш экземпляр. Мы комбинируем нашу функцию s3 с простым оператором INSERT, чтобы достичь этого. Обратите внимание, что нам не нужно перечислять столбцы, так как наша целевая таблица предоставляет необходимую структуру. Это требует, чтобы столбцы появлялись в том порядке, который указан в операторе DDL таблицы: столбцы сопоставляются согласно их позиции в операторе SELECT. Вставка всех 10 млн строк может занять несколько минут в зависимости от экземпляра ClickHouse. Ниже мы вставляем 1 млн строк, чтобы обеспечить оперативный отклик. Настройте оператор LIMIT или выбор столбцов для импорта поднаборов по мере необходимости:

Удаленная вставка с использованием ClickHouse Local

Если политики сетевой безопасности мешают вашему кластеру ClickHouse устанавливать исходящие соединения, вы можете попробовать вставить данные S3, используя clickhouse-local. В следующем примере мы читаем из корзины S3 и вставляем в ClickHouse, используя функцию remote:

примечание

Чтобы выполнить это через защищенное SSL-соединение, используйте функцию remoteSecure.

Экспорт данных

Вы можете записывать файлы в S3, используя табличную функцию s3. Для этого потребуются соответствующие разрешения. Мы передаем учетные данные, необходимые для запроса, но смотрите страницу Управление учетными данными для получения дополнительных вариантов.

В простом примере ниже мы используем табличную функцию в качестве назначения вместо источника. Здесь мы передаем 10 000 строк из таблицы trips в корзину, указывая сжатие lz4 и тип вывода CSV:

Обратите внимание на то, как формат файла определяется по расширению. Нам также не нужно указывать столбцы в функции s3 - это может быть определено из оператора SELECT.

Разделение больших файлов

Маловероятно, что вы захотите экспортировать свои данные в виде одного файла. Большинство инструментов, включая ClickHouse, добиваются более высокой производительности при чтении и записи в несколько файлов благодаря возможности параллелизма. Мы могли бы выполнить наш оператор INSERT несколько раз, нацеливаясь на поднабор данных. ClickHouse предлагает способ автоматического разделения файлов с использованием ключа PARTITION.

В следующем примере мы создаем десять файлов, используя модуль функции rand(). Обратите внимание, как результирующий идентификатор партиции указывается в имени файла. Это приводит к созданию десяти файлов с числовым суффиксом, например, trips_0.csv.lz4, trips_1.csv.lz4 и т. д.:

В качестве альтернативы мы можем ссылаться на поле в данных. Для этого набора данных поле payment_type предоставляет естественный ключ партиционирования с кардинальностью 5.

Использование кластеров

Указанные выше функции ограничены выполнением на одном узле. Скорости чтения будут масштабироваться линейно с ядрами CPU, пока не будут насыщены другие ресурсы (обычно сеть), что позволит пользователям вертикально масштабировать. Однако этот подход имеет свои ограничения. В то время как пользователи могут уменьшить нагрузку на ресурсы, вставляя данные в распределенную таблицу при выполнении запроса INSERT INTO SELECT, это всё равно оставляет один узел для чтения, разбора и обработки данных. Чтобы решить эту задачу и позволить нам горизонтально масштабировать чтения, у нас есть функция s3Cluster.

Узел, который получает запрос, известный как инициатор, создает соединение с каждым узлом в кластере. Шаблон glob, определяющий, какие файлы нужно читать, разрешается в набор файлов. Инициатор распределяет файлы между узлами в кластере, которые действуют как рабочие. Эти рабочие, в свою очередь, запрашивают файлы для обработки по мере завершения чтений. Этот процесс обеспечивает возможность масштабирования чтений по горизонтали.

Функция s3Cluster принимает тот же формат, что и варианты для одного узла, за исключением того, что требуется целевой кластер, чтобы обозначить рабочие узлы:

  • cluster_name — Имя кластера, которое используется для построения набора адресов и параметров соединения с удаленными и локальными серверами.
  • source — URL к файлу или набору файлов. Поддерживает следующие подстановочные символы в режиме только для чтения: *, ?, {'abc','def'} и {N..M}, где N, M — числа, abc, def — строки. Дополнительную информацию смотрите в подстановочных символах в пути.
  • access_key_id и secret_access_key — Ключи, которые указывают учетные данные для использования с данным конечным пунктом. Необязательные.
  • formatформат файла.
  • structure — Структура таблицы. Формат 'column1_name column1_type, column2_name column2_type, ...'.

Как и в случае с любыми функциями s3, учетные данные являются необязательными, если корзина небезопасна или вы определяете безопасность через окружение, например, IAM роли. Однако, в отличие от функции s3, структура должна быть указана в запросе начиная с версии 22.3.1, то есть схема не интерпретируется автоматически.

Эта функция будет использоваться в большинстве случаев как часть INSERT INTO SELECT. В этом случае вы часто будете вставлять распределенную таблицу. Мы иллюстрируем простой пример ниже, где trips_all является распределенной таблицей. Хотя эта таблица использует кластер событий, согласованность узлов, используемых для чтения и записи, не является обязательным условием:

Вставки будут выполняться против инициирующего узла. Это означает, что в то время как чтения будут выполняться на каждом узле, результирующие строки будут перенаправлены к инициирующему узлу для распределения. В сценариях с высокой пропускной способностью это может стать узким местом. Чтобы решить эту задачу, установите параметр parallel_distributed_insert_select для функции s3cluster.

Движки таблиц S3

Хотя функции s3 позволяют выполнять исследовательские запросы к данным, хранящимся в 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 - т.е. через API AssumeRole
    • Проверки учетных данных в переменных окружения ECS AWS_CONTAINER_CREDENTIALS_RELATIVE_URI или AWS_CONTAINER_CREDENTIALS_FULL_URI и AWS_ECS_CONTAINER_AUTHORIZATION_TOKEN.
    • Получение учетных данных через метаданные экземпляра Amazon EC2, предоставленные AWS_EC2_METADATA_DISABLED, если не установлено в true.
    • Эти же настройки также могут быть установлены для конкретного конечного пункта, с использованием того же правила совпадения префикса.

Оптимизация производительности

Для оптимизации чтения и вставки с использованием функции S3 смотрите специальное руководство по производительности.

Настройка S3 хранения

Внутренне, дерево слияния ClickHouse использует два основных формата хранения: Wide и Compact. Хотя текущая реализация использует поведение по умолчанию ClickHouse (управляемое с помощью настроек min_bytes_for_wide_part и min_rows_for_wide_part), мы ожидаем, что поведение будет расходиться для S3 в будущих обновлениях, например, с большим значением по умолчанию для min_bytes_for_wide_part, что будет способствовать более Compact формату и, таким образом, меньшему количеству файлов. Пользователи могут захотеть настроить эти параметры при использовании исключительно хранилища S3.

MergeTree на основе S3

Функции s3 и связанный движок таблиц позволяют нам запрашивать данные в S3, используя знакомый синтаксис ClickHouse. Однако, что касается функций управления данными и производительности, они ограничены. Нет поддержки первичных индексов, поддержки кеша, и управление вставками файлов необходимо выполнять пользователем.

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:

В зависимости от аппаратных характеристик эта последняя вставка 1M строк может занять несколько минут для выполнения. Вы можете подтвердить прогресс через таблицу system.processes. Не стесняйтесь увеличивать количество строк до предела 10M и исследовать некоторые образцы запросов.

Изменение таблицы

Иногда пользователям может потребоваться изменить политику хранения конкретной таблицы. Хотя это возможно, это связано с ограничениями. Новая целевая политика должна содержать все диски и объемы предыдущей политики, т.е. данные не будут мигрированы для удовлетворения изменения политики. При проверке этих ограничений объемы и диски будут идентифицированы по их именам, попытки нарушить это приведут к ошибке. Однако, предполагая, что вы используете предыдущие примеры, следующие изменения являются допустимыми.

Здесь мы повторно используем основной объем в нашей новой политике 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), это эффективно ограничивает потребление памяти при INSERT. В сценариях с низкой памятью на сервере может быть уместно уменьшить это значение.

Использование объектного хранилища S3 в качестве диска ClickHouse

Если вам нужны пошаговые инструкции для создания ведер и роли IAM, разверните Создать ведра S3 и роль IAM и следуйте инструкциям:

Create S3 buckets and an IAM user

This article demonstrates the basics of how to configure an AWS IAM user, create an S3 bucket and configure ClickHouse to use the bucket as an S3 disk. You should work with your security team to determine the permissions to be used, and consider these as a starting point.

Create an AWS IAM user

In this procedure, we'll be creating a service account user, not a login user.

  1. Log into the AWS IAM Management Console.

  2. In "users", select Add users

  1. Enter the user name and set the credential type to Access key - Programmatic access and select Next: Permissions
  1. Do not add the user to any group; select Next: Tags
  1. Unless you need to add any tags, select Next: Review
  1. Select Create User

    примечание

    The warning message stating that the user has no permissions can be ignored; permissions will be granted on the bucket for the user in the next section

  1. The user is now created; click on show and copy the access and secret keys.
примечание

Save the keys somewhere else; this is the only time that the secret access key will be available.

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

Create an S3 bucket

  1. In the S3 bucket section, select Create bucket
  1. Enter a bucket name, leave other options default
примечание

The bucket name must be unique across AWS, not just the organization, or it will emit an error.

  1. Leave Block all Public Access enabled; public access is not needed.
  1. Select Create Bucket at the bottom of the page
  1. Select the link, copy the ARN, and save it for use when configuring the access policy for the bucket.

  2. Once the bucket has been created, find the new S3 bucket in the S3 buckets list and select the link

  1. Select Create folder
  1. Enter a folder name that will be the target for the ClickHouse S3 disk and select Create folder
  1. The folder should now be visible on the bucket list
  1. Select the checkbox for the new folder and click on Copy URL Save the URL copied to be used in the ClickHouse storage configuration in the next section.
  1. Select the Permissions tab and click on the Edit button in the Bucket Policy section
  1. Add a bucket policy, example below:
примечание

You should work with your security team to determine the permissions to be used, consider these as a starting point. For more information on Policies and settings, refer to AWS documentation: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html

  1. Save the policy configuration.

Настройка ClickHouse для использования ведра S3 в качестве диска

Следующий пример основан на установленном пакете Linux Deb, запущенном как служба с каталогами ClickHouse по умолчанию.

  1. Создайте новый файл в каталоге config.d ClickHouse для хранения конфигурации хранилища.
  1. Добавьте следующее для конфигурации хранения; заменив путь к ведру, ключ доступа и секретные ключи из предыдущих шагов:
примечание

Теги s3_disk и s3_cache внутри тега <disks> являются произвольными метками. Их можно задать иначе, но та же метка должна использоваться в закладке <disk> под закладкой <policies>, чтобы ссылаться на диск. Тег <S3_main> также произволен и является именем политики, которая будет использоваться в качестве идентификатора целевого хранения при создании ресурсов в ClickHouse.

Вышеуказанная конфигурация предназначена для версии ClickHouse 22.8 или выше, если вы используете более старую версию, пожалуйста, ознакомьтесь с документацией по хранению данных.

Для получения дополнительной информации об использовании S3: Руководство по интеграциям: MergeTree с поддержкой S3

  1. Обновите владельца файла на пользователя и группу clickhouse:
  1. Перезапустите экземпляр ClickHouse, чтобы изменения вступили в силу.

Тестирование

  1. Войдите с помощью клиента ClickHouse, например, так:
  1. Создайте таблицу, указывая новую политику хранения S3:
  1. Убедитесь, что таблица была создана с правильной политикой:
  1. Вставьте тестовые строки в таблицу:
  1. Посмотрите строки:
  1. В консоли AWS перейдите к ведрам и выберите новое ведро и папку. Вы должны увидеть что-то похожее на следующее:

Репликация одного шарда между двумя регионами AWS с использованием объектного хранилища S3

подсказка

Объектное хранилище используется по умолчанию в ClickHouse Cloud, вы не должны следовать этой процедуре, если работаете в ClickHouse Cloud.

План развертывания

Этот учебник основан на развертывании двух узлов сервера ClickHouse и трех узлов ClickHouse Keeper в AWS EC2. Хранилище данных для серверов ClickHouse - это S3. Используются два региона AWS, каждый из которых содержит сервер ClickHouse и ведро S3, чтобы поддерживать восстановление после сбоев.

Таблицы ClickHouse реплицируются между двумя серверами, а значит, и между двумя регионами.

Установка ПО

Узлы сервера ClickHouse

Смотрите инструкции по установке, когда выполняете шаги по развертыванию на узлах сервера ClickHouse.

Развертывание ClickHouse

Разверните ClickHouse на двух хостах, в образцах конфигураций они называются chnode1, chnode2.

Разместите chnode1 в одном регионе AWS, а chnode2 во втором.

Развертывание ClickHouse Keeper

Разверните ClickHouse Keeper на трех хостах, в образцах конфигураций они называются keepernode1, keepernode2 и keepernode3. keepernode1 можно развернуть в том же регионе, что и chnode1, keepernode2 с chnode2, а keepernode3 в любом регионе, но в другой зоне доступности от узла ClickHouse в этом регионе.

Смотрите инструкции по установке, когда выполняете шаги по развертыванию на узлах ClickHouse Keeper.

Создание ведер S3

Создайте два ведра S3, по одному в каждом из регионов, где вы разместили chnode1 и chnode2.

Если вам нужны пошаговые инструкции для создания ведер и роли IAM, разверните Создать ведра S3 и роль IAM и следуйте инструкциям:

Create S3 buckets and an IAM user

This article demonstrates the basics of how to configure an AWS IAM user, create an S3 bucket and configure ClickHouse to use the bucket as an S3 disk. You should work with your security team to determine the permissions to be used, and consider these as a starting point.

Create an AWS IAM user

In this procedure, we'll be creating a service account user, not a login user.

  1. Log into the AWS IAM Management Console.

  2. In "users", select Add users

  1. Enter the user name and set the credential type to Access key - Programmatic access and select Next: Permissions
  1. Do not add the user to any group; select Next: Tags
  1. Unless you need to add any tags, select Next: Review
  1. Select Create User

    примечание

    The warning message stating that the user has no permissions can be ignored; permissions will be granted on the bucket for the user in the next section

  1. The user is now created; click on show and copy the access and secret keys.
примечание

Save the keys somewhere else; this is the only time that the secret access key will be available.

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

Create an S3 bucket

  1. In the S3 bucket section, select Create bucket
  1. Enter a bucket name, leave other options default
примечание

The bucket name must be unique across AWS, not just the organization, or it will emit an error.

  1. Leave Block all Public Access enabled; public access is not needed.
  1. Select Create Bucket at the bottom of the page
  1. Select the link, copy the ARN, and save it for use when configuring the access policy for the bucket.

  2. Once the bucket has been created, find the new S3 bucket in the S3 buckets list and select the link

  1. Select Create folder
  1. Enter a folder name that will be the target for the ClickHouse S3 disk and select Create folder
  1. The folder should now be visible on the bucket list
  1. Select the checkbox for the new folder and click on Copy URL Save the URL copied to be used in the ClickHouse storage configuration in the next section.
  1. Select the Permissions tab and click on the Edit button in the Bucket Policy section
  1. Add a bucket policy, example below:
примечание

You should work with your security team to determine the permissions to be used, consider these as a starting point. For more information on Policies and settings, refer to AWS documentation: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html

  1. Save the policy configuration.

Конфигурационные файлы будут размещены в /etc/clickhouse-server/config.d/. Вот пример конфигурационного файла для одного ведра, другое будет аналогично с тремя отличающимися выделенными строками:

примечание

Многие шаги в этом руководстве будут просить вас разместить конфигурационный файл в /etc/clickhouse-server/config.d/. Это стандартное местоположение в системах Linux для файлов переопределения конфигурации. Когда вы помещаете эти файлы в этот каталог, ClickHouse будет использовать их содержимое для переопределения стандартной конфигурации. Помещая эти файлы в каталог переопределений, вы избежите потери своей конфигурации во время обновления.

Настройка ClickHouse Keeper

При работе с ClickHouse Keeper в автономном режиме (отдельно от сервера ClickHouse) конфигурация представляет собой один XML файл. В этом учебнике файл находится по адресу /etc/clickhouse-keeper/keeper_config.xml. Все три сервера Keeper используют одну и ту же конфигурацию с одной разницей; <server_id>.

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

  1. Создайте бакет типа Directory
  2. Установите соответствующую политику бакета, чтобы предоставить все необходимые права вашему S3 пользователю (например, "Action": "s3express:*" для простого разрешения неограниченного доступа)
  3. При конфигурировании политики хранения пожалуйста укажите параметр region

Конфигурация хранения такая же, как и для обычного S3, и, например, может выглядеть следующим образом:

А затем создайте таблицу в новом хранилище:

Хранилище S3

Хранилище S3 также поддерживается, но только для путей Object URL. Пример:

Это также требует указания региона бакета в конфигурации:

Резервные копии

Возможно хранение резервной копии на диске, который мы создали выше: