zk+controller:controller通过抢占zk节点选举
topic/partition/replica/broker变动:一般先zk,controller监听zk,本地Partition/ReplicaStateMachine处理,元数据同步至其他broker+更新zk
zk和broker的元数据是一致的,为啥不先更新zk,其它broker通过zk获取元数据变更?普通broker很少注册watch,避免羊群效应,即普通broker对zk的依赖很轻的,其元数据来自controller
zk的主要作用:
1 集群管理:每个broker都注册相应watch,竞争controller,感知集群状态
2 通知controller:各种数据变动能通知controller进行统一处理, 如新增了topic,zk变动后controller才能进行分配
3 获取元数据:我们或一些dashboard能zk上看到元数据
consumer rebalance:每个broker都是group coordinator
位点存储:0.9之前是zk,之后内置topic
消费组位点存储在内置topic的partition为P,P的leader所在节点为消费组的coordinator
consumer上线(主动joinGroup)
consumer下线(session.timeout, heartbeat.interval)
consumer主动离开(max.poll.interval, 消费消息慢,两次poll间隔长,consumer发起LeaveGroup)
topic/partition变化
coordinator感知到上述情况需要rebalance,在heartbeat的resp中说明,consumer纷纷joinGroup
coordinator等待一定时间,暂定一个leader,发出joinGroup的resp
consumer接到joinGroup的resp,非leader发起SyncGroup,leader分配后发起SyncGroup(带分配结果)
coordinator给各consumer SyncGroup的resp(带分配结果)
consumer和coordinator的常规通信:heartbeat和offsetCommit(coordinator将其放入内置topic)