Стратегия параллельной эксплуатации
- Минимальный риск: при одновременной работе обеих систем вы сохраняете доступ к существующим данным и панелям мониторинга, пока проверяете ClickStack и знакомите пользователей с новой системой.
- Естественное истечение срока хранения данных: большинство данных обсервабилити хранятся ограниченное время (обычно 30 дней или меньше), что позволяет выполнить плавный переход по мере удаления данных из Elastic по истечении срока хранения.
- Упрощённая миграция: не нужны сложные инструменты или процессы для переноса исторических данных между системами.
Миграция данныхВ разделе “Миграция данных” мы показываем подход к переносу важных данных из Elasticsearch в ClickHouse. Его не следует использовать для крупных наборов данных, так как он редко обеспечивает достаточную производительность: всё упирается в возможности Elasticsearch по эффективному экспорту, при этом поддерживается только формат JSON.
Этапы реализации
Настройте двойную ингестию
Настройте конвейер сбора данных так, чтобы он одновременно отправлял данные в Elastic и ClickStack.Способ реализации зависит от того, какие агенты вы сейчас используете для сбора данных, — см. “Миграция агентов”.Проверьте и сравните
- Выполните запросы к обеим системам, чтобы убедиться в согласованности данных
- Сравните производительность запросов и их результаты
- Перенесите панели мониторинга и оповещения в ClickStack. Сейчас это делается вручную.
- Убедитесь, что все критически важные панели мониторинга и оповещения в ClickStack работают должным образом
Постепенный переход
- По мере естественного истечения срока хранения данных в Elastic вы будете всё больше полагаться на ClickStack
- Когда вы убедитесь в надёжности ClickStack, можно будет начать перенаправлять запросы и панели мониторинга
Долгосрочное хранение
- Продолжайте использовать обе системы параллельно, пока в Elastic не истекут сроки хранения всех данных
- Возможности многоуровневого хранения в ClickStack помогают эффективно управлять долгосрочным хранением данных.
- Рассмотрите возможность использования materialized views для поддержки агрегированных или отфильтрованных исторических данных, позволяя при этом необработанным данным удаляться по истечении срока хранения.
Сроки миграции
- Хранение 30 дней: миграцию можно завершить в течение месяца.
- Более длительное хранение: продолжайте параллельную работу, пока данные не истекут в Elastic.
- Исторические данные: если это действительно необходимо, воспользуйтесь разделом Миграция данных, чтобы импортировать нужные исторические данные.
Перенос настроек
Рекомендуемые настройки
- ClickHouse Cloud: По умолчанию использует архитектуру с одним сегментом и несколькими репликами. Хранилище и вычислительные ресурсы масштабируются независимо, что делает её оптимальной для сценариев обсервабилити с непредсказуемым характером приёма данных и рабочими нагрузками с преобладанием чтения.
- ClickHouse OSS: В самоуправляемых развертываниях мы рекомендуем:
- Начинать с одного сегмента
- Масштабироваться вертикально, добавляя CPU и оперативную память
- Использовать многоуровневое хранение, чтобы расширить локальный диск с помощью S3-совместимого объектного хранилища
- Использовать
ReplicatedMergeTree, если требуется высокая доступность - Для отказоустойчивости одной реплики вашего сегмента обычно достаточно для рабочих нагрузок обсервабилити.
Когда требуется сегментирование
- Скорость приёма данных превышает возможности одного узла (обычно >500K строк/с)
- Вам нужна изоляция арендаторов или разделение данных по регионам
- Общий объём данных слишком велик для одного сервера, даже с объектным хранилищем
Хранение данных и TTL
TTL в таблицах MergeTree для управления сроком хранения данных. Политики TTL позволяют:
- Автоматически удалять устаревшие данные
- Перемещать более старые данные в холодное Объектное хранилище
- Хранить на быстром диске только свежие журналы, которые запрашиваются чаще всего
Миграция данных
- Небольшие справочные таблицы, используемые для обогащения данных (например, сопоставления пользователей, каталоги сервисов)
- Бизнес-данные, хранящиеся в Elasticsearch, которые нужно коррелировать с данными обсервабилити; SQL-возможности ClickHouse и интеграции с Business Intelligence упрощают сопровождение этих данных и выполнение запросов к ним по сравнению с более ограниченными возможностями запросов в Elasticsearch.
- Данные конфигурации, которые необходимо сохранить при миграции
Миграция схемы
Создайте таблицу в ClickHouse для индекса, переносимого из Elasticsearch. Вы можете сопоставить типы Elasticsearch с их эквивалентами в ClickHouse. Либо можно воспользоваться типом данных JSON в ClickHouse, который будет динамически создавать столбцы соответствующего типа по мере вставки данных.Рассмотрим следующий маппинг Elasticsearch для индекса, содержащего данныеsyslog:Маппинг Elasticsearch
Маппинг Elasticsearch
Схема ClickHouse
Схема ClickHouse
- Для представления вложенных структур вместо точечной нотации используются Tuple
- Использованы подходящие типы ClickHouse в соответствии с сопоставлением:
keyword→Stringdate→DateTimeboolean→UInt8long→Int64ip→Array(Variant(IPv4, IPv6)). Здесь мы используемVariant(IPv4, IPv6), поскольку поле содержит как значенияIPv4, так иIPv6.object→JSONдля объекта syslog, структура которого непредсказуема.
- Столбцы
host.ipиhost.macимеют явно указанный типArray, в отличие от Elasticsearch, где все типы представляют собой массивы. - Для эффективных запросов по времени добавляется
ORDER BYпо временной метке и имени хоста MergeTree, оптимальный для данных логов, используется в качестве движка
- Валидация данных – применение строгой схемы позволяет избежать риска взрывного роста числа столбцов за пределами явно заданных структур.
- Позволяет избежать риска лавинообразного роста числа столбцов: хотя тип JSON масштабируется потенциально до тысяч столбцов, где подстолбцы хранятся как отдельные столбцы, это может привести к лавинообразному росту числа файлов столбцов: создаётся чрезмерное количество таких файлов, что сказывается на производительности. Чтобы уменьшить этот риск, используемый в JSON тип Dynamic поддерживает параметр
max_dynamic_paths, который ограничивает число уникальных путей, сохраняемых в виде отдельных файлов столбцов. После достижения этого порога дополнительные пути сохраняются в общем файле столбца с использованием компактного кодированного формата, что позволяет сохранить производительность и эффективность хранения, одновременно поддерживая гибкую ингестию данных. Однако доступ к этому общему файлу столбца менее производителен. При этом JSON-столбец можно использовать с подсказками типов. Столбцы с “подсказками” обеспечивают ту же производительность, что и отдельные столбцы. - Более простая интроспекция путей и типов: хотя тип JSON поддерживает функции интроспекции, позволяющие определить выведенные типы и пути, статические структуры проще изучать, например, с помощью
DESCRIBE.
Как вариант, можно просто создать таблицу с одним столбцом
JSON.Мы указываем типы для столбцов
host.name и timestamp в определении JSON, поскольку используем их в ключе сортировки/первичном ключе. Это помогает ClickHouse понять, что в этом столбце не может быть NULL, а также определить, какие подстолбцы нужно использовать (для каждого типа их может быть несколько, поэтому иначе возникает неоднозначность).JSON только для динамических вложенных структур там, где это необходимо.Подробнее об использовании типа JSON в схемах и способах его эффективного применения см. в руководстве “Проектирование схемы”.Установите elasticdump
Мы рекомендуем использовать elasticdump для экспорта данных из Elasticsearch. Для работы этого инструмента требуется node, поэтому его следует установить на машине, имеющей сетевую доступность и к Elasticsearch, и к ClickHouse. Для большинства задач экспорта мы рекомендуем выделенный сервер как минимум с 4 ядрами и 16 ГБ оперативной памяти.elasticdump имеет несколько преимуществ для миграции данных:- Он напрямую взаимодействует с REST API Elasticsearch, обеспечивая корректный экспорт данных.
- Сохраняет согласованность данных в процессе экспорта с помощью API Point-in-Time (PIT), который создает согласованный снимок данных на определенный момент времени.
- Экспортирует данные напрямую в формате JSON, который можно передавать в клиент ClickHouse для вставки.
elastic dump в одной зоне доступности или в одном дата-центре, чтобы минимизировать исходящий сетевой трафик и добиться максимальной пропускной способности.Установите клиент ClickHouse
Убедитесь, что ClickHouse установлен на сервере, где находитсяelasticdump. Не запускайте сервер ClickHouse — для выполнения этих шагов нужен только клиент.Потоковая передача данных
Чтобы передавать данные между Elasticsearch и ClickHouse в потоковом режиме, используйте командуelasticdump, направляя вывод напрямую в клиент ClickHouse. Следующая команда вставляет данные в нашу хорошо организованную таблицу logs_system_syslog.elasticdump:type=data— ограничивает ответ только содержимым документов в Elasticsearch.input-index— наш входной индекс Elasticsearch.output=$— перенаправляет все результаты в stdout.- Флаг
sourceOnlyгарантирует, что поля метаданных будут исключены из ответа. - Флаг
searchAfterпозволяет использовать APIsearchAfterдля эффективной постраничной выборки результатов. pit=true— для обеспечения согласованности результатов между запросами с использованием point in time API.
Параметры нашего клиента ClickHouse здесь (кроме учетных данных):
max_insert_block_size=1000— клиент ClickHouse отправит данные, как только будет достигнуто это количество строк. Увеличение значения повышает пропускную способность ценой большего времени на формирование блока, а значит, и более позднего появления данных в ClickHouse.min_insert_block_size_bytes=0— отключает объединение блоков на сервере по размеру в байтах.min_insert_block_size_rows=1000— объединяет блоки от клиентов на стороне сервера. В данном случае мы задаем то же значение, что и дляmax_insert_block_size, чтобы строки появлялись сразу. Увеличьте его, чтобы повысить пропускную способность.query="INSERT INTO logs_system_syslog FORMAT JSONAsRow"— вставка данных в формате JSONEachRow. Это подходит для отправки данных в четко определенную схему, такую какlogs_system_syslog.
Ожидаемая пропускная способность — порядка тысяч строк в секунду.
Вставка в одну JSON-строкуЕсли выполняется вставка в один JSON-столбец (см. схему Подробнее см. в разделе “Чтение JSON как объекта”.
syslog_json выше), можно использовать ту же команду вставки. Однако вместо JSONEachRow необходимо указать формат JSONAsObject, например:Преобразование данных (необязательно)
Приведённые выше команды предполагают соответствие полей Elasticsearch столбцам ClickHouse в соотношении 1:1. Часто перед вставкой в ClickHouse данные Elasticsearch нужно отфильтровать и преобразовать.Это можно сделать с помощью табличной функцииinput, которая позволяет выполнять любой запрос SELECT к stdout.Предположим, мы хотим хранить только поля timestamp и hostname из ранее полученных данных. Схема ClickHouse:elasticdump в эту таблицу, можно просто использовать табличную функцию input, чтобы с помощью типа JSON динамически определить и выбрать нужные столбцы. Обратите внимание: этот запрос SELECT также может легко содержать фильтр.@timestamp необходимо экранировать, а также использовать входной формат JSONAsObject.