使用Docker設置Apache Kafka的指南
- java
- Docker
- Kafka
1.概述
Docker是軟件行業中用於創建,打包和部署應用程序的最流行的容器引擎**之一。在本教程中,我們將學習如何使用Docker進行Apache Kafka設置。
2.單節點設置
單節點Kafka代理設置可以滿足大多數本地開發需求。因此,讓我們從學習此簡單的設置開始。
2.1 docker-compose.yml
配置
要啟動Apache Kafka服務器,首先,我們需要啟動Zookeeper服務器。我們可以**docker-compose.yml
文件中配置此依賴關係**,這將確保Zookeeper服務器始終在Kafka服務器之前啟動,並在它之後停止。
讓我們用兩個服務創建一個簡單docker-compose.yml
zookeeper
和kafka
:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
在此設置中,我們的Zookeeper服務器正在監聽端口= 2181
上的kafka
服務,該服務是在同一容器設置中定義的。但是,對於主機上運行的任何客戶端,它將在端口22181
上公開。
同樣, kafka
29092
公開給主機應用程序,但實際上是在KAFKA_ADVERTISED_LISTENERS屬性配置的容器環境中的9092
KAFKA_ADVERTISED_LISTENERS
2.2 啟動Kafka服務器
docker-compose
命令旋轉容器來啟動Kafka服務器:
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1 ... done
現在,讓我們使用**nc
命令來驗證兩個服務器都在各自的端口上進行偵聽**:
$ nc -z localhost 22181
Connection to localhost port 22181 [tcp/*] succeeded!
$ nc -z localhost 29092
Connection to localhost port 29092 [tcp/*] succeeded!
此外,我們還可以在容器啟動時檢查詳細日誌,並驗證Kafka服務器是否已啟動:
$ docker-compose logs kafka | grep -i started
kafka_1 | [2021-04-10 22:57:40,413] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)
kafka_1 | [2021-04-10 22:57:40,418] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)
kafka_1 | [2021-04-10 22:57:40,447] INFO [SocketServer brokerId=1] Started data-plane acceptor and processor(s) for endpoint : ListenerName(PLAINTEXT) (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,448] INFO [SocketServer brokerId=1] Started socket server acceptors and processors (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,458] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)
這樣,我們的Kafka設置就可以使用了。
2.3 使用Kafka工具進行連接
最後,讓我們使用**Kafka Tool GUI實用程序與我們新創建的Kafka服務器建立連接**,稍後,我們將可視化此設置:
我們必須注意,我們需要使用**Bootstrap servers
屬性連接到**監聽主機的29092
最後,我們應該能夠在左側欄中看到連接:
因此,“主題”和“消費者”的條目為空,因為它是一個新設置。創建主題之後,我們應該能夠跨分區可視化數據。此外,如果有活躍的使用者連接到我們的Kafka服務器,那麼我們也可以查看其詳細信息。
3.Kafka群集設置
為了獲得更穩定的環境,我們需要一個彈性的設置。因此,讓我們擴展docker-compose.yml
文件以創建多節點Kafka集群設置。
3.1 docker-compose.yml
配置
Apache Kafka的群集設置需要同時具有Zookeeper服務器和Kafka服務器的冗餘。因此,讓我們為Zookeeper和Kafka服務分別增加一個節點的配置:
---
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka-2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 39092:39092
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
我們必須確保服務名稱和KAFKA_BROKER_ID
**在服務中是唯一的。**
而且,每個服務必須向主機公開一個唯一的端口。因此,儘管zookeeper-1
和zookeeper-2
正在偵聽端口2181
,但它們分別22181
和32181
將其暴露給主機。相同的邏輯適用於kafka-1
和kafka-2
服務,它們將分別在端口29092
和39092
,上偵聽。
3.2 啟動Kafka集群
讓我們使用docker-compose
命令啟動集群:
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper-1_1 ... done
Creating kafka_zookeeper-2_1 ... done
Creating kafka_kafka-2_1 ... done
Creating kafka_kafka-1_1 ... done
集群啟動後,讓我們通過指定Kafka服務器和相應端口的逗號分隔值,使用Kafka工具連接到集群:
最後,讓我們看一下集群中可用的多個代理節點:
4 結論
在本教程中,我們使用Docker技術創建Apache Kafka的單節點和多節點設置。此外,我們還使用Kafka工具來連接和可視化已配置的代理服務器詳細信息。