1. 程式人生 > 實用技巧 >kafka Group Coordinator lookup for group xxx failed 解決方法

kafka Group Coordinator lookup for group xxx failed 解決方法

前因

今天在調應用的時候,email-service服務無法收發郵件。

看到這種問題,我先去查了一下email-service的日誌,看到了kafka的一個報錯:

Group coordinator lookup for group email-service failed

然後我就去查資料,解決這個問題。

解決

首先,我想先去清空一下這個email-service消費組的offset,但是它仍然報出了coordinator failed這種字樣的錯誤。那我就想了,kafka的這個coordinator(協調器)到底是什麼東西,是怎麼工作的。

害,先不管這個了,畢竟要先排掉錯誤嘛,原理放在後邊說。

於是我重啟了應用,再去查詢email-service的日誌時,發現這個錯誤:

Group coordinator lookup for group email-service failed: The coordinator is not available

於是我去查詢kafka的配置檔案,果然發現了問題。

在配置檔案中(預設為config/server.properties), 將這幾項引數修改成下面的樣子:

offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2

然後重啟kafka,報錯消除。

解釋

之前的文章丟擲了一個問題,什麼是協調器(coordinator)。

顧名思義,協調器(coordinator)就是負責協調工作。簡單點說,就是消費者啟動後,到可以正常消費前,這個階段的初始化工作。消費者可以執行起來,全靠協調器的工作。

主要的協調器有以下兩種:

  1. 消費者協調器
  2. 組協調器

kafka引入協調器有其歷史過程,原來consumer資訊依賴於zookeeper儲存,當代理或消費者發生變化時,引發消費者平衡,此時消費者之間是互不透明的,每個消費者和zookeeper單獨通訊,容易造成羊群效應和腦裂問題。

為了消除此問題,kafka引入了協調器。

  • 服務端引入了組協調器(GroupCoordinator),消費者端引入消費者協調器(ConsumerCoordinator)。

  • 每個broker啟動的時候,都會建立組協調器例項,管理部分消費組和組下每個消費者消費的偏移量。

  • 每個消費者例項化時,同時例項化一個消費者協調器,負責同個消費組下各個消費者和服務端組協調器之間的通訊。

由於zookeeper並不適合頻繁的寫入操作,從0.8.2版本開始kafka開始將consumer的位移資訊寫入kafka內部的topic中,具體為"__consumer_offsets"。並且預設提供了kafka_consumer_groups.sh指令碼,方便使用者查詢consumer group和consumer資訊。

我們可以檢視__consumer_offsets的內容,它包括三部分內容:

<Group ID,主題名,分割槽號>

PS: 這個__consumer_offsets是kafka內部的topic,外界無法直接讀取此topic裡邊的資訊。如果要讀取的話,需要先修改config/consumer.properties中的"exclude.internal.topics"引數,將其置為false,如下:

exclude.internal.topics=false

然後通過命令來查詢資訊:

# 0.11.0.0之前版本
sh kafka-console-consumer.sh --topic __consumer_offsets --zookeeper localhost:2181 --formatter "kafka.coordinator.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties

# 0.11.0.0之後版本(含)
sh kafka-console-consumer.sh --topic __consumer_offsets --bootstrap-server localhost:9092 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties