zk进行 kafka 集群元数据和状态管理,未来将去zk,用Raft实现,zk集群主要作用:
1)存元数据: 主题分区所有数据都存在 zk 中,其他都要与它对齐
2)成员管理: 是指 Broker 节点注册、注销以及属性变更
3)Controller 选举: 选集群 Controller,其他管理任务包括但不限于主题删除、参数配置
zk主要选举controller,offset、leader选举都不依赖zk:controller在选主后在handleleaderandisrrequest中带上brokerepoch,leaderepoch信息,如本地信息比发送来的新,不更新,如自己是follower就开始轮询数据,follower是不知道log落后多少的,只是轮询数据。拉取数据时通过leaderepoch和startoffset确定数据回溯和拉取的数据点
Controller 只会向 Broker 发送三类请求,分别是 LeaderAndIsrRequest、StopReplicaRequest 和 UpdateMetadataRequest。请求必然包含 3 个字段。controllerId:Controller 所在的 Broker ID。controllerEpoch:Controller 的版本信息。brokerEpoch:目标 Broker 的 Epoch。
如果broker不是controller,就不需要关心leader epoch,如果被选举为controller,则需要从zk上同步元数据,除了epoch,还有isr,topic信息等
所以broker的元数据缓存会保存当前controller的brokerid,除非收到zk的更新事件,否则一直同步数据就行了
一、kafka 集群数据zk 中存储&分布
admin: 存管理员接口操作信息,主要为 topic 删除事件,分区迁移事件,优先副本选举,信息 (一般为临时节点)
brokers: broker 节点、节点上topic信息
cluster: 存kafka 集群信息
config: 存储 broker,client,topic,user 及 changer 配置信息
consumers: 存消费者信息 (一般空)
controller: 存控制节点信息 (用于 controller 节点注册,是临时节点)
controller_epoch: 存 controller 节点年龄
isr_change_notification: 存 isr 的变更通知 (临时节点,当有 isr 进行变动,事件通知,可进行 watch 获取集群 isr 状态变更)
latest_producer_id_block: 该节点用于存储处理事务相关的 pid 范围
log_dir_event_notification: 日志目录事件通知
brokers 目录结构:
https://zhuanlan.zhihu.com/p/149884955
ps:消费元数据是保存在consumer端的,先读逻辑队列consumQue中元数据,再从commitlog找消息体
网友评论