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 --version
docker compose version

Docker compose

version: '3.8'

services:
  kafka-1:
    image: confluentinc/cp-kafka:latest
    container_name: kafka-1
    hostname: kafka-1
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: controller
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "CONTROLLER://0.0.0.0:9093"
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_INTER_BROKER_LISTENER_NAME: CONTROLLER
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
    volumes:
      - kafka-1-data:/var/lib/kafka/data
    networks:
      - kafka_network

  kafka-2:
    image: confluentinc/cp-kafka:latest
    container_name: kafka-2
    hostname: kafka-2
    ports:
      - "9094:9092"
      - "9095:9093"
    environment:
      KAFKA_NODE_ID: 2
      KAFKA_PROCESS_ROLES: controller,broker
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-2:9092"
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_NUM_PARTITIONS: 10
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 2
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
    volumes:
      - kafka-2-data:/var/lib/kafka/data
    networks:
      - kafka_network

  kafka-3:
    image: confluentinc/cp-kafka:latest
    container_name: kafka-3
    hostname: kafka-3
    ports:
      - "9096:9092"
      - "9097:9093"
    environment:
      KAFKA_NODE_ID: 3
      KAFKA_PROCESS_ROLES: controller,broker
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-3:9092"
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_NUM_PARTITIONS: 10
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 2
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
    volumes:
      - kafka-3-data:/var/lib/kafka/data
    networks:
      - kafka_network

  kafka-4:
    image: confluentinc/cp-kafka:latest
    container_name: kafka-4
    hostname: kafka-4
    ports:
      - "9098:9092"
    environment:
      KAFKA_NODE_ID: 4
      KAFKA_PROCESS_ROLES: broker
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-4:9092"
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_NUM_PARTITIONS: 10
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 2
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
    volumes:
      - kafka-4-data:/var/lib/kafka/data
    networks:
      - kafka_network


networks:
  kafka_network:

volumes:
  kafka-1-data:
  kafka-2-data:
  kafka-3-data:
  kafka-4-data:

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ó Kafka

  • Có 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.

environment:
      KAFKA_NODE_ID: 2
      KAFKA_PROCESS_ROLES: controller,broker
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-2:9092"
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
Biến
Mô tả

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.

environment:
      KAFKA_NODE_ID: 4
      KAFKA_PROCESS_ROLES: broker
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-4:9092"
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
Biến
Mô tả

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.

environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: controller
      KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093"
      KAFKA_LISTENERS: "CONTROLLER://0.0.0.0:9093"
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_INTER_BROKER_LISTENER_NAME: CONTROLLER
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
Biến
Mô tả

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

docker exec -it kafka-1 bash

Tạo topic

kafka-topics --create \
  --topic test-topic \
  --bootstrap-server kafka-1:9092 \
  --partitions 3 \
  --replication-factor 2

Gửi message

kafka-console-producer --topic test-topic --bootstrap-server kafka-1:9092

Nhận message

kafka-console-consumer --topic test-topic --from-beginning --bootstrap-server kafka-1:9092

Last updated