Kafka 几个基本概念
本文介绍了 broker、topic、partition、replica、offset、leader、follower、ISR和consumer group几个概念和他们之间的关系
1、broker
- broker 指一个 kafka 服务器。
- 多个 broker 依靠 Zookeeper 集群进行服务的协调管理。
- 生产者发送消息给 Kafka 服务器。
- 消费者从 Kafka 服务器读取消息。
2、topic(主题)
- topic 只是一个逻辑概念,代表了一类消息,可以使用 topic 来区分实际业务,比如业务A使用一个 topic ,业务B使用另外一个 topic。
- topic 可以被多个消费者订阅。
- 每条消息属于且仅属于一个 topic。
- Producer 发布数据时,必须指定将该消息发布到哪个 topic。
- Consumer 订阅消息时,也必须指定订阅哪个 topic 的信息。
- 一个 Topic 包含一个或多个 Partition。
3、partition(分区)和 segment
- partition 是不可修改的有序消息序列,也可以说是有序的消息日志。
- partition 的引入是为了提升系统的吞吐量,因此在创建 Kafka topic 的时候可以根据集群实际配置设置具体的 partition 数,实现整体性能的最大化。
- 物理上每个 partition 对应的是一个目录,目录名为 topic 名称 + 有序序号,例如名为test的topic下创建了三个 partition,三个分区在 /tmp/kafka-logs 下的目录名分别为 test-01、test-02、test-03。
- 一个 topic 下的多个 partition 可以分布在多台 broker 上,也可以在一台 broker 上。
- 每个 partition 都有一个为 leader,负责读写,其余的相对备份机为 follower,follower 同步 leader 数据,负责 leader 死了之后的接管。n 个 leader 均衡的分散在每个 broker 上。
- 每个 partition 包含多个 segment 文件,segment 是消息存储的真实文件,会不断生成新的。进入 test-01 会发现如下文件列表:
00000000000000000000.index 00000000000000000000.log 00000000000000170410.index 00000000000000170410.log 00000000000000239430.index 00000000000000239430.log
以上是segement文件列表,segement 文件由索引文件 (.index) 和日志文件 (.log) 组成,大家会发现文件名是一个整数编号,20个整数数值组成,不足位数补零。第一个 segement 文件名从0开始,当log文件消息数量达到阈值,就会新建另一个segement文件,这个segement文件的名称是上一个 segement log 文件最后一条消息的 offset 位移值。
- 生产者发到某个 topic 的消息会被均匀的分布到多个 partition 上,broker 收到发布消息往对应 partition 的最后一个 segment 上添加该消息。

- 每一个 partition 都是有序的,partition 上的每条消息都会被分配一个唯一的序列号,按照 Kafka 的术语来讲,该序列号被称为位移( offset )。该位移是从0开始顺序递增的整数。位移信息可以唯一定位到某 partition 下的一条消息。
4、offset(位移)
前面说过, topic partition 下的每条消息都被分配一个位移值。实际上 Kafka 消费者端也有位移( offset )的概念,但一定要注意这两个 offset 属于不同的概念,如图:
消息位移与消费者位移
显然,每条消息在某个 partition 位移是固定的,但消费该 partition 的消费者的位移会随着消费进度不断前移,但终究不可能超过该分区最新一条消息的位移 。
5、replica(副本)
partition 可以有多个副本,否则一旦保存 partition 的broker挂掉了,其上保存的消息也就都丢失了。
副本分为领导者副本( leader replica )和追随者副本( follower replica )。follower replica 是不能提供服务给客户端的,也就是说不负责响应客户端发来的消息写入和消息消费请求。它只是被动地向领导者副本( leader replica )获取数据,而一旦 leader replica 所在的broker 岩机, Kafka 会从剩余的 replica 中选举出新的 leader 续提供服务。
6、leader 和 follower
如前所述, Kafka replica 分为两个角色:领导者( leader )和追随者( follower ).。和传统主备系统(比如MySQL )不同的是,在这类 leader-follower 系统中通常只有 leader 对外提供服务, follower 是被动地追随 leader 的状态,保持与 leader 的同步。 follower 存在的唯一价值就是充当 leader 的候补:一旦 leader 挂掉立即就会有一个追随者被选举成为新的 leader 接替它的工作。
Kafka 保证同 partition 的多个 replica 一定不会分配在同一台 broker 。毕竟如果同一broker 上有同一个 partition 的多个 replica ,那么将无法实现备份冗余的效果。

7、ISR
ISR 全称是 in-sync replica ,翻译过来就是与 leader replica 保持同步的 replica 集合 。前面讲了一个 partition 可以配置 N 个 replica ,那么这是否就意味着该 partition 可以容忍 N-1 个 replica 失效而不丢失数据呢?答案是“否”!
Kafka partition 动态维护 replica 集合。该集合中的所有 replica 保存的消息日志都与leader replica 保持同步状态。只有这个集合中的 replica 才能被选举为 leader ,也只有该集合中所有 replica 都接收到了同一条消息, Kafka 才会将该消息置于“己提交”状态,即认为这条消息发送成功。回到刚才的问题, Kafka 承诺只要这个集合中至少存在一个 replica ,那些“己提交”状态的消息就不会丢失一一记住这句话的两个关键点:(1)ISR 中至少存在一个“活着的” replica; (2)”已提交“的消息 。Kafka 对于没有提交成功的消息不做任何交付保证,它只保证在 ISR 存活的情况下“己提交”的消息不会丢失。
正常情况下, partition 的所有 replica (含 leader replica )都应该与 leader replica 保持同步,即所有 replica 都在 ISR 中。因为各种各样的原因,一小部分 replica 开始落后于 leaderreplica 的进度 。当滞后一定程度时, Kafka 会将这些 replica “踢”出 ISR 。相反地,当这些 replica 重新“追上”了 leader 进度时 那么 Kafka 会将它们加回到 ISR 中。这一切都是自动维护的,不需要用户进行人工干预,因而在保证了消息交付语义的同时还简化了用户的操作成本。
8、consumer group
每一个分区只能被一个消费组中的一个消费者所消费。如果1个group下面有3个消费者,但是分区partition只有一个,那么三个消费者中有两个会因为分配不到分区而无法消费消息。
消费组内消费者数量变更,topic下分区会重新分配消费者。
浙公网安备 33010602011771号