使用Docker設置Apache Kafka的指南

1.概述

Docker是軟件行業中用於創建,打包和部署應用程序的最流行的容器引擎**之一。在本教程中,我們將學習如何使用Docker進行Apache Kafka設置。

2.單節點設置

單節點Kafka代理設置可以滿足大多數本地開發需求。因此,讓我們從學習此簡單的設置開始。

2.1 docker-compose.yml配置

要啟動Apache Kafka服務器,首先,我們需要啟動Zookeeper服務器。我們可以**docker-compose.yml文件中配置此依賴關係**,這將確保Zookeeper服務器始終在Kafka服務器之前啟動,並在它之後停止。

讓我們用兩個服務創建一個簡單docker-compose.yml zookeeperkafka

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服務器建立連接**,稍後,我們將可視化此設置:
使用Docker設置Apache

我們必須注意,我們需要使用**Bootstrap servers屬性連接到**監聽主機的29092

最後,我們應該能夠在左側欄中看到連接:

使用Docker設置Apache

因此,“主題”和“消費者”的條目為空,因為它是一個新設置。創建主題之後,我們應該能夠跨分區可視化數據。此外,如果有活躍的使用者連接到我們的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-1zookeeper-2正在偵聽端口2181 ,但它們分別2218132181將其暴露給主機。相同的邏輯適用於kafka-1kafka-2服務,它們將分別在端口2909239092,上偵聽。

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工具連接到集群:

使用Docker設置Apache

最後,讓我們看一下集群中可用的多個代理節點:

使用Docker設置Apache

4 結論

在本教程中,我們使用Docker技術創建Apache Kafka的單節點和多節點設置。此外,我們還使用Kafka工具來連接和可視化已配置的代理服務器詳細信息。