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)就是負責協調工作。簡單點說,就是消費者啟動後,到可以正常消費前,這個階段的初始化工作。消費者可以執行起來,全靠協調器的工作。
主要的協調器有以下兩種:
- 消費者協調器
- 組協調器
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