Kafka与zk的关系及连接参数bootstrap.server的正确理解
zk在kafka中的作用
kafka消费组
如上图所示,kafka的运行离不开zookeeper,主要在以下方面依赖zookeeper:
集群和生产者相关
1,集群管理,broker的动态上下线。
每个broker在启动成功后会在zookeeper建立临时节点,controller节点监听节点的变化,完成leader的重新选举和消费者的重新负载均衡。
broker上线前在zookeeper中查看:
[zk: localhost:2181(CONNECTED) 79] ls /brokers/ids
[]
broker上线后:
[zk: localhost:2181(CONNECTED) 80] ls /brokers/ids
[0, 1, 2]
保存这个各个broker的地址信息。
2,各个topic的分区信息
[zk: localhost:2181(CONNECTED) 70] get /brokers/topics/input-kafka
{"version":2,"partitions":{"2":[0,1,2],"1":[2,0,1],"0":[1,2,0]},"adding_replicas":{},"removing_replicas":{}}
如上,topic:input-kafka包括三个分区,每个分区有三个副本,还标明了每个分区所在broker信息,如分区“2”分别存放在三个不同的broker上:[0,1,2]
3,分区信息信息、leader信息、leader-follower同步组信息
topic的分区信息:
[zk: localhost:2181(CONNECTED) 82] ls /brokers/topics/input-kafka/partitions
[0, 1, 2]
各个分区的副本信息、leader、leader-follower同步组信息
[zk: localhost:2181(CONNECTED) 84] get /brokers/topics/input-kafka/partitions/0/state
{"controller_epoch":250,"leader":2,"version":1,"leader_epoch":46,"isr":[2,0,1]}
cZxid = 0xa200000110
ctime = Sat Jun 05 23:27:02 HKT 2021
mZxid = 0xb8000001c8
mtime = Fri Jun 25 18:36:08 HKT 2021
pZxid = 0xa200000110
cversion = 0
dataVersion = 76
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 79
numChildren = 0
-
“isr”:[2,0,1] 表示三个副本都是同步的,这里解释下同步的意思,因为是分布式,leader分片写入成功后,副本分片会从leader拉取数据,这中间会有时间延迟,默认是10s,在10s之后follower和leader仍然不同步,则会被溢出isr队列
-
生产者会获取分区信息,拿到各个分区的leader信息,根据负载均衡策略向broker写入消息
消费者相关
注意,消费相关在kafka 0.9以前是保存在zookeeper中,0.9以后不再保存在zookeeper中了,kafka自己保存,可以用kafka tool工具查看。
1,消费进度
以消费者组为单位,统计消费者消费的进度,记录的是分区的偏移量。
0.9以前保存在zookeeper中,0.9以后保存在内建的topic:__consumer_offsets
Kafka 如何读取offset topic内容 (__consumer_offsets)
2,topic分区和消费组的关系
__consumer_offsets 中保存着消费者组、topic、topic分区和offset的信息。