kafka原理

1. 什么是kafka?2. kafka基础架构3. 文件存储结构4. 生产者4.1 分区策略4.2 ISR机制4.3 ACk机制与ExactlyOnce4.4 数据一致性问题

5. 消费者5.1 消费者的消费方式5.1 消费者、消费者组、分区的关系

1. 什么是kafka?

Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。

优点:

高吞吐量、低延迟: kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒;可扩展性好: kafka集群支持热扩展。持久性、可靠性: 消息被持久化到本地磁盘,并且支持数据备份防止丢失。高容错性,并发性能好

2. kafka基础架构

一些重要的术语: 1.Producer: 生产者,发送消息到指定的 topic .

2.Consumer: 消费者,从 topic 中消费消息.

3.broker: 节点,一台 kafka 服务器就是一个 broker。

4.topic: 每一个发布到 kafka 的消息都会指定一个类别,即 topic,消息按照topic来分类。

5.partition:

分区,每个topic被物理划分为一个或多个分区,每个分区在物理上对应一个 log 文件夹,该文件夹存储了索引文件和消息文件。

6.offset:

消息序号,代表消息在 partition 中的偏移量。每一条消息在partition都有唯一的offset,一般情况下,消费者消费完一条消息后会递增 offset ,这时如果将 offset 设定为较小的值,就可以重复消费一些消息。

7.consumer group:

消费者组,每个consumer属于一个特定的consumer group,若不指定则属于默认的group。 同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。

8.leader:

每个 partition 有多个副本,其中有一个为 leader ,其他都是 follower , leader 负责所有的客户端读写操作。

9.follower:

不对外提供服务,只与leader保持数据同步。如果 leader 失效,则选举一个 follower 来充当新的leader。

3. 文件存储结构

每个 partition 对应于一个 log 文件,该 log 文件中存储着 producer 生产的数据。 Producer 将消息发送到 topic 时,会根据 分区策略 将消息写入 log 文件的末尾,属于顺序写磁盘,效率非常高。(有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。顺序写省去了大量磁头寻址的时间)

4. 生产者

4.1 分区策略

指明 partition 的情况下,直接将指明的值直接作为 partiton 值。没有指明 partition 的值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值.partition 和 key 值都没有时,第一次会随机生成一个数, 与 partition 数取余得到 partition 值,以后每次在这个数的基础上加1。

数据可靠性保证

为数据能可靠的发送到指定的 topic, topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果producer 收到 ack, 就会进行下一轮的发送,否则重新发送数据。

4.2 ISR机制

什么是ISR?

Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。

当 ISR 中的 follower 完成数据的同步之后, leader 就会给 follower 发送 ack。如果 follower 长 时 间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由 replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。

4.3 ACk机制与ExactlyOnce

由于对不同数据的可靠性要求不同,kafka提供了三种可靠性级别。

ack = 0;

延迟最低,producer 不等待 broker 的 ack, broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据。

ack = 1;

producer 等待 broker 的 ack, partition 的 leader 落盘成功后返回 ack。 但是如果在 follower 同步完成之前, leader 故障,将会导致数据丢失。

ack = -1;

producer 等待 broker 的 ack, leader 和 follower 完成落盘后才返回 ack。 但是如果在 broker 返回 ack 之前,leader 出现故障,则会造成数据重复。

kafka 的 ack 默认值 为 1。

At Least Once:

ack = -1 时,可以保证 Producer 到 Server 之间不会丢失数据,但是不能保证数据不重复 。

At Most Once:

ack = 1 时,可以保证数据不重复,但是不能保证数据不丢失。

幂等性:

0.11版本后引入,指 Producer 不论向 Server 发送多少次重复数据, Server 端都只会持久化一条。

ExactlyOnce指的就是 幂等性 + At Least Once 。即保证了数据的不重复,又保证了数据不丢失。

启用幂等性: Producer 的参数中 enable.idempotence 设置为 true 即可。

4.4 数据一致性问题

LEO: 标识当前日志文件中下一条待写入的消息的offset。 HW: 高水位,它等于 ISR 队列中最小的 LEO,消费者只能消费HW之前的消息。 如下图所示: 发生故障时,如何保持数据一致? follower 故障

follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后, follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。

leader 故障

leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性, 其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据。

5. 消费者

5.1 消费者的消费方式

① push方式:由消息中间件主动地将消息推送给消费者。

优点: 不需要消费者额外开启线程监控中间件,节省开销。 缺点: 无法适应消费速率不相同的消费者。可能导致部分消费者空闲,部分消费者堆积,造成缓冲区溢出。

② pull方式:由消费者主动向消息中间件拉取消息。

优点: 消费端可以按处理能力进行拉取。 缺点: 消费端需要另开线程监控中间件,有性能开销。如果 kafka 没有数据,消费者可能会陷入循环中, 一直返回空数据。

Kafka 的消费者可以在消费数据时会传入一个参数 timeout,如果当前没有数据可供消费, consumer 会等待一段时间之后再返回,这段时长即为 timeout。

5.1 消费者、消费者组、分区的关系

同个 groupId 的 消费者 只能消费同个 topic 的某个消息一次。

就是说 A和B的groupId 相同且同时订阅了 test,则A消费了 test 中的消息后,B就不能再次消费这个消息。

不同 groupId 的消费者可共同消费同个 topic 的消息。

A与B不同groupId,则A消费后,B仍然可以消费。

每个分区只能被一个消费组中的一个消费者所消费。

当分区数 < 消费者数时,如3个分区,4个消费者,则会有一个消费者无消息消费。当分区数 > 消费者数时,如4个分区,3个消费者,则有个消费者会同时消费2个分区。

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: