kafka原理学习

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 分区策略

  1. 指明 partition 的情况下,直接将指明的值直接作为 partiton 值。
  2. 没有指明 partition 的值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值.
  3. 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 出现故障,则会造成数据重复

kafkaack 默认值 为 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 消费者、消费者组、分区的关系

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

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

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

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值