2017-05-31 33 views
0

有kafka經紀人和動物園管理員的碼頭圖像 - 現在稱其爲z1, b1, b2。 他們被部署在兩臺物理服務器s1s2像這樣:
s1包含z1b1
s2包含b2Docker,Kafka - 複製在遠程經紀人之間不起作用

在自己的docker-compose.yml文件,動物園管理員已經設置端口如下:

- 2181:2181 
- 2888:2888 
- 3888:3888 

和經紀人如下:

- 9092:9092 

可以創建--replication-factor 2--partitions 4的主題。
整個時間內沒有數據被推送到主題,但仍然出現以下問題。
如果kafka-topics --describe --topic <name_of_topic> --zookeeper <zookeeperIP:port>在主題創建後不久運行,則全部爲insync,並且看起來不錯。
在第二輪(有短暫的延遲),b1刪除b2分區副本從它的insync,但b2不會insync刪除b1分區副本。

在從b1 server.log中,有許多展示這些異常:

WARN [ReplicaFetcherThread-0-1], Error in fetch [email protected] (kafka.server.ReplicaFetcherThread) 
java.io.IOException: Connection to ef447651b07a:9092 (id: 1 rack: null) failed 
    at kafka.utils.NetworkClientBlockingOps$.awaitReady$1(NetworkClientBlockingOps.scala:83) 
    at kafka.utils.NetworkClientBlockingOps$.blockingReady$extension(NetworkClientBlockingOps.scala:93) 
    at kafka.server.ReplicaFetcherThread.sendRequest(ReplicaFetcherThread.scala:248) 
    at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:238) 
    at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:42) 
    at kafka.server.AbstractFetcherThread.processFetchRequest(AbstractFetcherThread.scala:118) 
    at kafka.server.AbstractFetcherThread.doWork(AbstractFetcherThread.scala:103) 
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63) 

交換領導工作的經紀人b1b2之間,因爲它們只有最後一個關閉並重新啓動,但隨後在線完全控制話題 - 即使其他經紀人重新聯機,也是所有分區的領導者,並且只有一個insync

嘗試清理所有數據,重置經紀人和動物園管理員,但問題仍然存在。

爲什麼分區沒有正確複製?

回答

0

我想通了。正如Michael G. Noll所說,網絡存在問題。
首先,我不再手動映射端口,而是使用host網絡。這很容易管理。
Secenodary,B1和B2已經建立像這樣的聽衆:

listeners=PLAINTEXT://:9092 

她們都沒有指定的IP,所以0.0.0.0使用默認並有collission,因爲他們都聽了有推相同的連接信息的ZooKeeper 。

最終配置
b1b2docker-compose.yml使用host網絡:

network_mode: "host" 

b1 server.properties` - 聽衆:

listeners=PLAINTEXT://<s1_IP>:9092 

b2 server.properties` - 聽衆:

listeners=PLAINTEXT://<s2_IP>:9092 

現在一切正常,複製正在工作,即使在代理重啓時也是如此。 可以正確生成和使用數據。

2

它看起來像經紀人b1b2不能互相交談,這表明Docker相關的網絡問題(和這種Docker網絡問題在一般情況下相當普遍)。

您需要分享更多信息才能獲得進一步的幫助,例如,文件的(一個或多個)docker-compose.yml的內容以及例如您用來創建圖像的Dockerfile。我還想知道爲什麼您爲兩個經紀人創建了不同的圖像,通常您只需要一張卡夫卡經紀人圖像,然後只需從該圖像中啓動多個容器(每個希望的經紀人一個)。

+0

感謝您的回覆。我無法在這裏粘貼docker文件;因爲現在只有網絡設置很重要,所以它毫無意義。 docker-compose.yml中的端口如問題所述映射,zookeepers客戶端端口設置爲2181;並且兩個kafka經紀人都有聽衆= PLAINTEXT://127.0.0.1:9092。我也試過不指定IP和更改端口,所以經紀人被映射到0.0.0.0:9092和0.0.0.0:9093,但問題仍然存在。還請閱讀REPLICATION偵聽器 - 是否應該將其設置爲我只有PLAINTEXT指定的? – milkamar

+0

你的環境是什麼?你運行這個例如本地Mac或Kubernetes內?你在使用docker-machine或者Linux VM嗎?或者...?這會影響Docker的網絡功能。此外,顯示Docker文件並不毫無意義,因爲您不斷詢問有關Docker設置的問題,並且在無法看到完整圖片時很難幫助您進行調試 - 例如,主機網絡模式還是網橋模式?你如何設置容器的'hostname'? –