参考:
https://www.jianshu.com/p/a036405f989c (简书:kafka在zookeeper中的使用)
https://blog.csdn.net/qq_28900249/article/details/90240936(CSDN:kafka面试题及答案)
https://blog.csdn.net/qq_34668848/article/details/105611546(CSDN:kafka最全面试题整理)
https://zhuanlan.zhihu.com/p/82998949(知乎:32道常见kafka面试题)
概念
节点(broker),
生产者(producer),
消费者(consumer),
消费者组(consumer group),
主题(topic),
分区(partion),
分段(segment),
偏移量(offset),
副本(replication),
消息(message)
zk与kafka的基本交互关系
1,kafaka集群的 broker,和 Consumer 都需要连接 Zookeeper。Producer 直接连接 Broker。
2,Producer 把数据上传到 Broker,Producer可以指定数据有几个分区、几个备份。上面的图中,数据有两个分区 0、1,每个分区都有自己的副本:0'、 1'。
3,leader 处理 partition 的所有读写请求,与此同时,follower会被动定期地去复制leader上的数据。
5,Topic 分区被放在不同的 Broker 中,保证 Producer 和 Consumer 错开访问 Broker,避免访问单个 Broker造成过度的IO压力,使得负载均衡。
1、Broker注册
Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper。在Zookeeper上会有一个专门用来进行Broker服务器列表记录的节点:
/brokers/ids
每个Broker在启动时,都会到Zookeeper上进行注册,即到/brokers/ids下创建属于自己的节点,如/brokers/ids/[0...N]。
Kafka使用了全局唯一的数字来指代每个Broker服务器,不同的Broker必须使用不同的Broker ID进行注册,创建完节点后,每个Broker就会将自己的IP地址和端口信息记录到该节点中去。其中,Broker创建的节点类型是临时节点,一旦Broker宕机,则对应的临时节点也会被自动删除。
2、Topic注册
在Kafka中,同一个Topic的消息会被分成多个分区并将其分布在多个Broker上,这些分区信息及与Broker的对应关系也都是由Zookeeper在维护,由专门的节点来记录,如:
/borkers/topics
Kafka中每个Topic都会以/brokers/topics/[topic]的形式被记录,如/brokers/topics/login和/brokers/topics/search等。Broker服务器启动后,会到对应Topic节点(/brokers/topics)上注册自己的Broker ID并写入针对该Topic的分区总数,如/brokers/topics/login/3->2,这个节点表示Broker ID为3的一个Broker服务器,对于"login"这个Topic的消息,提供了2个分区进行消息存储,同样,这个分区节点也是临时节点。
5、分区 与 消费者 的关系
消费组 (Consumer Group):
consumer group 下有多个 Consumer(消费者)。
对于每个消费者组 (Consumer Group),Kafka都会为其分配一个全局唯一的Group ID,Group 内部的所有消费者共享该 ID。订阅的topic下的每个分区只能分配给某个 group 下的一个consumer(当然该分区还可以被分配给其他group)。
同时,Kafka为每个消费者分配一个Consumer ID,通常采用"Hostname:UUID"形式表示。
在Kafka中,规定了每个消息分区 只能被同组的一个消费者进行消费,因此,需要在 Zookeeper 上记录 消息分区 与 Consumer 之间的关系,每个消费者一旦确定了对一个消息分区的消费权力,需要将其Consumer ID 写入到 Zookeeper 对应消息分区的临时节点上,例如:
/consumers/[group_id]/owners/[topic]/[broker_id-partition_id]
其中,[broker_id-partition_id]就是一个 消息分区 的标识,节点内容就是该 消息分区 上 消费者的Consumer ID。
6、消息 消费进度Offset 记录
在消费者对指定消息分区进行消息消费的过程中,需要定时地将分区消息的消费进度Offset记录到Zookeeper上,以便在该消费者进行重启或者其他消费者重新接管该消息分区的消息消费后,能够从之前的进度开始继续进行消息消费。Offset在Zookeeper中由一个专门节点进行记录,其节点路径为:
/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]
节点内容就是Offset的值。
7、消费者注册
消费者服务器在初始化启动时加入消费者分组的步骤如下
注册到消费者分组。每个消费者服务器启动时,都会到Zookeeper的指定节点下创建一个属于自己的消费者节点,例如/consumers/[group_id]/ids/[consumer_id],完成节点创建后,消费者就会将自己订阅的Topic信息写入该临时节点。
补充
常用命令
#查看topic: bin/kafka-topics.sh --zookeeper node01:2181 --list #创建topic: bin/kafka-topics.sh --zookeeper node01:2181 --create --topic t_cdr --partitions 30 --replication-factor 2
#查看指定topic信息; bin/kafka-topics.sh --zookeeper node01:2181 --describe --topic t_cdr #生产数据: bin/kafka-console-producer.sh --broker-list node86:9092 --topic t_cdr #消费数据: bin/kafka-console-consumer.sh --zookeeper node01:2181 --topic t_cdr --from-beginning #修改topic分区数: bin/kafka-topics.sh --zookeeper node01:2181 --alter --topic t_cdr --partitions 10 #删除topic,只会删除zookeeper中的信息,消息文件需要手动删除 bin/kafka-run-class.sh kafka.admin.DeleteTopicCommand --zookeeper node01:2181 --topic t_cdr #查看topic某分区偏移量最大(小)值 bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic hive-mdatabase-hostsltable --time -1 --broker-list node86:9092 --partitions 0 #查看消费者群组: ./kafka-consumer-groups.sh --bootstrap-server 192.168.1.132:9092 --list #进入zookeeper命令查看kafka相关信息 bin/zookeeper-shell.sh #重启集群某个节点后,重新进行leader的负载均衡: ./kafka-preferred-replica-election.sh --zookeeper id:port #查看某个topic的offset: ./kafka-consumer-offset-checker.sh --group console-consumer-52639 --topic test1 --zookeeper 172.16.140.9:2181