1. Tổng quan kiến trúc Data Streaming Time-Series
Kiến trúc này được thiết kế để xử lý khối lượng dữ liệu lớn (high throughput) với độ trễ thấp (low latency), đặc biệt phù hợp cho các use-case như log monitoring, IoT telemetry, hay real-time analytics.
Luồng dữ liệu hoạt động theo 3 giai đoạn chính:
- Ingestion (Thu thập): Vector đóng vai trò là agent nhẹ, chạy trên server hoặc container để thu thập dữ liệu từ các nguồn (logs, metrics) và định dạng lại thành JSON trước khi đẩy đi.
- Buffering & Decoupling (Đệm & Tách biệt): Apache Kafka đóng vai trò là message bus trung tâm, nhận dữ liệu từ Vector, đệm lại để xử lý các peak traffic, và đảm bảo dữ liệu không bị mất khi hệ thống downstream (ClickHouse) gặp sự cố.
- Storage & Analysis (Lưu trữ & Phân tích): ClickHouse là OLAP database chuyên biệt cho Time-Series, nhận dữ liệu từ Kafka (thông qua Kafka Engine) và lưu trữ vào bảng vật lý (MergeTree) để thực hiện các truy vấn tổng hợp nhanh chóng.
Mô hình này giúp tách biệt quá trình thu thập và lưu trữ, cho phép scale từng thành phần độc lập mà không ảnh hưởng đến toàn hệ thống.
2. Yêu cầu phần cứng và hệ điều hành
Để triển khai môi trường phát triển (local development) ổn định với Docker Compose, cấu hình tối thiểu trên máy chủ (Linux host) cần đáp ứng như sau:
- CPU: Tối thiểu 4 Cores (x86_64). ClickHouse và Kafka đều cần CPU để nén và giải nén dữ liệu.
- RAM: Tối thiểu 8GB. Khuyến nghị 16GB để tránh OOM (Out of Memory) khi Kafka tăng memory và ClickHouse cần RAM cho Merge.
- Disk: Tối thiểu 50GB SSD (Nhiệm vụ: Docker images + Data persistence). Bắt buộc dùng SSD, không dùng HDD vì I/O là nút thắt cổ chai của ClickHouse.
- Hệ điều hành: Ubuntu 20.04/22.04 LTS, Debian 11+, hoặc Rocky Linux 9. Kernel version >= 5.4.
Kiểm tra cấu hình hiện tại của server:
cat /proc/cpuinfo | grep "processor" | wc -l
free -h
df -hT /
Kết quả mong đợi: Số CPU >= 4, RAM available >= 8G, Disk usage < 90% trên filesystem loại ext4/xfs.
3. Cài đặt môi trường Docker Engine
Trên môi trường production hoặc server Linux thực tế, chúng ta không dùng Docker Desktop (chỉ có trên Windows/Mac) mà cài đặt Docker Engine trực tiếp để tối ưu hiệu năng và tương thích với Docker Compose.
3.1 Cài đặt Docker Engine và Compose Plugin
Thực hiện cài đặt Docker Engine chính chủ từ repository của Docker để đảm bảo version mới nhất và ổn định nhất.
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Kết quả mong đợi: Dòng thông báo "Docker Engine installed successfully".
Cài đặt Docker Compose Plugin (thay thế cho docker-compose cũ) để quản lý đa container.
sudo apt-get update
sudo apt-get install docker-compose-plugin
Kiểm tra phiên bản Docker và Compose:
docker --version
docker compose version
Kết quả mong đợi: Hiển thị version Docker Engine (ví dụ 24.x.x) và Docker Compose (ví dụ v2.x.x).
3.2 Cấu hình quyền và tự động khởi động
Cấu hình để user hiện tại có thể chạy lệnh docker mà không cần sudo và đảm bảo Docker chạy tự động khi server khởi động lại.
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl enable docker
sudo systemctl start docker
Kết quả mong đợi: Lệnh `docker ps` chạy thành công mà không cần sudo.
4. Chuẩn bị cấu hình và script tự động hóa
Tạo cấu trúc thư mục dự án chuẩn để chứa các file cấu hình của Kafka, ClickHouse và Vector. Cấu trúc này giúp dễ dàng mở rộng sang các phần tiếp theo của series.
4.1 Tạo thư mục dự án và Docker Compose file
Tạo thư mục chính và file `docker-compose.yml` định nghĩa toàn bộ stack (Kafka, Zookeeper, ClickHouse, Vector, Schema Registry).
mkdir -p ~/data-streaming-platform/{config,volumes}
cd ~/data-streaming-platform
Tạo file `docker-compose.yml` với nội dung hoàn chỉnh dưới đây. File này sẽ khởi tạo 4 service: Zookeeper, Kafka, ClickHouse, và Vector.
cat > docker-compose.yml
Kết quả mong đợi: File `docker-compose.yml` được tạo, chứa định nghĩa 4 service kết nối qua mạng nội bộ `data-net`.
4.2 Tạo cấu hình ClickHouse (Init Script)
Chuẩn bị script SQL để tự động tạo database và bảng mẫu khi ClickHouse khởi động lần đầu. File này sẽ được mount vào container.
mkdir -p config/clickhouse
Tạo file `init.sql` với nội dung tạo database và bảng `metrics` sử dụng động cơ MergeTree (chuẩn cho Time-Series).
cat > config/clickhouse/init.sql
Kết quả mong đợi: File SQL được tạo sẵn, khi ClickHouse chạy, nó sẽ tự động tạo bảng `metrics` để sẵn sàng nhận dữ liệu.
4.3 Tạo cấu hình Vector
Tạo file cấu hình `vector.yaml` để định nghĩa source (API hoặc file log) và sink (đẩy về Kafka). Ở phần này, ta cấu hình một nguồn mẫu để test kết nối.
mkdir -p config/vector
Tạo file `vector.yaml` với cấu hình cơ bản: Source là `stdin` (để test gửi dữ liệu bằng tay) và Sink là `kafka`.
cat > config/vector/vector.yaml
Kết quả mong đợi: File `vector.yaml` được tạo, định nghĩa luồng dữ liệu từ `stdin` -> `kafka_sink` với topic `metrics-topic`.
4.4 Script khởi động và kiểm tra môi trường
Tạo script shell để tự động khởi động toàn bộ stack và đợi các service sẵn sàng trước khi thông báo cho user.
cat > start.sh /dev/null 2>&1; do
echo "Waiting for Kafka..."
sleep 2
done
# Check ClickHouse
until docker compose exec -T clickhouse clickhouse-client --query "SELECT 1" > /dev/null 2>&1; do
echo "Waiting for ClickHouse..."
sleep 2
done
echo ">>> All services are running."
docker compose ps
EOF
chmod +x start.sh
Kết quả mong đợi: Script `start.sh` được tạo và cấp quyền thực thi.
5. Verify kết quả môi trường
Thực thi script để khởi động toàn bộ môi trường và kiểm tra trạng thái.
./start.sh
Kết quả mong đợi: Các container (zookeeper, kafka, clickhouse, vector) có trạng thái `Up`.
Kiểm tra xem topic Kafka đã được tạo chưa (Vector sẽ tự tạo topic nếu cấu hình `auto.create.topics.enable` mặc định, hoặc ta tạo thủ công để chắc chắn).
docker compose exec kafka kafka-topics --bootstrap-server localhost:9092 --create --topic metrics-topic --partitions 1 --replication-factor 1 --if-not-exists
docker compose exec kafka kafka-topics --bootstrap-server localhost:9092 --list
Kết quả mong đợi: Dòng output hiện tên topic `metrics-topic`.
Kiểm tra xem bảng ClickHouse đã được tạo chưa.
docker compose exec clickhouse clickhouse-client --query "SHOW TABLES FROM timeseries"
Kết quả mong đợi: Dòng output hiện tên bảng `metrics`.
Kiểm tra Vector có đang lắng nghe source stdin không.
docker compose logs vector
Kết quả mong đợi: Log hiển thị "Vector started" và các thông báo về source/sink đã được tải thành công.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Data Streaming Time-Series với Kafka, ClickHouse và Vector
Phần 2: Triển khai và cấu hình nền tảng Apache Kafka »