簡體   English   中英

Kafka Broker 找不到集群 ID 並在 docker 重啟后創建新的集群 ID

[英]Kafka Broker doesn't find cluster id and creates new one after docker restart

我已經使用 kafka 代理和動物園管理員創建了 docker 以使用運行腳本啟動它。 如果我重新啟動,它會正常啟動並運行正常(Windows -> WSL -> 兩個 tmux 窗口,一個會話)。 如果我關閉 kafka 或 zookeeper 並重新啟動它,它將正常連接。

當我停止 docker 容器(docker stop my_kafka_container)時出現問題。 然后我從我的腳本 ./run_docker 開始。 在開始之前的那個腳本中,我刪除舊容器docker rm my_kafka_container然后docker rm my_kafka_container run。

Zookeeper 正常啟動,並且在文件 meta.properties 中,它具有上次啟動時的舊集群 ID,但 kafka 代理由於某種原因無法通過 znode cluster/id 找到此 id 並創建新的,這不是存儲在 meta.properties 中的。 我得到

  ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.common.InconsistentClusterIdException: The Cluster ID m1Ze6AjGRwqarkcxJscgyQ doesn't match stored clusterId Some(1TGYcbFuRXa4Lqojs4B9Hw) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
        at kafka.server.KafkaServer.startup(KafkaServer.scala:220)
        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
        at kafka.Kafka$.main(Kafka.scala:84)
        at kafka.Kafka.main(Kafka.scala)
[2020-01-04 15:58:43,303] INFO shutting down (kafka.server.KafkaServer)

如何避免代理更改它的集群 ID?

如果您 100% 確定您正在連接到正確的 ZooKeeper 和正確的 Kafka 日志目錄,但由於某些原因,事情不匹配,並且您不想在嘗試恢復時丟失所有數據:

Kafka 數據目錄(檢查 config/server.properties 的log.dirs屬性,它默認為/tmp/kafka-logs )包含一個名為meta.properties的文件。 它包含集群 ID。 這應該與注冊到 ZK 的 ID 匹配。 要么編輯文件匹配 ZK,編輯 ZK 匹配文件,要么刪除文件(它包含集群 ID 和代理 ID,第一個當前已損壞,第二個正常在配置文件中)。 在這個小手術之后,Kafka 會從你現有的所有數據開始,因為你沒有刪除任何數據文件。

像這樣: mv /tmp/kafka-logs/meta.properties /tmp/kafka-logs/meta.properties_old

我在使用 Docker 時遇到了同樣的問題。 此問題自 Kafka 2.4 以來出現,因為添加了檢查以查看 Zookeeper 中的集群 ID 是否匹配。 它將集群 ID 存儲在 meta.properties 中。

這可以通過使 Zookeeper 數據持久化而不僅僅是 Zookeeper 日志來解決。 例如使用以下配置:

volumes:
  - ~/kafka/data/zookeeper_data:/var/lib/zookeeper/data
  - ~/kafka/data/zookeeper_log:/var/lib/zookeeper/log

您還應該刪除 Kafka 日志中的 meta.properties 文件一次,以便 Kafka 從 Zookeeper 檢索正確的集群 ID。 之后,ID 應該匹配,您就不必再這樣做了。

您還可能會遇到 2.4 中也添加的 snapshot.trust.empty 錯誤。 您可以通過添加 snapshot.trust.empty=true 設置或在升級到 2.4 之前使 Zookeeper 數據持久化來解決此問題。

我已經嘗試了大部分答案,並找到了真正有效的方法(丟失我的所有數據和記錄)。
僅適用於 WINDOWS 操作系統
因此,正如其他人所建議的那樣,我們確實需要為兩者更改並設置數據目錄的默認路徑

server.properties 中的 Kafka 和
zookeeper.properties 中的 Zookeeper

//記住這很重要,如果你在windows上給雙斜線。
對於卡夫卡
log.dirs=C://kafka_2.13-2.5//data//kafka

動物園管理員也一樣
dataDir=C://kafka_2.13-2.5//data//zookeeper

顯然你需要在設置任何東西之前先創建上面列出的文件夾

然后嘗試運行zookeeper和Kafka自從改變路徑后就沒有遇到過這個問題。
在此之前,我有一個“/”,它只工作了一次,然后又變成了“”,這也只工作了一次。

編輯並且不要忘記正確終止進程
kafka-server-stop.bat 和
zookeeper-server-stop.bat

解決這個問題:

  1. 只需將所有創建(或生成)的日志/數據文件刪除到 zookeeper 和 kafka 中。
  2. 運行動物園管理員
  3. 運行卡夫卡

這對我有用,但我無法解釋為什么......試一試並告訴我。

希望這對你有用 =)

meta.properties 中有一個cluster.id屬性,只需將 id 替換為錯誤日志中的說明即可。
meta.properties 文件在kafka.logdir 中 你可以從 Kafka config server.properties 中學習 kafka.logdir。 下面舉個例子。

cat /opt/kafka/config/server.properties | grep log.dirs
Expected output:
log.dirs=/data/kafka-logs

一旦你找到 meta.properties 文件就改變它。 更改后它應該是這樣的。

#
#Tue Apr 14 12:06:31 EET 2020
cluster.id=m1Ze6AjGRwqarkcxJscgyQ
version=0
broker.id=0

Kafka 過去是用其他/其他動物園管理員實例啟動的,因此舊的動物園管理員 ID 被注冊在其中。 在 Kafka config 目錄中,打開 kafka 配置屬性文件讓我們說 server.properties 找到帶有參數 log.dirs= 的日志路徑目錄,然后轉到日志路徑目錄並在其中找到文件 meta.properties。 打開文件 meta.properties 並更新 cluster.id= 或從日志路徑目錄中刪除此文件或所有日志文件並重新啟動 kafka。

這是由於 Kafka 2.4.0 版本中引入了一項新功能,它是[KAFKA-7335] - Store clusterId locally to ensure broker joins the right cluster clusterId重啟發生時,由於這個不匹配,Kafka嘗試將本地存儲的clusterId與Zookeeper的clusterId (由於clusterId重啟而改變)進行匹配,拋出上述錯誤。 請參閱此鏈接以獲取更多信息。

編輯meta.properties並刪除帶有cluster.id行並重新啟動 kafka。

在 Linux 服務器上,它位於/var/lib/kafka/meta.properties

對所有服務器執行此操作。 zookeeper 將為代理提供新的集群 ID。

在我的情況下,這是由於缺少 zookeeper 集群的配置,或者更准確地說,每個 zookeeper 節點都獨立工作,因此集群 ID 等數據未在 kafka 節點之間共享。 當一個 kafka 節點在其他節點已經開始運行后啟動時,它沒有通過 zookeeper 識別出已經建立了一個集群 id 並創建了一個新的集群 id,並嘗試與類似地給自己不同的 id 的其他節點通信。

要解決此問題:

  1. 我們需要清除kafka/config/zookeeper.properties文件中dataDir定義的zookeeper目錄
  2. 在此文件夾中添加一個名為myid的文件, myid包含每個 zookeeper 節點的myid標識
  3. 將以下配置添加到每個kafka/config/zookeeper.properties文件中:
tickTime=2000
initLimit=5
syncLimit=2
server.1=<zookeeper node #1 address>:2888:3888
server.2=<zookeeper node #2 address>:2888:3888
server.3=<zookeeper node #3 address>:2888:3888
  1. 從位於kafka/config/server.properties文件中log.dirs屬性描述的路徑中的meta.properties文件中刪除cluster.id行或完全刪除此文件

您可以參考zookeeper文檔了解更多信息: https : //zookeeper.apache.org/doc/r3.3.3/zookeeperStarted.html#sc_RunningReplicatedZooKeeper

嘗試以下...

  1. 在 ./config/server.properties 中啟用以下行

    聽眾=PLAINTEXT://:9092

  2. 修改默認 ZooKeeper dataDir

  3. 修改默認的Kafka日志目錄

對於 Windows,重命名或刪除這個meta.properties有助於啟動 kafka 並且一旦啟動就創建了觀察文件。

{kafka-installation-folder}\softwareskafkalogs\meta.properties

我在 Windows 機器上運行 Kafka 服務器時遇到了同樣的問題。

您可以嘗試以下操作來解決此問題:

  1. 打開位於 kafka 文件夾 kafka_2.11-2.4.0\\config 中的服務器 server.properties 文件(考慮到您的 kafka 版本,文件夾名稱可能是 kafka_)
  2. 搜索條目 log.dirs
  3. 如果您的 log.dir 路徑包含像這樣的 Windows 目錄路徑 E:\\Shyam\\Software\\kafka_2.11-2.4.0\\kafka-logs 其中有一個單反斜杠,即 \\,請將其更改為雙反斜杠,即使用 \\

希望能幫助到你。 干杯

試試這個:

  • 打開位於 kafka 文件夾 kafka_2.11-2.4.0\\config 中的服務器 server.properties 文件
  • 搜索條目 log.dirs
  • 如果您指定了目錄 C:....... 將其更改為相對於當前目錄。 示例 log.dirs=../../logs

這對我有用:)

在此處輸入圖片說明

我就是這樣解決的。 我搜索了這個文件,重命名它並成功啟動它並創建了一個新文件。

我是mac下brew安裝的Kafka

希望這對你有幫助。

如果在測試期間,您嘗試啟動 EmbeddedKafka 代理,並且您的測試用例沒有清理臨時目錄,那么您將不得不手動刪除 kafka 日志目錄以解決此錯誤。

錯誤 -> 集群 ID Ltm5IhhbSMypbxp3XZ_onA 與 meta.properties 中存儲的 clusterId Some(sAPfAIxcRZ2xBew78KDDTg) 不匹配。 代理正在嘗試加入錯誤的集群。 配置的zookeeper.connect 可能是錯誤的。

Linux ->

轉到 /tmp/kafka-logs 檢查 meta.properties 文件

使用 vi meta.properties 將集群 id 更改為所需的 id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM