Triển khai Apache Kafka Broker với KRaft Mode trên Docker
Chuẩn bị thư mục làm việc và cấu hình KRaft
Chúng ta sẽ không sử dụng Zookeeper truyền thống mà chuyển sang KRaft (Kafka Raft) để giảm độ phức tạp trong môi trường container. Bước đầu tiên là tạo cấu trúc thư mục chứa các file cấu hình và file log cần thiết.
Thư mục này sẽ chứa file metadata và các log của broker, giúp Docker mount volume đúng cách để dữ liệu không bị mất khi container restart.
Kết quả mong đợi: Xuất hiện thư mục kafka-data với cấu trúc con broker_1.
mkdir -p ~/kafka-data/broker_1
Tạo file cấu hình broker.server.properties
File này định nghĩa hành vi của Kafka Broker. Chúng ta cấu hình mode KRaft, chỉ định controller quorum và các tham số quan trọng cho dữ liệu time-series như segment size và retention.
Việc cấu hình num.partitions mặc định thấp là chủ ý để chúng ta tạo topic thủ công với số partition tối ưu cho workload cụ thể. Tham số log.segment.bytes được đặt lớn để giảm số lượng file và tăng hiệu năng đọc ghi.
Kết quả mong đợi: File broker.server.properties được tạo tại đường dẫn chỉ định với nội dung chính xác.
cat > ~/kafka-data/broker_1/broker.server.properties
Chạy container Kafka với Docker Compose
Sử dụng Docker Compose để khởi tạo môi trường mạng và container Kafka. Chúng ta mount file cấu hình vừa tạo vào trong container và ánh xạ cổng 9092 (Client) và 9093 (Controller).
Biến môi trường KAFKA_CFG_NODE_ID và KAFKA_CFG_PROCESS_ROLES được set để override một số setting nếu cần, nhưng ở đây file config đã đầy đủ nên Docker sẽ ưu tiên file đó. Container sẽ tự động khởi tạo metadata nếu chưa có.
Kết quả mong đợi: Container kafka-broker chạy trạng thái Up, log xuất hiện dòng Controller epoch changed và Started KafkaServer.
cat > ~/kafka-data/docker-compose.yml
cd ~/kafka-data && docker compose up -d
Tạo Topic chuyên biệt cho dữ liệu Time-Series
Cấu hình Topic với Retention Policy và Partition tối ưu
Sau khi broker sẵn sàng, chúng ta tạo topic metrics-time-series với các tham số đặc thù. Số partition được đặt cao (ví dụ 12) để đảm bảo throughput khi có nhiều producer song song.
Tham số retention.ms được tính toán dựa trên 7 ngày (604800000ms) để lưu trữ dữ liệu lịch sử, và segment.bytes được giảm xuống 128MB để file log nhỏ hơn, giúp ClickHouse hoặc các consumer khác xử lý batch hiệu quả hơn.
Kết quả mong đợi: Topic được tạo thành công, thông báo Created topic metrics-time-series.
docker exec -it kafka-broker kafka-topics --create \
--bootstrap-server localhost:9092 \
--topic metrics-time-series \
--partitions 12 \
--replication-factor 1 \
--config retention.ms=604800000 \
--config segment.bytes=134217728 \
--config min.compaction.lag.ms=0 \
--config max.compaction.lag.ms=3600000 \
--config cleanup.policy=delete
Verify cấu hình Topic đã tạo
Chúng ta cần kiểm tra lại các thuộc tính của topic để đảm bảo các tham số retention và partition đã được áp dụng đúng như mong muốn, không bị reset về mặc định.
Tham số Retention và Segment phải khớp với giá trị vừa cấu hình. Nếu thấy -1 hoặc giá trị mặc định, cần kiểm tra lại log của broker.
Kết quả mong đợi: Hiển thị danh sách topic với thông số Topic: metrics-time-series, Partitions: 12, Retention: 604800000.
docker exec -it kafka-broker kafka-topics --describe \
--bootstrap-server localhost:9092 \
--topic metrics-time-series
Cấu hình Retention Policy và Segment Size nâng cao
Điều chỉnh động các tham số cho Topic
Trong môi trường production, yêu cầu về lưu trữ có thể thay đổi. Chúng ta học cách sử dụng alter-config để thay đổi retention mà không cần xóa và tạo lại topic.
Thao tác này cho phép giảm thời gian lưu trữ xuống 24 giờ để tiết kiệm dung lượng disk trong các bài test load cao, hoặc tăng lên khi cần phân tích dài hạn. Việc này không ảnh hưởng đến dữ liệu đang được ghi.
Kết quả mong đợi: Thông báo Topic 'metrics-time-series' is updated.
docker exec -it kafka-broker kafka-configs \
--bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name metrics-time-series \
--alter \
--add-config retention.ms=86400000,segment.bytes=67108864
Verify thay đổi cấu hình
Kiểm tra lại cấu hình của topic để xác nhận giá trị retention.ms và segment.bytes đã được cập nhật.
Các dòng retention.ms và segment.bytes trong output phải hiện giá trị mới vừa đặt (86400000 và 67108864).
Kết quả mong đợi: Output của lệnh describe hiện các giá trị cấu hình mới.
docker exec -it kafka-broker kafka-topics --describe \
--bootstrap-server localhost:9092 \
--topic metrics-time-series
Kiểm tra trạng thái và luồng dữ liệu cơ bản
Producer: Ghi dữ liệu mẫu vào Topic
Sử dụng công cụ kafka-console-producer để đẩy một lượng dữ liệu mẫu vào topic. Dữ liệu này sẽ mô phỏng định dạng JSON của metric time-series.
Mỗi dòng đầu vào sẽ được coi là một message. Chúng ta sẽ gửi 5 dòng để kiểm tra khả năng ghi. Dữ liệu bao gồm timestamp, metric name và value.
Kết quả mong đợi: Không có lỗi, prompt chờ nhập liệu ([2023-10-27...]) hoặc thông báo Shutting down sau khi gửi xong.
docker exec -it kafka-broker kafka-console-producer \
--bootstrap-server localhost:9092 \
--topic metrics-time-series
Consumer: Đọc và xác minh dữ liệu
Khởi tạo một console consumer để đọc dữ liệu từ partition 0 của topic. Tham số --from-beginning là bắt buộc để đọc lại các message vừa được ghi vào trong bước producer.
Nội dung hiển thị phải khớp 100% với dữ liệu JSON đã gửi. Nếu thấy lỗi NotEnoughReplicas hoặc LeaderNotAvailable, cần kiểm tra lại trạng thái broker.
Kết quả mong đợi: Hiển thị 5 dòng JSON tương ứng với dữ liệu đã gửi. Nhấn Ctrl+C để thoát.
docker exec -it kafka-broker kafka-console-consumer \
--bootstrap-server localhost:9092 \
--topic metrics-time-series \
--from-beginning \
--max-messages 5
Verify Health của Cluster
Cuối cùng, chạy lệnh kiểm tra trạng thái các partition để đảm bảo tất cả 12 partition đều có Leader và số lượng ISR (In-Sync Replicas) đủ yêu cầu.
Tất cả các dòng partition phải hiện trạng thái Leader: 1 (hoặc ID broker), Isr: (1). Không có partition nào bị Under Replicated hay Offline.
Kết quả mong đợi: Danh sách 12 partition với trạng thái Leader và Isr đầy đủ.
docker exec -it kafka-broker kafka-topics --describe \
--bootstrap-server localhost:9092 \
--topic metrics-time-series | grep -E "Partition|Leader|Isr"
Đ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 1: Tổng quan kiến trúc và chuẩn bị môi trường phát triển
Phần 3: Thiết lập Vector để thu thập và định dạng dữ liệu »