简单记录下kafka中的基本概念、术语。
Apache Kafka是一个消息引擎、分布式流处理平台。
松耦合
隔离上下游业务,减少系统之间交互,简化开发。削峰填谷
当请求暴增,kafka可以缓冲(缓存)上游瞬时突发的流量,让下游系统无感知并平滑消费,避免下游系统遭到流量不规则冲击。
对于那种发送能力很强的上游系统,如果没有消息引擎的保护,下游系统可能会直接被压垮导致全链路服务"雪崩";
kafka够有效地对抗上游的流量冲击,真正做到将上游的“峰”填满到“谷”中,避免了流量的震荡;
上面两个是kafka最显而易见的作用,kafka还可以用作数据处理、流处理平台等。
1. 图例
2. kafka broker
以下是kafka broker中相关的一些概念信息。
概念 | 含义 |
---|---|
broker | 一台kafka server就是一个broker |
broker集群 | 多个broker组成broker集群 |
topic(主题) | 发布、订阅的对象 |
partition(分区) | 一个topic中包含成多个partition,每个partition是一个有序的队列; 类似 elasticsearch 中的 sharding(分片); |
replication(副本) | partition的副本(备份)机制 |
AR | assigned replicas parition(分区)所属的全部副本 ISR + OSR |
ISR | in sync replica 与 Leader Replica(partition主副本)保持消息数据同步的Follower Replica(partition从副本)的集合 |
OSR | 与 Leader Replica(partition主副本)保持消息数据同步存在差距的Follower Replica(partition从副本)的集合 |
offset(partition offset) | 消息在partition中的位置 |
producer | 消息数据的生产者 |
ack(ack机制) | producer(生产者)消息数据发送确认机制 |
2.1. broker
kafka在服务器上的进程被称为broker;
broker部分职责是接收和处理客户端发送过来的请求,以及对消息进行持久化;一个broker可以容纳多个topic。
2.2. broker集群(kafka集群)
多个broker可以组成集群;
集群中会选举出有一个broker同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来);
2.3. topic(主题)
topic是一个逻辑概念,代表的是一类消息数据,也可以认为是消息被发送到的目的地,通常用topic来区分实际业务;
在kafka中发布订阅的对象是topic,如果需要可以为每个业务、应用,甚至是某类数据创建专属的topic;kafka集群模式下,一个 topic可以横跨多个borker。
出于性能、高可用的考量,kafka采用的不是topic - message两级结构,而是topic - partition - message三级结构,以此分散负载。
2.4. partition(分区)
topic可以由一个或多个partition(分区)组成,可以简单粗暴的将partition(分区)理解成先入先出的队列;
producer(生产者)生产的消息数据以追加的形式写入partition(分区),然后consumer(消费者)从partition(分区)中按顺序读取,消息数据只会存在于一个partition(分区)中。
要注意,由于topic(主题)一般包含几个partition(分区),因此无法在整个topic(主题)范围内保证消息的顺序,但可以保证消息在单个partition(分区)内的顺序
2.5. replication(replica)
replication意味着partition(分区)拥有多个副本,是的,replication它作用于partition(分区)层面上并分布在多个borker中;
这样可以保证高可用,防止其中一个borker出现故障,无法为consumer提供服务;
replication(replica)存在的唯一意义就是数据冗余,防止数据丢失,保证高可用。
replication的数量是可以配置的,这些分区副本保存着相同的数据,但它们有不同的角色和作用;
Leader Replica(主副本、partition主副本)
负责与外部交互。
Follower Replica(从副本、partition从副本)
跟随 Leader Replica,只存储数据,不参与外部交互。
producer(生产者)生产的消息总是写到Leader Replica(partition主副本)中,而consumer(消费者)总是从 Leader Replica(partition主副本)中读消息;
Follower Replica(partition从副本)只做一件事:向Leader Replica(partition主副本) 发送请求,请求Leader Replica(partition主副本)把最新的消息发送给它,这样Follower Replica(partition从副本)中的数据才能与 Leader Replica(partition主副本)保持同步;
通过这种机制可以保证高可用;当某台机器挂掉后,consumer(消费者)从Leader Replica(partition主副本)无法读取消息时,kafka会从剩余的Follower Replica(partition从副本)中选举出新的leader,重新对外提供服务。
2.6. replication-factor(replica数量)
在手动创建topic(主题)时,有一个参数replication-factor,它决定了topic(主题)中partition(分区)的副本数量。
如果该参数设置为1,意味着消息数据只存在于Leader Replica(partition主副本),如果Leader Replica(partition主副本)所在的broker宕机,会直接导致数据丢失。
为了提高数据安全性,避免主题中消息数据丢失,建议将此参数设置大于1;例如将此参数设置成3,即一个Leader Replica(主副本、partition主副本)和2个Follower Replica(partition从副本)
假设一个topic(主题)通过手动创建,replication-factor设置为3,有2个partition(分区);
那这个topic一共有6个partition(分区),其中包含2个Leader Replica(partition主副本)和4个Follower Replica(partition从副本)。
2.7. AR
全称:assigned replicas
partition(分区)所属的全部副本。
AR = ISR + OSR
2.8. ISR
全称:in sync replica
partition(分区)所属,与Leader Replica(partition主副本)保持同步的Follower Replica(partition从副本)集合;
注意:ISR中也包含Leader Replica(partition主副本),ISR = leader replica + follower replicas,某些情况下ISR集合中可能只有leader 一个副本。
当Leader Replica(partition主副本)所在broker意外宕机,只有此集合中的Follower Replica(partition从副本)才有资格被选举成leader;
也只有该集合中所有副本(Leader + Follower)都成功接收到了同一条消息数据,kafka才会将该消息数据设置成"已提交"状态,即认为producer成功发送该消息数据(由producer#acks参数控制)。
2.9. OSR
全称:outof-sync replicas
理想状态下,partition(分区)所属的全部Follower Replica(partition从副本),都应该与Leader Replica(partition主副本)保持消息数据同步;
但总有各种原因,导致一部分Follower Replica(partition从副本)中同步的消息数据落后于Leader Replica(partition主副本)的进度;当滞后到一定程度,kafka会将这些Follower Replica(partition从副本)踢出ISR集合,转移到OSR集合。
当OSR集合中Follower Replica(partition从副本)同步的消息数据追上Leader Replica(partition主副本)后,kafka会将其重新添加回ISR中。
partition(分区)的副本支持动态增加,新增加的Follower Replica(partition从副本)中的消息数据肯定是追不上Leader Replica(partition主副本)的,因此也会先加入到OSR集合中。
2.10. offset
全称:partition offset
表示消息在partition(分区)中的位置,是一个单调递增且不变的值。
在<partition(分区)>中提到过,producer(生产者)生产的消息数据以追加的形式写入partition(分区);
写入partition(分区)的每条消息数据都会被分配一个唯一序列号,也就是offset;offset是从0开始顺序递增的整数;通过offset可以定位到某partition(分区)中的一条数据。
注意:consumer(消费者)中也有offset的概念,它们俩是不同的概念。
2.11. producer(生产者)
消息数据的生产者,向topic(主题)生产消息的应用程序称为producer(生产者);
节省内容篇幅,将其归类到kafka broker中
2.12. ack
在上面<ISR>小节中提到过一个场景:只有ISR集合中所有副本(Leader + Follower)都成功接收到了同一条消息数据,kafka才会将该消息数据设置成"已提交"状态,即认为producer成功发送该消息数据(由producer#acks参数控制)。
上面这个过程,这就是ack机制的一部分;
具体来说:
- producer(生产者)发送一条消息数据给kafka集群;
- 消息数据会写入到指定的topic(主题)下的Leader Replica(partition主副本);
- producer(生产者)会等待Leader Replica(partition主副本)/ broker 返回写入结果(并不是无限等待,会有超时时间),以确保消息数据被成功提交;
- 上面这一切完成后,producer(生产者)才可以继续发新的消息。
kafka api中提供回调,让用户处理消息数据发送失败的情况;
3. kafka consumer
以下是kafka consumer中相关的一些概念信息。
概念 | 含义 |
---|---|
consumer(消费者) | 订阅主题的应用程序就被称为Consumer; |
consumer group(消费组) | 多个consumer组成consumer group; 一种可扩展且具有容错性的消费者机制。 |
offset(消费者 offset) | |
rebalance(重平衡) | 消费组中某个consumer挂掉后,group中其他consumer自动重新分配订阅分区的过程 |
3.1. consumer(消费者)
消息/数据的消费者;
consumer(消费者)订阅topic(主题)并且处理消息,consumer(消费者)可以同时订阅多个topic(主题)。
consumer(消费者)通过检查消息的offset(偏移量)区分已经读取过的消息。
注意,此处的offset,并不是上面partition offset;
consumer(消费者)会把从每个partition(分区)中最后读取消息对应的offset保存到zookeeper或kafka中,如果消费者关闭或重启,保证读取状态不会丢失。
3.2. consumer group(消费组)
多个consumer(消费者)共同组成的一个consumer group(消费组),同时消费多个partition(分区)以实现高吞吐。
consumer group(消费组)中的consumer(消费者)订阅的都是相同的topic(主题),每个consumer(消费者)接收topic(主题)中某一个或多个分区的消息。
在一个 consumer group(消费组)中,一条消息只能被consumer group(消费组)中的consumer(消费者)消费。
consumer group(消费组)中的consumer(消费者)不能比订阅topic(主题)中的partition(分区)多,否则多出的consumer(消费者)会处于空等待状态,不会收到消息。
3.3. offset(consumer offset)
consumer(消费者)消费partition(分区)中消息的进度,每个consumer(消费者)都有自己的消费者位移。
3.4. rebalance(重平衡)
消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。
rebalance是consumer(消费者)端实现高可用的重要手段。
4. Reference
- 《Kafka 核心技术与实战 - 极客时间》
- Apache Kafka
- Kafka Topic Partitioning and Replication Critical Configuration Tips