Hướng dẫn triển khai Kafka Cluster cơ bản
Trong bối cảnh xử lý dữ liệu thời gian thực ngày càng quan trọng, Apache Kafka đã trở thành nền tảng cốt lõi cho các hệ thống streaming quy mô lớn. Để khai thác hiệu quả, việc triển khai Kafka Cluster đóng vai trò then chốt trong việc đảm bảo tính sẵn sàng và khả năng mở rộng của hệ thống. Trong bài viết dưới đây, Bizfly Cloud sẽ cùng bạn tìm hiểu và hướng dẫn chi tiết triển khai Kafka Cluster.
Kafka Cluster là gì?
Kafka Cluster là hệ thống phân tán gồm nhiều Broker phối hợp để lưu trữ và truyền tải dữ liệu sự kiện theo thời gian thực. Dữ liệu được chia thành Partition để scale ngang và sao chép qua Replication nhằm đảm bảo thông lượng cao và khả năng chịu lỗi.
Cluster truyền thống được điều phối bởi ZooKeeper, nhưng trong các phiên bản mới của Apache Kafka đã chuyển sang KRaft, giúp đơn giản hóa kiến trúc và vận hành.
Chuẩn bị trước khi cài đặt
Để triển khai một Kafka Cluster ổn định trong môi trường production, cần chuẩn bị các yếu tố hạ tầng sau:
1/ Số lượng Node
- Nên triển khai tối thiểu 3 Broker để đảm bảo khả năng chịu lỗi và duy trì hoạt động khi có sự cố.
- Đối với Zookeeper, cần sử dụng số lượng node lẻ (3, 5, 7...) để phục vụ cơ chế bầu chọn leader.
- Với Kafka phiên bản mới có thể sử dụng KRaft mode (Kafka 3.x+) để thay thế Zookeeper
2/ Cấu hình phần cứng
- RAM:
- Test: ≥ 4GB
- Production: ≥ 16GB (tùy theo throughput và dung lượng lưu trữ)
- Disk: Bắt buộc dùng SSD/NVMe để tối ưu tốc độ đọc/ghi, nên cấu hình nhiều ổ đĩa (log.dirs) để tránh bottleneck
- CPU & Network:
- CPU đủ mạnh để xử lý message throughput cao
- Network tối thiểu 1Gbps (khuyến nghị 10Gbps cho hệ thống lớn)
3/ Hệ điều hành và môi trường
- Sử dụng Linux (Ubuntu 20.04/22.04 hoặc tương đương)
- Cài đặt Java JDK (Kafka chạy trên Java/Scala)
- Tối ưu hệ thống:
- Tăng ulimit -n (file descriptors)
- Điều chỉnh vm.swappiness, I/O scheduler
- Tuning JVM (ưu tiên G1GC hoặc ZGC để giảm GC pause)
4/ Mạng và cổng kết nối (Ports)
Cần đảm bảo các node trong cụm có thể kết nối với nhau thông qua các cổng cần thiết:
- Port 2181: Sử dụng cho dịch vụ Zookeeper
- Port 9092: Cổng mặc định cho Kafka Broker
- Ngoài ra, tùy theo cấu hình (SSL, SASL hoặc giao tiếp nội bộ), có thể cần mở thêm các cổng liên quan khác
5/ Các yếu tố quan trọng trong production
- Partition strategy: Phân bổ partition hợp lý để tối ưu hiệu năng và scale
- Retention policy: Cấu hình thời gian/dung lượng lưu trữ (log.retention) phù hợp
- Monitoring & Logging: Tích hợp Prometheus, Grafana hoặc các công cụ giám sát qua JMX
- Data safety: Sử dụng replication và cơ chế đồng bộ thay vì backup truyền thống, có thể dùng MirrorMaker để replicate giữa các cluster
Các bước triển khai Kafka Cluster cơ bản
Bước 1: Cài đặt môi trường
Trước khi bắt đầu, bạn cần chuẩn bị hạ tầng và các công cụ cần thiết để đảm bảo cụm Kafka vận hành ổn định
- Cụm Kubernetes: Đảm bảo bạn có quyền truy cập vào một cụm đang hoạt động (EKS, GKE, AKS hoặc On-premise).
- Công cụ quản lý: Cài đặt sẵn kubectl để tương tác trực tiếp với cụm.
- Tài nguyên: Khuyến nghị sử dụng tối thiểu 3 worker node để đảm bảo tính sẵn sàng cao.
- Khởi tạo Namespace: Tạo một namespace riêng biệt (ví dụ: kafka) để quản lý tài nguyên tập trung và khoa học
root@ip-172-31-36-250:~# kubectl create namespace kafka
namespace/kafka created
root@ip-172-31-36-250:~#
Bước 2: Triển khai ZooKeeper Cluster
Kafka phụ thuộc vào Zookeeper để điều phối cụm, do đó cần triển khai một Zookeeper single-instance.
zookeeper.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: zookeeper-1
namespace: kafka
labels:
app: zookeeper
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: confluentinc/cp-zookeeper:7.3.2
ports:
- containerPort: 2181
env:
- name: ZOOKEEPER_CLIENT_PORT
value: "2181"
- name: ZOOKEEPER_SERVER_ID
value: "1"
- name: ZOOKEEPER_SERVERS
value: "zookeeper-1:2888:3888"
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper-1
namespace: kafka
spec:
ports:
- port: 2181
targetPort: 2181
selector:
app: zookeeper
Áp dụng: kubectl apply -f zookeeper.yaml
root@ip-172-31-32-175:~/k8s# kubectl apply -f zookeeper.yaml
deployment.apps/zookeeper-1 created
service/zookeeper-1 created
root@ip-172-31-32-175:~/k8s#
Chạy Zookeeper ( confluentinc/cp-zookeeper:7.3.2) với:
- Cổng máy khách: 2181
- ID máy chủ: 1
- Cấu hình cụm: zookeeper-1:2888:3888
Dịch vụ: Mở cổng 2181 cho các kết nối từ phía máy khách đến Zookeeper.
Bước 3: Cấu hình Kafka Brokers
Kafka Broker 1
kafka-broker-1.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-broker-1
namespace: kafka
labels:
app: kafka-broker-1
spec:
replicas: 1
selector:
matchLabels:
app: kafka-broker-1
template:
metadata:
labels:
app: kafka-broker-1
spec:
hostname: kafka-broker-1
containers:
- name: kafka
image: confluentinc/cp-kafka:7.3.2
ports:
- containerPort: 9092
- containerPort: 29092
env:
- name: KAFKA_ZOOKEEPER_CONNECT
value: "zookeeper-1:2181"
- name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
value: "PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT"
- name: KAFKA_INTER_BROKER_LISTENER_NAME
value: "PLAINTEXT"
- name: KAFKA_ADVERTISED_LISTENERS
value: "PLAINTEXT://kafka-broker-1:29092,PLAINTEXT_HOST://kafka-broker-1:9092"
- name: KAFKA_BROKER_ID
value: "1"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-broker-1
namespace: kafka
spec:
ports:
- name: external
port: 9092
targetPort: 9092
- name: internal
port: 29092
targetPort: 29092
selector:
app: kafka-broker-1
type: ClusterIP
Áp dụng
kubectl apply -f kafka-broker-1.yaml
Kafka Broker 2
kafka-broker-2.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-broker-2
namespace: kafka
labels:
app: kafka-broker-2
spec:
replicas: 1
selector:
matchLabels:
app: kafka-broker-2
template:
metadata:
labels:
app: kafka-broker-2
spec:
hostname: kafka-broker-2
containers:
- name: kafka
image: confluentinc/cp-kafka:7.3.2
ports:
- containerPort: 9093
- containerPort: 29093
env:
- name: KAFKA_ZOOKEEPER_CONNECT
value: "zookeeper-1:2181"
- name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
value: "PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT"
- name: KAFKA_INTER_BROKER_LISTENER_NAME
value: "PLAINTEXT"
- name: KAFKA_ADVERTISED_LISTENERS
value: "PLAINTEXT://kafka-broker-2:29093,PLAINTEXT_HOST://kafka-broker-2:9093"
- name: KAFKA_BROKER_ID
value: "2"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-broker-2
namespace: kafka
spec:
ports:
- name: external
port: 9093
targetPort: 9093
- name: internal
port: 29093
targetPort: 29093
selector:
app: kafka-broker-2
type: ClusterIP
Áp dụng:
kubectl apply -f kafka-broker-2.yaml
Kafka Broker 3
kafka-broker-3.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-broker-3
namespace: kafka
labels:
app: kafka-broker-3
spec:
replicas: 1
selector:
matchLabels:
app: kafka-broker-3
template:
metadata:
labels:
app: kafka-broker-3
spec:
hostname: kafka-broker-3
containers:
- name: kafka
image: confluentinc/cp-kafka:7.3.2
ports:
- containerPort: 9094
- containerPort: 29094
env:
- name: KAFKA_ZOOKEEPER_CONNECT
value: "zookeeper-1:2181"
- name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
value: "PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT"
- name: KAFKA_INTER_BROKER_LISTENER_NAME
value: "PLAINTEXT"
- name: KAFKA_ADVERTISED_LISTENERS
value: "PLAINTEXT://kafka-broker-3:29094,PLAINTEXT_HOST://kafka-broker-3:9094"
- name: KAFKA_BROKER_ID
value: "3"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-broker-3
namespace: kafka
spec:
ports:
- name: external
port: 9094
targetPort: 9094
- name: internal
port: 29094
targetPort: 29094
selector:
app: kafka-broker-3
type: ClusterIP
Áp dụng:
kubectl apply -f kafka-broker-3.yaml
root@ip-172-31-32-175:~/k8s# kubectl apply -f kafka-broker-3.yaml
deployment.apps/kafka-broker-3 created
service/kafka-broker-3 created
root@ip-172-31-32-175:~/k8s#
Bước 4: Khởi động dịch vụ
Sau khi các Broker đã chạy, bạn cần một công cụ để theo dõi. Kafka UI cung cấp giao diện web trực quan để quản lý cụm
- Image sử dụng: Provectuslabs/kafka-ui:latest.
- Xác thực: Cấu hình LOGIN_FORM với Username và Password để bảo mật.
- Kết nối: Kafka UI sẽ kết nối tới cả 3 Broker qua cổng nội bộ và kết nối tới ZooKeeper
kafka-ui.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-monitoring-ui
namespace: kafka
labels:
app: kafka-ui
spec:
replicas: 1
selector:
matchLabels:
app: kafka-ui
template:
metadata:
labels:
app: kafka-ui
spec:
containers:
- name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- containerPort: 8080
env:
- name: KAFKA_CLUSTERS_0_NAME
value: "local"
- name: KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS
value: "kafka-broker-1:29092,kafka-broker-2:29093,kafka-broker-3:29094"
- name: KAFKA_CLUSTERS_0_ZOOKEEPER
value: "zookeeper-1:2181"
- name: AUTH_TYPE
value: "LOGIN_FORM"
- name: SPRING_SECURITY_USER_NAME
value: "<Enter username what you want ?>"
- name: SPRING_SECURITY_USER_PASSWORD
value: "<Enter password what you want ?>"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-ui
namespace: kafka
spec:
ports:
- port: 8082
targetPort: 8080
selector:
app: kafka-ui
type: LoadBalancer
Áp dụng
kubectl apply -f kafka-ui.yaml
root@ip-172-31-32-175:~/k8s# kubectl apply -f kafka-ui.yaml
deployment.apps/kafka-monitoring-ui created
service/kafka-ui created
root@ip-172-31-32-175:~/k8s#
Xác minh quá trình triển khai:
kubectl get pods -n kafka
root@ip-172-31-32-175:~/k8s# kubectl get pods -n kafka
NAME READY STATUS RESTARTS AGE
kafka-broker-1-695c97cf97-qkq2p 1/1 Running 0 3m27s
kafka-broker-2-bd5d7bdf6-prhs6 1/1 Running 0 2m35s
kafka-broker-3-544559fdf9-kghd4 1/1 Running 0 110s
kafka-monitoring-ui-fcb444945-2qclc 1/1 Running 0 34s
zookeeper-1-687c6bbc6b-w4g6n 1/1 Running 0 4m55s
root@ip-172-31-32-175:~/k8s#
Hiển thị giao diện người dùng Kafka bằng cách sử dụng chuyển tiếp cổng: Mã nguồn mở
kubectl port-forward --address 0.0.0.0 svc/kafka-ui 8082:8082 -n kafka
root@ip-172-31-9-90:~/k8s# kubectl port-forward --address 0.0.0.0 svc/kafka-ui 8082:8082 -n kafka
Forwarding from 0.0.0.0:8082 -> 8080
Sau khi lệnh trên chạy thành công, bạn thực hiện các bước sau để bắt đầu quản trị:
- Mở trình duyệt và truy cập địa chỉ: http://<public-ip>:8082.
- Tại màn hình đăng nhập, nhập chính xác Username và Password mà bạn đã thiết lập trong tệp kafka-ui.yaml ở trên.
- Giao diện sẽ hiển thị toàn bộ thông tin về Cluster, giúp bạn dễ dàng theo dõi.
Bước 5: Tạo Topic
Thực hiện tạo một tác vụ khởi tạo để cấu hình trước các chủ đề.
init-kafka.yaml:
apiVersion: batch/v1
kind: Job
metadata:
name: init-kafka
namespace: kafka
spec:
template:
spec:
containers:
- name: init-kafka
image: confluentinc/cp-kafka:7.3.2
command:
- /bin/sh
- -c
- |
kafka-topics --bootstrap-server kafka-broker-1:29092 --list && \
kafka-topics --bootstrap-server kafka-broker-1:29092 --create --if-not-exists --topic test-event --replication-factor 3 --partitions 3 && \
kafka-topics --bootstrap-server kafka-broker-1:29092 --list
restartPolicy: OnFailure
Áp dụng:
kubectl apply -f init-kafka.yaml
root@ip-172-31-32-175:~/k8s# kubectl apply -f init-kafka.yaml
job.batch/init-kafka created
root@ip-172-31-32-175:~/k8s#
root@ip-172-31-32-175:~/k8s#
Để cụm Kafka có thể bắt đầu tiếp nhận và phân phối dữ liệu, bạn cần khởi tạo các Topic. Thay vì tạo thủ công, chúng ta sẽ sử dụng một Initialization Job (init-kafka.yaml) để tự động hóa quy trình này.
- Cơ chế hoạt động: Đây là một Job chạy một lần (one-time execution), nó sẽ tự động thoát sau khi hoàn thành nhiệm vụ khởi tạo.
- Thông số kỹ thuật: Job này sẽ kết nối tới Bootstrap Server (ví dụ: kafka-broker-1:29092) và thực hiện tạo topic mẫu có tên là test-event.
- Đảm bảo tính sẵn sàng cao: Topic sẽ được cấu hình với Replication Factor là 3 (nhân bản trên 3 broker) và 3 Partitions (phân vùng) để tối ưu khả năng xử lý song song và dự phòng dữ liệu
Bước 6: Xác thực và kiểm tra
Sau khi hoàn tất việc triển khai, bạn cần tiến hành kiểm tra để đảm bảo hệ thống hoạt động ổn định đúng theo thiết kế.
- Kiểm tra Pods: Sử dụng lệnh kubectl get pods để xác nhận tất cả các thành phần (ZooKeeper, 3 Kafka Brokers, Kafka UI) đều đang chạy.
- Truy cập UI: Sử dụng kỹ thuật port forwarding để ánh xạ cổng và truy cập vào giao diện quản trị tại http://localhost:8082.
- Xác nhận thực tế:
+ Kiểm tra Topics: Đăng nhập vào UI và xác nhận topic test-event đã tồn tại với đúng cấu hình.

Kiểm tra nhanh Topics đã tồn tại đúng cấu hình hay chưa
+ Kiểm tra Brokers: Kiểm tra danh sách Brokers trên giao diện để chắc chắn cả 3 nút đều đã được nhận diện và đang hoạt động

Kiểm tra Brokers để cả 3 nút đều được nhận diện
Bizfly Cloud Kafka – Triển khai Kafka Cluster nhanh chóng
Với Bizfly Kafka, developer dễ dàng sử dụng Apache Kafka để giao tiếp xử lý dữ liệu theo thời gian thực trong các hệ thống mà không cần phải quản lý hay cài đặt server. Các tài nguyên sẽ được tự động cung cấp và quản lý, mở rộng quy mô ứng dụng khi khối lượng streaming data thay đổi hoàn toàn tự động, không cần thao tác thủ công, giúp bạn tập trung tối đa thời gian, công sức cho phát triển sản phẩm, tính năng cốt lõi.
- Triển khai siêu tốc: Tự động hóa hoàn toàn việc khởi tạo và cấu hình cụm Apache Kafka chỉ với vài cú click trên Dashboard.
- Bảo mật cấp doanh nghiệp: Mặc định mã hóa dữ liệu (Encryption in transit & within cluster) và hỗ trợ các cơ chế xác thực mạnh như mTLS, SASL cùng danh sách kiểm soát truy cập (ACL).
- Khả năng mở rộng không giới hạn: Tự động tăng số lượng Broker và dung lượng lưu trữ khi khối lượng dữ liệu tăng đột biến mà không gây gián đoạn hệ thống.
- Tối ưu chi phí: Áp dụng mô hình Pay-as-you-go, chỉ tính phí dựa trên Partition, Storage và Data Transfer thực tế sử dụng
Tính năng nổi bật của Bizfly Cloud Kafka
- Quản lý topic: Tạo, thêm, sửa, xóa, tìm kiếm, xem thông tin topic; tìm kiếm, xóa, xem danh sách số lượng phân vùng message.
- Quản lý ACL: Tạo, tìm kiếm, show, cấp quyền, sửa, xóa ACL của Topic, Consumer group.
- Quản lý metrics monitoring: Cung cấp bộ lọc theo thời gian, bộ lọc theo Topic, Consumer theo bộ lọc thời gian.
- Quản lý credential: Tạo, tìm kiếm, thêm, sửa, xóa, xem thông tin user/password. Cho phép xem danh sách ACL của topic.
- Quản lý Consumer Group: Tạo, tìm kiếm, show, cấp quyền, sửa, xóa ACL của Topic, Consumer group.
- Quản lý logging: Cung cấp bộ lọc theo thời gian, bộ lọc theo Topic, Consumer theo bộ lọc thời gian.
Kết luận
Triển khai Kafka Cluster là nền tảng cốt lõi cho bất kỳ hệ thống xử lý dữ liệu thời gian thực nào. Tùy vào nguồn lực, bạn có thể tự xây dựng cụm để tối ưu hóa kiến trúc hoặc lựa chọn các giải pháp quản trị hoàn toàn như Bizfly Cloud Kafka để tập trung tối đa vào việc phát triển ứng dụng cốt lõi, giảm thiểu rủi ro vận hành và tối ưu hóa chi phí đầu tư





















