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

1. Выбор правильной стратегии загрузки

СтратегияЛучше всего подходит дляЗадержкаМасштабируемость
Пакетные вставки (INSERT INTO)Низкий объем данных, периодическая загрузка данныхСредняяВысокая
Kafka Engine (Потоковые данные)Вставка событий в реальном времениНизкаяОчень высокая
RabbitMQ EngineПотоковые события на основе сообщенийНизкаяСредняя
S3 EngineЗагрузка больших наборов данных из S3ВысокаяОчень высокая
HTTP API (INSERT FORMAT JSONEachRow)IoT и веб-приложенияНизкаяСредняя
Native TCP Protocol (clickhouse-client)Высокоскоростная структурированная загрузка данныхНизкаяВысокая

2. Стратегия 1: Пакетные вставки (лучше всего подходит для периодической загрузки данных)

📌 Кейс: Загрузка данных пакетами каждую секунду/минуту.

Оптимизировано для колонночного хранения, но маленькие вставки могут создавать слишком много частей.

Как использовать пакетные вставки

INSERT INTO events (event_id, event_time, user_id)
VALUES (1, now(), 1001), (2, now(), 1002);

🔹 Советы по оптимизации:

  • Используйте пакетные вставки вместо частых маленьких вставок для уменьшения фрагментации:
INSERT INTO events FORMAT TSV
1   2024-02-08 10:00:00   1001
2   2024-02-08 10:01:00   1002
3   2024-02-08 10:02:00   1003
  • Увеличьте min_insert_block_size_rows для уменьшения мелких частей:
SET min_insert_block_size_rows = 100000;
  • Если существует слишком много маленьких вставок, выполните слияние частей вручную:
OPTIMIZE TABLE events FINAL;
 

🚀 Преимущества:

✔️ Легко внедряется

✔️ Высокая скорость загрузки (миллионы строк в секунду)

✔️ Лучше всего подходит для структурированной, периодической загрузки данных

⚠️ Недостатки: ❌ Не подходит для потоковой загрузки в реальном времени

❌ Слишком много маленьких вставок может замедлить производительность

3. Стратегия 2: Kafka Engine (лучше всего подходит для потоковых данных в реальном времени)

📌 Кейс: Потоковая загрузка данных в реальном времени из Kafka.

Очень масштабируемая, событийно-управляемая загрузка данных.

Как использовать Kafka для потоковой загрузки данных

1️⃣ Создайте таблицу с использованием Kafka Engine:

CREATE TABLE kafka_logs (
    event_id UInt32,
    event_time DateTime,
    user_id UInt32
) ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka-broker:9092',
    kafka_topic_list = 'clickhouse-events',
    kafka_format = 'JSONEachRow',
    kafka_group_name = 'clickhouse_group';

2️⃣ Создайте таблицу MergeTree для хранения данных из Kafka:

CREATE TABLE events_local (
    event_id UInt32,
    event_time DateTime,
    user_id UInt32
) ENGINE = MergeTree()
ORDER BY event_time;
 

3️⃣ Автоматически переместите данные из Kafka в ClickHouse:

CREATE MATERIALIZED VIEW kafka_to_events
TO events_local AS
SELECT * FROM kafka_logs;
 

🚀 Преимущества: ✔️ Реальная загрузка данных в реальном времени

✔️ Нулевая задержка (поскольку данные непрерывно записываются)

✔️ Масштабируется до миллионов событий в секунду

⚠️ Недостатки: ❌ Требуется настройка Kafka

❌ Может быть сложным для маломасштабных приложений

4. Стратегия 3: RabbitMQ Engine (лучше всего подходит для событийных приложений)

📌 Кейс: Потоковая загрузка данных на основе сообщений, логирование в реальном времени.

Идеально подходит, когда Kafka недоступна или используются очереди сообщений.

Как использовать RabbitMQ для потоковой загрузки данных

1️⃣ Создайте таблицу с использованием RabbitMQ Engine:

CREATE TABLE rabbitmq_logs (
    event_id UInt32,
    event_time DateTime,
    user_id UInt32
) ENGINE = RabbitMQ
SETTINGS rabbitmq_host_port = 'rabbitmq:5672',
    rabbitmq_exchange_name = 'clickhouse-exchange',
    rabbitmq_format = 'JSONEachRow',
    rabbitmq_queue_base = 'clickhouse-queue';

2️⃣ Создайте таблицу MergeTree для хранения данных:

CREATE TABLE events_local (
    event_id UInt32,
    event_time DateTime,
    user_id UInt32
) ENGINE = MergeTree()
ORDER BY event_time;

3️⃣ Автоматически сохраните данные из RabbitMQ:

CREATE MATERIALIZED VIEW rabbitmq_to_events
TO events_local AS
SELECT * FROM rabbitmq_logs;

🚀 Преимущества:

✔️ Лучше всего подходит для событийных приложений

✔️ Работает с существующими очередями сообщений

✔️ Низкая задержка

⚠️ Недостатки: ❌ Медленнее, чем Kafka для приложений с очень высокой пропускной способностью

❌ Требуется настройка RabbitMQ

5. Стратегия 4: HTTP API (лучше всего подходит для IoT и веб-приложений)

📌 Кейс: IoT, мобильные или веб-приложения, которые отправляют данные в формате JSON в реальном времени.

Быстрая и простая загрузка через API.

Как вставить данные через HTTP API

curl -X POST 'http://clickhouse:8123/?query=INSERT INTO events FORMAT JSONEachRow' \
--data-binary @- << EOF
{"event_id":1, "event_time":"2024-02-08 10:00:00", "user_id":1001}
{"event_id":2, "event_time":"2024-02-08 10:01:00", "user_id":1002}
EOF

🚀 Преимущества:

✔️ Легко внедряется (без дополнительных зависимостей)

✔️ Хорошо работает для низкой и средней пропускной способности

✔️ Подходит для серверных приложений

⚠️ Недостатки: ❌ Не оптимизировано для очень высокой пропускной способности

❌ HTTP накладные расходы могут замедлить большую загрузку

6. Стратегия 5: Использование S3 Engine для загрузки больших данных

📌 Кейс: Загрузка данных в реальном времени или пакетных данных из AWS S3.

Хорошо работает для масштабной аналитики и холодного хранения.

Как использовать S3 Engine для загрузки данных

1️⃣ Создайте таблицу для чтения данных из S3:

CREATE TABLE s3_events (
    event_id UInt32,
    event_time DateTime,
    user_id UInt32
) ENGINE = S3('https://my-bucket.s3.amazonaws.com/events.csv', 'CSV');
 

2️⃣ Запросите данные непосредственно из S3:

SELECT * FROM s3_events WHERE event_time >= now() - INTERVAL 1 HOUR;

🚀 Преимущества:

✔️ Бесконечная масштабируемость

✔️ Снижает затраты на хранение

⚠️ Недостатки:

❌ Высокая задержка запросов по сравнению с прямой загрузкой

❌ Зависимость от доступности S3

🚀 Итоговое заключение

Стратегия загрузкиЛучше всего подходит для
Пакетные вставкиПериодическая загрузка структурированных данных
Kafka EngineПотоковая загрузка данных с высокой пропускной способностью
RabbitMQ EngineСобытийная потоковая загрузка в реальном времени
HTTP APIIoT и мобильные/веб-приложения
S3 EngineМасштабная загрузка данных в хранилище