Kafka with KRaft Mode - Docker Compose
Giới Thiệu
Cấu hình này triển khai Kafka với KRaft mode (thay thế Zookeeper) sử dụng Docker Compose. Mô hình gồm 4 nodes:
kafka-1: Chỉ đóng vai trò controller
kafka-2, kafka-3: Đóng vai trò controller + broker
kafka-4: Chỉ đóng vai trò broker
Yêu Cầu
Trước khi bắt đầu, đảm bảo bạn đã cài đặt:
Docker (>= 20.x)
Docker Compose (>= 2.x)
Kiểm tra phiên bản:
Docker compose
Lưu ý chung
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
xác định số lượng bản sao (replica) của topic
__consumer_offsets
, dùng để lưu trữ offsets của consumer groups.Vì mỗi replica của một partition phải nằm trên một broker khác nhau, nên số replicas tối đa của một partition không thể vượt quá số broker khả dụng.
CLUSTER_ID
:
là một ID duy nhất đại diện cho Kafka Cluster khi chạy ở KRaft mode (không dùng Zookeeper)
Nếu bạn không có ID sẵn, bạn có thể tạo mới bằng lệnh sau
kafka-storage random-uuid
trên bất kỳ máy nào có KafkaCó thể tự tạo bằng lệnh
cat /proc/sys/kernel/random/uuid | tr -d '-' | cut -c1-24
để tạo chuỗi 24 ký tự ngẫu nhiên.
Các tên mặc định Kafka thường dùng:
PLAINTEXT
: Kết nối không mã hóa.SSL
: Kết nối mã hóa TLS/SSL.SASL_PLAINTEXT
: Xác thực SASL nhưng không mã hóa.SASL_SSL
: Xác thực SASL + mã hóa TLS/SSL.CONTROLLER
: Dùng cho các node controller.
Node controller + broker
Vai trò: Vừa là Broker để lưu trữ dữ liệu, vừa là Controller để quản lý metadata. Node loại này tham gia vào quá trình bầu chọn leader và lưu trữ dữ liệu Kafka.
KAFKA_NODE_ID
Mỗi node Kafka phải có một ID duy nhất.
KAFKA_PROCESS_ROLES
Giá trị controller,broker
chỉ ra rằng node này vừa là broker vừa là controller.
KAFKA_CONTROLLER_QUORUM_VOTERS
Danh sách tất cả các controller trong cluster, giúp bầu chọn leader. Cấu trúc <Node ID>@<Hostname>:<Port>
KAFKA_LISTENERS
Định nghĩa các giao thức giao tiếp:
- PLAINTEXT://0.0.0.0:9092
để client kết nối với broker.
- CONTROLLER://0.0.0.0:9093
để giao tiếp với controller.
KAFKA_ADVERTISED_LISTENERS
Địa chỉ mà các client sẽ kết nối đến (sử dụng hostname để tránh lỗi kết nối).
KAFKA_CONTROLLER_LISTENER_NAMES
Định nghĩa listener nào được dùng để giao tiếp giữa các controller.
KAFKA_INTER_BROKER_LISTENER_NAME
Xác định listener nào dùng để giao tiếp giữa các broker.
KAFKA_LOG_DIRS
Nơi lưu trữ log của Kafka (chứa dữ liệu của các partition).
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
Số lượng bản sao của topic __consumer_offsets
, dùng để theo dõi offset của consumer.
CLUSTER_ID
Mã định danh duy nhất của Kafka cluster.
Node broker
Vai trò: Chỉ lưu trữ dữ liệu, không quản lý metadata hoặc tham gia vào bầu chọn leader.
KAFKA_NODE_ID
ID duy nhất cho broker này.
KAFKA_PROCESS_ROLES
Chỉ có broker
, nghĩa là node này không phải là controller.
KAFKA_CONTROLLER_QUORUM_VOTERS
Danh sách các controller để broker biết nơi gửi metadata request.
KAFKA_LISTENERS
Chỉ cần PLAINTEXT://0.0.0.0:9092
vì broker không cần controller listener.
KAFKA_ADVERTISED_LISTENERS
Cách mà các client sẽ kết nối đến broker.
KAFKA_INTER_BROKER_LISTENER_NAME
Listener dùng để giao tiếp giữa các broker.
KAFKA_CONTROLLER_LISTENER_NAMES
Xác định listener nào dùng để giao tiếp giữa các controller.
KAFKA_LOG_DIRS
Lưu trữ dữ liệu của các partition.
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
Số lượng bản sao cho __consumer_offsets
(có thể cao hơn vì broker chỉ lưu dữ liệu).
CLUSTER_ID
Mã định danh của cluster Kafka.
Node Controller
Chỉ làm controller, chịu trách nhiệm quản lý metadata, nhưng không lưu trữ dữ liệu.
KAFKA_NODE_ID
ID của controller (phải là duy nhất trong cluster).
KAFKA_PROCESS_ROLES
Chỉ có controller
, nghĩa là node này không xử lý dữ liệu của topic.
KAFKA_CONTROLLER_QUORUM_VOTERS
Danh sách tất cả các controller để bầu chọn leader.
KAFKA_LISTENERS
Chỉ cần CONTROLLER://0.0.0.0:9093
, vì controller không giao tiếp với client hoặc broker.
KAFKA_CONTROLLER_LISTENER_NAMES
Xác định listener nào dùng để giao tiếp giữa các controller.
CLUSTER_ID
Mã định danh duy nhất của cluster.
Gửi message
Truy cập container
Tạo topic
Gửi message
Nhận message
Last updated