Kafka知识点概述

发布于:2022-12-26 ⋅ 阅读:(590) ⋅ 点赞:(0)

kafka架构

Kafka是如何实现消息有序的?有哪些分区算法?


(一)Kafka是如何让实现消息有序的 生产者:通过分区的leader副本负责数据以先进先出的顺序写入,来保证消息顺序行。消费者:同一分区内的消息只能被一个group里的消费者消费,保证分区内消费有序。Kafka每个partition中的消息写入时都是有序的,消费时,每个partition只能被每一个消费者组中的一个消费者消费,保证了消费时也是有序的。整个kafka不保证有序。如果为了保证kafka全局有序,那么设置一个生产者,一个分区,一个消费者。
(二)Kafka有哪些分区算法? 轮询策略:将消息顺序分配到各个分区中,假设一个主题下有三个分区,第一条消息将被发送到分区0,第二条消息被发送到分区1,第三条消息被发送到分区2,以此类推,第四条消息被发送到分区0。轮询策略有非常优秀的负载均衡表现,它总是能保证消息最大限度地被平均分配到所有分区上,故默认情况下它是最合理的分区策略,也是我们最常用的分区策略之一。
随机策略:
将消息随机地放到任意一个分区上,本质上看随机策略也是力求将数据均匀地打散到各个分区,但稍逊于轮询策略,所以如果追求数据的均匀分布,还是使用轮询策略比较好。事实上,随机策略是老版本生产者使用的分区策略,在新版本中已经改为轮询策略了
按消息键保序策略:
Kafka允许为每条消息创建消息建,称为key,每个key可以代表具体的业务含义,如业务ID,用户ID等。一旦消息被定义了key,那么你就可以保证同一个key的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序额,故这个策略被称为按消息键保序策略。
 

简单阐述kafka的ISR机制

在分区中,所有副本统称为AR(Assigned Replicas)【AR为指定副本】,Leader维护了一个动态的ISR,ISR是指与leader副本保持同步状态的副本集合。当然leader副本本身也是集合中的一员。当ISR中的follower完成数据同步之后,leader就会给follower发送ack,如果其中一个follower长时间未向leader同步数据,该follower将会被踢出ISR集合,该时间阈值由replica.log.time.max.ms参数设定。当leader发生故障后,就会从ISR集合中重新选择出洗的leader。

kafka如何保证对应类型的消息被写到相同的分区

通过 消息建 和分区器来实现,分区器为键生成一个offset,然后使用offset对主题分区进行取模,为消息选取分区,这样就可以保证包含同一个键的消息会被写到同一个分区上。
1.如果ProducerRecord没有指定分区,且消息的key不为空,则使用Hash算法(非加密型Hash函数,具备高运算性能及低碰撞率)来计算分区分配
2.如果ProducerRecord没有指定分区,且消息key也是空,则用轮询的方式选择一个分区。

如何保证每个程序都可以获取到Kafka主题中的所有消息,而不是部分消息


1)为每个应用程序创建一个消费者组,然后往组中添加消费者来伸缩读取能和处理能力,每个群组消费主题中的消息时,互不干扰。

Kafka消费支持几种消费模式?如何保证数据的不重复和不丢失?Kafka是如何清理过期数据的

(1)Kafka支持几种消费者模式? Kafka消费消息时支持三种模式:
at most once 模式最多一次保证每一条消息commit成功之后再进行消费处理消息可能会丢失但不会重复。
at least once 模式至少一次保证每一条消息处理成功之后,再进行commit。消息不会丢失但可能会重复。
exactly once 模式精确传递一次。将offset作为唯一id与消息同时处理,并且保证处理的原子性。消息只会处理一次,不会丢失也不会重复。
kafka默认模式是at least once,但这种模式可能会产生重复消息的问题,所以在业务逻辑必须做幂等设计。
(2)如何保证数据的不重复和不丢失?
exactly once 模式精确传递一次。将offset作为唯一id与消息同时处理,并且保证处理的原子性。消息只会处理一次,不会丢失也不会重复。但这种方式很难做到。
kafka默认模式是at least once,但这种模式可能会产生重复消息的问题,所以在业务逻辑必须做幂等设计。
使用 exactly once + 幂等操作,可以保证数据不重复、不丢失。
(3)Kafak是如何处理过期数据的?
Kafak将数据持久化到硬盘上,允许配置一定的策略对数据进行清洗,清理的策略有两个,删除和压缩。 
数据清理的方式 

1、删除: log.cleanup.policy=delete 启用删除策略 直接删除,删除后的消息不可恢复。可以配置两个策略:#清理超过指定时间清理:log.retention.hours=16  #超过指定大小后,删除旧的消息:log.retention.bytes=1073741824 为了避免在删除时阻塞读操作,采用了copy-on-write形式来实现


2、压缩:将数据压缩,只保留每个key最后一个版本的数据。首先在broker的配置中设置log.cleanup.enable=true启用cleaner,这个默认是关闭的。在topic的配置中设置log.cleanup.policy=compact 启用压缩策略

Zookeeper 对于 Kafka 的作用是什么

Zookeeper 是一个开放源码的、高性能的协调服务,它用于 Kafka 的分布式应用。
Zookeeper 主要用于在集群中不同节点之间进行通信
在 Kafka 中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取除此之外,它还执行其他活动,如: leader 检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。

讲一讲 kafka 的 ack 的三种机制

request.required.acks 有三个值 0 1 -1(all)
0:生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱当 server 挂掉的时候就会丢数据。
1:服务端会等待 ack 值 leader 副本确认接收到消息后发送 ack 但是如果 leader挂掉后他不确保是否复制完成新 leader 也会导致数据丢失。
-1(all):服务端会等所有的 follower 的副本受到数据后才会受到 leader 发出的ack,这样数据不会丢失


网站公告

今日签到

点亮在社区的每一天
去签到