- zookeeper: 负责集群元数据管理、控制器的选举等操作
- producer: 将消息发送到 broker
- broker: 将收到的消息存储到磁盘中
- consumer: 负责从 broker 订阅并消费消息
- topic: 消息主题(逻辑概念),生产者和消费者都以 topic 为单位进行生产和消费
- partition: 分区(也称作 topic-partition 主题分区,topic 的物理概念),同一个 topic 可以分为多个 partition,一个 partition 只属于单个 topic。分区在存储层面可以看做一个可追加的日志文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。offset 是消息在分区中的唯一标识,kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,kafka 保证的是分区有序而不是主题有序。
分区的副本机制
一个分区可以有多个副本,一主多从,leader 副本负责处理读写请求,follower 副本只负责与 leader 副本的消息同步。多个副本处于不同的 broker 中,当某个 broker 失效后仍能保证服务可用。
不同分区的同步速度不一致,kafka 把同步程度不同的副本做了区分:
- AR (Assigned Replicas): 所有副本的统称。AR = ISR + OSR。
- ISR (In-Sync Replicas): 与 leader 保持一定程度同步的副本。当 leader 故障时,只有在 ISR 集合中的副本才有资格被选举为新的 leader
- OSR (Out-of-Sync Replicas): 与 leader 同步滞后过多的副本。
偏移量的一些概念与 ISR 的关系:
- HW (High Watermark) 高水位:一个特定的 offset,消费者只能拉取到这个 offset 之前的消息(消息可见性)。
- LEO (Log End Offset): 当前日志文件中下一条待写入消息的 offset。
- 三者之间的关系:ISR 集合中最小的 LEO 即为分区的 HW。
举个例子:
- 假设有一个分区 leader 副本为 L1,有两个 follower 副本为 F1, F2
- 此时,L1, F1, F2 的同步进度一致,都有三条消息m0,m1,m2
- 2个 follower 副本都处于 ISR 集合,LEO都为 2,所以 HW 为 2
- 这时生产者写入两条消息 m3,m4
- F1 同步速度快,同步了两条消息,F2同步速度慢,只同步了 m3
- 此时,F1 的 LEO 为 4,F2 的 LEO 为3,当前分区的 HW 取最小值为 3
- 之后 F2 也同步了 m4,LEO 变为 4
- F1 和 F2 的 LEO 都为 4,HW 也为4
(详细可以见书中的流程图,这里就不贴图了)