这个问题有解码?
__consumer_offsets
是存储消费者组的offset的,所以它必须是高可用(副本数大于1)。
__consumer_offsets
分区怎么分布,反正只要首个启动的broker存活,集群就能工作......这句话不够严谨,当你的kafka集群节点为3个的时候,搭建完成之后开始第一次测试的时候,__consumer_offsets
才会创建,__consumer_offsets
就会分布在这3台上,所以挂掉任何一台都会有影响部分消费者。出现这样的问题是因为当你刚刚搭建1台kafka节点的时候,就进行了测试,这个时候__consumer_offsets
创建的时候,只有一个节点,所以会全部创建在首个启动的broker上,所以导致你们认为的首个broker不能挂。
“副本数”是保障kafka的topic分区高可用的关键,__consumer_offsets
也是作为topic来维护的,默认情况下offsets.topic.replication.factor=1
,即使kafka集群调整后,已经创建的topic也不会自动增加,所以必须你手动调整扩展副本数。
参考这里来调整副本数:kafka命令大全之迁移分区
一个消费者组消费消息的offset只会存在__consumer_offsets
里的一个分区上面,所以如果副本只有一份,那就只会在特定的broker上
Topic:consumer_offsets PartitionCount:50 ReplicationFactor:1 Configs:segment.bytes=104857600,cleanup.policy=compact,compression.type=producer
Topic: __consumer_offsets Partition: 0 Leader: 2 Replicas: 2 Isr: 2
Topic: __consumer_offsets Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: __consumer_offsets Partition: 2 Leader: 1 Replicas: 1 Isr: 1
Topic: __consumer_offsets Partition: 3 Leader: 2 Replicas: 2 Isr: 2
但是从这里可以看到,并没有所有partion都在一个broker上,三个broker都有offset的分区。所以你说 "当刚好是这个leader的broker挂掉时,即使其他broker竞选成功为leader,他那里也没有消费者的offsets信息" 似乎并不成立。