• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

kafka就是这么

武飞扬头像
阿小木的愤怒
帮助1

1.Kafka能做什么

Kafka是有apach软件基金会开发的一个开源的高吞吐量的分布式发布订阅消息系统。

2.为什么使用消息队列

解耦、异步、流量削峰

  1. Kafka的基本概念
  1. Recode:消息,消息队列基本通讯单位;
  2. Topic:主题,目的是为了将消息进行分类,不同业务类型的消息,不同服务的消息进行分类,分发到不同的主题;
  3. Partition:分区,每个主题可以创建多个分区,每个分区由一系列有序的不可变的消息组成;
  4. Replica:副本,每一个分区都有一个或者多个副本,它的主要作用就存储数据,以日志(Log)对象的形式存储,副本又分为leader和follower副本;
  5. Offset:偏移量,每一个消息在日志文件中对应一个按序递增的偏移量,可以理解为数据的存储形式;
  6. Producer:生产者,消息的生产者;
  7. Consumer:消费者,消息的消费者;
  8. Broker:代理,一个kafka集群由一个或者多个kafka实例组成,每一个kafka实例就是一个代理;

学新通

Partition分区里面的副本只有leader副本负责与生产者与消费者进行交互。Follower副本定期从leader副本拉去数据,保证集群的可用性。

  1. 数据的高可靠性

Kafka通过副本的方式实现数据的存储,所以需要一下机制保证数据在跨集群的副本直接可靠的传输。

  1. 1.副本同步集合

AR(Assigned Replicas)分区中的所有副本统称为AR(leader follower),所有与leader副本保持一定同步程度的follower副本(包括leader副本)组成了ISR(In Sync Replicas,ISR是AR的一个子集,producer发送消息,首先到达leader副本,然后follower副本定时同步leader副本中的数据,两个副本有一定的延迟,“一定同步程度”可以通过参数配置replica.lag.time.max.ms设置数据同步时间差,默认是10s,一旦follower副本与leader副本消息时间差超过这个参数设置的时间,follower副本就会被放入一个叫做OSR(Out Sync Replicas)的集合中(不包含leader副本),所有AR = IST OSR。

  1. 1.ACK应答机制
  2. ack = 0

生产者发送一次消息就不再发送消息,若发送的消息在通讯过程丢失或者未写入磁盘,那么消息就丢失了,这样做的好处是效率比较高,缺点是数据的可靠性很低。

  1. ack = 1

leader接收到消息并且写入到磁盘任务处理成功。如果在leader副本写入磁盘成功,还未成功同步到follower副本,leader宕机,会造成数据丢失。这种方式可靠性比上一种好一些,kafka默认采用的就是该方式。

  1. ack = -1(all)

producer只有收到所有的分区内副本返回ack确认才会任务消息push成功。虽然这样对数据的可靠性做的非常好,但是性能会下降,影响吞吐量。

  1. 1.消息语义
  2. At most once(最多一次)

消息被消费0次或者1次 ,最多一次,消息从partition分发给consumer集群,consumer成收到消息后告诉集群,集群收到后offset后移,消费者将数据持久化入库;

那么在最后一步consumer进行持久化入库是服务挂掉,就会造成数据丢失(代码中可以手动提交,在处理完业务及持久化后手动提交)

学新通

  1. At least once

表示至少消费一次,假设consumer group收到消息后,将消息进行处理持久化入库,然后返回告诉partition,如果在返回过程,服务挂掉,那么partition一直收不到ack确认,partition会重新发送消息,消费者重新消费持久化入库,会造成消息的重复消费。

学新通

学新通

  1. exactly once

代表消息刚好被消费一次,不丢失也不重复消费。在at least once的情况基础上,假设consumerA在返回ack给partition的过程中宕机了。那么consumerB不会跟着partition的offset走,它会先去数据库里面查看最新消息对应的偏移位,再根据这个偏移位返回Kafka集群从对应的偏移位置出发,这就可以避免消息重复和消息丢失。

学新通

    1. 数据截断机制

Partition副本中真正与producer和consumer进行交互的是leader副本,如果leader副本宕机,如何保证leader与follower之间数据一致?

HW(high watermark)高水位,用来表示副本之间数据同步的相对位置,分区所有副本offset最低的位置

LED(log end offset)下一条待写入消息的位置

学新通

      1. follower与leader故障
  1. follower故障:follower发生故障首先会被踢出ISR,放入OSR中,等待follower恢复后,将LEO高于HW位置的部分截取掉,然后重新从leader同步数据,等待follower的LEO大于或者等于leader的HW,即追上了leader之后,重新放入ISR。
  2. leader故障:leader发生故障后,首先会从ISR中选出一个新的leader,为了保证多个副本数据一致性,会将其他follower中LEO高于HW部分数据截取掉,然后从新的leader同步数据。
  1. 数据清理机制
    1. 日志清理

日志删除会直接删除日志分段,kafka维护一个定时任务,定期检查过期数据进行清理。

  1. 1.1基于时间清理

每一个日志段文件中都会维护一个最大的时间戳来确认当前配置的删除时间,只要日志段写入新数据,都会更新该字段,一个日志段写满后就不会再写入数据,创建一个新的日志段。

每一个日志段写满后最大时间就会保持不变,kafka定时任务会根据当前时间与最大时间对比,判断是否过期。

Kafka默认配置log.retention.hours = 168,也就是7天的日志保留时间。

学新通

      1. 基于容量大小清理

Kafka会根据每个日志段文件大小计算出总的容量阈值,如果这个总的容量阈值超过配置的预置大小,就会清理掉最旧的日志段文件,反之不做处理。

学新通

    1. 日志压缩

Kafka的消息是由键值对存储的,如果日志段中存在key相同,value不相同,会选择性的清理,保留最新的一条。具体压缩方式就是创建一个检查点文件,从日志段的开始位置遍历到最后位置,每个消息的key和key对应的offset保存在一个固定容量的SkimapOffsetMap中。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgffiif
系列文章
更多 icon
同类精品
更多 icon
继续加载