kafka物理结构
一个kafka集群由多个broker组成
每个topic由多个partition组成,partition均匀分布在broker中,partition中存储了具体的数据,在broker的{log.dirs}下每个物理文件夹对应一个topic的某个partition,partition数据文件又被分成多个segment,每个segment对应一个数据文件和一个索引文件,
partition的磁盘文件是顺序读写,这是kafka高吞吐的主要原因
每个partition有一个leader和多个replica,leader负责当前partition的读写请求,replica在leader的ISR(in-sync replica)列表中,replica同步leader的数据保证leader的高可用
Kafka Producer
producer发送消息时自己决定某条消息发送给topic的某个partition,可使用round-robbin或hash(msg) mod partition_num选择partition,然后从zk获取partition leader的所在的broker与其通信
Kafka Consumer
Consumer采用pull的方式与leader通信, 由Consumer维护消费状态。
Consumer API分为High Level API和Low Level API。 High Level API简化消费流程,屏蔽kafka内部逻辑结构;Low Level API需consumer控制消费offset,处理brokder/leader变化
High Level API
Consumer Group之间相对独立,互不影响
Consume Group内部每个partion只有一个Consumer
Consumer Group内部的所有Consumer会在zookeeper上注册,并监听consumer/broker/leader的变化,自动进行Consumer Rebance
High Level API默认实现at least once语义
Low Level API(SimpleConsumer)
一般在以下情况需用Low Level API:
- 重复读取一条数据
- 读取一个topic的部分partition数据
- 事物管理,实现exactly once意义
使用SimpleConsumer不仅仅需要关注topic,还需关注底层的broker/partition leader,管理offeset,同时还要处理broker leader切换、partition动态变化
Zookeeper 数据
/brokers/ids/ 记录了kafka集群broker信息
/brokers/topics/{topic_name}/partitions/{partition_num}/state 记录了topic的partition分布,partition leader/replica位置
/consumers/{consumer-group}/ids 记录了consumer group下的所有消费线程
/consumers/{consumer-group}/offersets/{topic_name}/{partition_num} 记录了又consumer commit的每个partition的消费offset
/consumers/{consumer-group}/owners/{topic_name}/{partition_num} 记录了每个partition是由哪个consumer在消费
bin/kafka-topics.sh --describe topic --zookeeper zk-host 读取/broker/topics下的信息
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker 读取/consumers/目录下的相关信息