Hướng dẫn triển khai Kafka Cluster cơ bản

2113
05-05-2026
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
kubectl create namespace kafka

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ị:

  1. Mở trình duyệt và truy cập địa chỉ: http://<public-ip>:8082.
  2. 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.
  3. 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.

Hướng dẫn triển khai Kafka Cluster cơ bản - Ảnh 12.

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

Hướng dẫn triển khai Kafka Cluster cơ bản - Ảnh 13.

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ư

SHARE
Zalo