1、kafka的工作流程
Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic的。
topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。
2、kafka的存储机制
kafka采取了分片和索引机制,每个partition分为多个segment。每个segment包含“0000xxxx.index”文件和”0000xxxx.log“文件,xxxx是当前segment第一条消息的偏移量。这些文件存在同一个文件夹,文件夹命名规则:topic名称+分区序号。
3、kafka生产者
- 分区的原因:
- 方便集群扩展,可以自定义partition的大小来适应集群大小;
- 可以提高并发,因为可以以partition为单位读写;
- 分区的原则:
- partition的值;
- 无partition的值,有key,将key的hash值与partition的数量取余得到partition的值;
- 无partition,无key,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法。
- 数据可靠性
- 生产者发送消息到topic,topic的partition收到数据,会返回ack;
- ack机制:
- 全部接受完,才发送ack
- ISR(动态维护follower,时间阈值由replica.lag.time.max.ms决定)
- ack应答机制
- 0 不需要返回ack
- 1 leader接受完,未等follower同步,就返回ack
- -1 follower同步完,返回ack
- 故障处理(LEO:每个副本最大的offset;HW:消费者见到的最大的offset,ISR队列中最小的LEO)保证数据一致性,不保证数据不丢失或者不重复
- follower故障
- follower 的 LEO 大于等于该 Partition 的 的 HW
- leader故障
- 截掉高于HW的数据
- follower故障
- 数据完整性(Exactly Once严格一次)
- At Least Once + 幂等性 = Exactly Once
4、Kafka消费者
- 消费方式:pull(拉)
- 分区分配策略
- RoundRobin(轮询分区)
- Range(范围分区,默认为此策略)
- offset维护
- Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始,
consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets。