Kết hợp Kafka và ClickHouse: Xây dựng hệ thống xử lý dữ liệu thời gian thực hiệu suất cao

Vấn đề thực tiễn cần giải quyết

Hãy tưởng tượng bạn đang quản lý hệ thống thu thập dữ liệu bán hàng từ nhiều cửa hàng phân tán. Yêu cầu đặt ra là xử lý dữ liệu theo thời gian thực và hiển thị trên bảng điều khiển phân tích nâng cao.

ClickHouse nổi tiếng với tốc độ xử lý dữ liệu cực nhanh, nhưng việc ghi dữ liệu trực tiếp vào hệ thống này gặp nhiều thách thức kỹ thuật. Vấn đề cốt lõi nằm ở cơ chế quản lý "part" của ClickHouse - mỗi lần ghi dữ liệu sẽ tạo ra một part mới, dẫn đến hiện tượng "quá nhiều part" nếu không kiểm soát tốc độ ghi.

Giải pháp kết hợp Kafka và ClickHouse

Kafka đóng vai trò như bộ đệm dữ liệu trung gian, giúp điều tiết lưu lượng dữ liệu trước khi ghi vào ClickHouse. Có ba phương án triển khai chính:

  1. ClickHouse Kafka Engine: Triển khai trực tiếp kết nối Kafka-ClickHouse bằng engine tích hợp sẵn
  2. Kafka Connect: Sử dụng framework Kafka Connect để xử lý logic đồng bộ dữ liệu
  3. External Writer: Triển khai dịch vụ viết dữ liệu riêng biệt như DoubleCloud Transfer

Triển khai Kafka Engine trong ClickHouse

Ví dụ minh họa cấu hình kết nối Kafka:

-- Tạo bảng Kafka queue
CREATE TABLE kafka_data_queue ON CLUSTER '{cluster}' (
    event_time String,
    product_id UInt64,
    description String
) ENGINE = Kafka SETTINGS 
    kafka_broker_list = 'broker1:9092',
    kafka_topic_list = 'sales_data',
    kafka_group_name = 'clickhouse_group',
    kafka_format = 'JSONEachRow';

-- Bảng đích lưu trữ dữ liệu
CREATE TABLE sales_records ON CLUSTER '{cluster}' (
    topic String,
    offset UInt64,
    partition UInt64,
    event_time DateTime64,
    product_id UInt64,
    description String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/sales_records', '{replica}')
PARTITION BY toYYYYMM(event_time)
ORDER BY (topic, partition, offset);

-- Tạo materialized view
CREATE MATERIALIZED VIEW sales_mv TO sales_records AS
SELECT
    _topic AS topic,
    _offset AS offset,
    _partition AS partition,
    toDateTime64(parseDateTimeBestEffort(event_time), 6) AS event_time,
    product_id,
    description
FROM kafka_data_queue;

Triển khai External Writer với Terraform

Cấu hình parser JSON trong Terraform:

parser {
    json {
        schema {
            fields {
                field {
                    name = "event_time"
                    type = "datetime"
                }
                field {
                    name = "product_id"
                    type = "uint64"
                }
                field {
                    name = "description"
                    type = "utf8"
                }
            }
        }
        add_rest_column = true
    }
}

So sánh các phương án

  • Kafka Engine: Đơn giản nhưng thiếu khả năng quan sát chi tiết
  • Kafka Connect: Linh hoạt nhưng phức tạp trong quản lý offset
  • External Writer: Hiệu suất cao, hỗ trợ tự động recovery và giám sát thời gian thực

Tính năng nâng cao của DoubleCloud Transfer

  • Quản lý offset tự động khi gặp dữ liệu lỗi
  • Giao diện giám sát thời gian thực cho độ trễ và khối lượng dữ liệu
  • Khả năng mở rộng độc lập với cụm ClickHouse
  • Hỗ trợ tự động cập nhật schema

Thẻ: kafka ClickHouse doublecloud data-pipeline stream-processing

Đăng vào ngày 29 tháng 6 lúc 23:55