本文主要查看kafka在zookeeper中的一些存储结构,便于更好的理解kafka的工作原理,其测试环境如下:
kafka 0.8.1.1
zookeeper 3.4.5
1 Broker node 注册
当一个kafka broker启动后,会向zookeeper注册自己的节点信息,该节点为一个临时节点,当当broker断开和zookeeper的连接时,其临时节点将会被删除。
其路径为:
/broker/ids/[0...N]
其中[0..N]表示broker id(broker id唯一,不可以重复),znode的值为对应broker的相关信息,如下:
{
"jmx_port": -1, //JMX的端口号
"timestamp": "1460082147315",//broker启动的时间戳
"host": "xx.xxx.xxx.xxx",//host
"version": 1,//默认的版本
"port": 9092 //broker进程的对外监听的端口号
}
如下为zk下的运行实例图:
2 Broker Topic 注册
当一个broker启动时,会向zookeeper注册自己持有的topic和partitions信息。
其路径为:
/broker/topics/[topic]/partitions/[0...N]
其中[0..N]表示partition索引号。其zonode下的信息如下:
{
"controller_epoch": 17,//中央控制器的总的选举次数
"leader": 0, //此partition的broker leader的id
"version": 1, //默认版本号
"leader_epoch": 1,//此partition的leader选举的次数
"isr": [
0
] //同步副本组brokerId顺序列表
}
如下为zk下的运行实例图:
3 Consumer id 注册
在kafka consumer的配置参数中有:
#消费者的ID,若是没有设置的话,会自增
consumer.id
当然,consumer id也可以手动设置。
在zookeeper查看相关consumer id的注册信息,其路径如下:
/consumers/[group_id]/ids/[consumer_id]
这仍然是一个临时的znode,此节点的值为格式如下:
{
"version": 1,
"subscription": {
"user11": 1
},
"pattern": "static",
"timestamp": "1460083658252"
}
{“topic_name”:#streams…},即表示此consumer目前所消费的topic + partitions列表。
如下为zk下的运行实例图:
4 Consumer offset 跟踪
用来跟踪每个consumer group目前所消费的partition中最大的offset。
其路径为:
/consumers/[group_id]/offsets/[topic]/[partition_id]
此znode为永久节点,可以看出offset跟group_id有关,以表明当group中一个消费者失效,其他consumer可以继续消费。
如下为zk下的运行实例图:
5 Partition Owner 注册
用来标记partition被哪个consumer消费,为临时节点。
其路径为:
/consumers/[group_id]/owners/[topic]/[partition_id]
如下为zk下的运行实例图: