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:
- 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
- Kafka Connect: Sử dụng framework Kafka Connect để xử lý logic đồng bộ dữ liệu
- 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