Từ v4 trở đi, Apache Kafka sẽ sử dụng KRaft cho phần cluster management thay vì Apache ZooKeeper. Do đó, các bạn không cần up và running container cho Apache ZooKeeper như trong hướng dẫn của bài viết này nữa. Trong bài viết này, mình sẽ hướng dẫn các bạn cách cài đặt Apache Kafka từ v4 trở đi cùng với một công cụ từ Confluent Kafka là Confluent Schema Registry để quản lý schema cho các Kafka messages, sử dụng Docker Compose các bạn nhé!
Nội dung của kafka service trong tập tin Docker Compose các bạn có thể định nghĩa như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
kafka: image: confluentinc/cp-kafka:8.2.1 environment: KAFKA_NODE_ID: 1 KAFKA_PROCESS_ROLES: 'broker,controller' KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 CLUSTER_ID: 'MkU3OEVBNTcwNTJENDM2Qk' KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093' KAFKA_LISTENERS: 'PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092' KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT' KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER' volumes: - ./kafka/data:/var/lib/kafka/data healthcheck: test: ["CMD-SHELL", "kafka-topics --bootstrap-server localhost:9092 --list"] interval: 5s retries: 10 ports: - 9092:9092 |
Chúng ta phải định nghĩa biến KAFKA_NODE_ID để identify broker/controller node này với các broker/controller node khác trong Kafka cluster.
Với model mới sử dụng KRaft, Apache Kafka của chúng ta sẽ có thể đóng 2 vai trò là một message broker và cả controller. Controller sẽ làm nhiệm vụ store và replicate cluster metadata (configuration, topics, brokers). Các bạn có thể cấu hình nó chỉ đóng vai trò là broker hoặc là controller mà thôi. Chúng ta sẽ sử dụng biến môi trường KAFKA_PROCESS_ROLES để cấu hình cho điều này các bạn nhé.
Biến KAFKA_ADVERTISED_LISTENERS, KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR và KAFKA_LISTENER_SECURITY_PROTOCOL_MAP thì như mình đã giải thích trong bài viết trước. Ở đây, cho phần protocol map, mình đã định nghĩa thêm một protocol cho phần Controller là CONTROLLER:PLAINTEXT. Vì là mình đang cài đặt trên máy của mình, nên mình cũng không cần phải setup phần authentication cho Controller đó các bạn!
Biến CLUSTER_ID dùng để định nghĩa unique identity cho Kafka cluster. Đây là biến cần thiết để các broker và controller sử dụng nếu chúng cùng một Kafka cluster.
Với việc sử dụng KRaft để quản lý cluster, Apache Kafka sẽ sử dụng một active controller để làm điều này. Kafka định nghĩa nhiều controller sử dụng biến môi trường KAFKA_CONTROLLER_QUORUM_VOTERS và sử dụng một trong các controller này để quản lý cluster. Nếu một trong các controller này có vấn đề, Apache Kafka sẽ tự động sử dụng môt controller khác để handle. Chúng ta sẽ sử dụng biến môi trường KAFKA_CONTROLLER_LISTENER_NAMES để định nghĩa tên của active Controller này, các bạn nhé.
Còn schema-registry service thì các bạn có thể định nghĩa như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
schema-registry: image: confluentinc/cp-schema-registry:8.2.1 depends_on: kafka: condition: service_healthy ports: - "8081:8081" healthcheck: interval: 5s retries: 10 test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://localhost:8081 environment: SCHEMA_REGISTRY_SCHEMA_PROVIDERS_AVRO_VALIDATE_DEFAULTS: true SCHEMA_REGISTRY_HOST_NAME: schema-registry SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: 'kafka:29092' SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081 |
Biến SCHEMA_REGISTRY_SCHEMA_PROVIDERS_AVRO_VALIDATE_DEFAULTS dùng để request Schema Registry phải validate default value của các Avro schema fields khi chúng được đăng ký.
SCHEMA_REGISTRY_HOST_NAME dùng để định nghĩa host name của Schema Registry, các client có thể sử dụng host name này để connect tới Schema Registry các bạn nhé.
Biến SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS dùng để định nghĩa thông tin Kafka server.
SCHEMA_REGISTRY_LISTENERS định nghĩa thông tin host, port mà các client có thể sử dụng để connect tới Schema Registry.
Nếu bây giờ, các bạn chạy command “docker compose up” trong thư mục chứa tập tin Docker Compose với nội dung trên, các bạn sẽ thấy kết quả như sau:

Bây giờ thì các bạn cũng có thể connect tới Apache Kafka server này để sử dụng rồi.

