目录
14、Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?
15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢?
1、kafka消息发送的流程?
在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程。
1、在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给RecordAccumulator,
2、Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka Broker。
2、Kafka 的设计架构你知道吗?
kafka的基础框架:
1)Producer:消息生产者,就是向 Kafka broker 发消息的客户端。
2)Consumer:消息消费者,向 Kafka broker 取消息的客户端。
3)Consumer Group(CG):消费者组,由多个 consumer 组成。
4)Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
5)Topic:一个队列、主题。
6)Partition:一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
7)Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个 Follower。
8)Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。
9)Follower:每个分区多个副本中的“从”
3、Kafka 分区的目的?
1、便于合理使用存储资源,合理控制分区的任务时,还可以达到负载均衡效果
2、提高并行度
4、你知道 Kafka 是如何做到消息的有序性?
可以保证数据单分区内有序、多分区无法保证:
开启幂等性、可以保证数据在单分区内自动排序
5、ISR、OSR、AR 是什么?
AR是Kafka 分区中的所有副本
ISR是和 Leader 保持同步的副本
OSR是和Leader 不同步的副本,也就是挂掉的副本
AR = ISR + OSR
6、Kafka 在什么情况下会出现消息丢失
1、如果ack的值设置为0时,生产者发送完数据,leader直接挂了,数据就会丢失。
2、如果ack的值设置为1时,生产者发送完数据,leader应答后还没同步数据给follow就挂掉了,也会导致数据丢失。
3、如果ack的值设置为-1时,且ISK里应答的副本数只有一个,那么当leader挂掉的时候数据也会丢失。
7、怎么尽可能保证 Kafka 的可靠性
ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
首先将ACK的级别设置为-1
其次分区副本数要大于等于2
最后也要保证ISR里应答的最小副本数量也要大于等于2
这个才可以尽可能的保证kafka数据的可靠性
8、Kafka中如何做到数据唯一,即数据去重?
至少一次+幂等性+事务
1、首先开启幂等性,默认是开启的。但这个只能保证单个分区单对话内不重复,即服务器不挂掉的情况下是唯一的。
2、其次、使用事务 这个才可以保证数据的唯一
9、生产者如何提高吞吐量?
调生产者的参数:
1、可以增大批次大小(batch.size)
2、可以增大等待时间(linger.ms)
3、可以对消息进行压缩(compression.type)
默认是none ,可以配置为gzip sanppy lz4 zstd
4、可以增大缓冲区的大小(RecordAccumulator)
10、zk在kafka集群中有何作用
1、zookeeper可以记录kafka集群中有哪些服务器,并且哪些服务器是可用的
2、zookeeper可以记录每个主题的分区中谁是leader,谁是fllower
3、zookeeper可以辅助leader的选举
11、简述kafka集群中的Leader选举机制
1)每一个broker上线时,会在zk中进行注册
2)每个broker中都有一个controller,controller会争先抢占zk中 controller节点的注册权,谁先抢到,谁选举时说了算。假如broker0中的controller中抢到了,那它就是说了算的人。该controller一直监听ids节点是否有挂掉的节点。
3)选举规则是:在ISR中存活为前提,按照AR中排在前面的优先,比如:ar[1,0,2] ,isr[1,0,2],那么Leader会按照1,0,2 进行顺序的轮询。
12、kafka是如何处理数据乱序问题的。
可以保证数据单分区内有序、多分区无法保证:
开启幂等性、可以保证数据在单分区内自动排序
13、kafka中节点如何服役和退役
服役:
假如我要对已经存在的topicA主题的节点进行服役
1、创建一个要均衡的主题:首先在kafka中创建一个json文件,在这个Json文件里写入要均衡的主题topicA
2、生成一个负载均衡的计划:创建完之后执行这个json文件命令,生成一个负载均衡的计划
(执行的这个命令有服役计划)
3、创建副本存储计划:再创建一个json文件,将上一步生成的负载均衡的计划中未来分区策略复制进去
4、执行副本存储计划即可
退役:
假如我要对已经存在的topicA主题的节点进行退役
1、创建一个要均衡的主题:首先在kafka中创建一个json文件,在这个Json文件里写入要均衡的主题topicA
2、生成一个负载均衡的计划:创建完之后执行这个json文件命令,生成一个负载均衡的计划
(执行的这个命令有退役计划)
3、创建副本存储计划:再创建一个json文件,将上一步生成的负载均衡的计划中未来分区策略复制进去
4、执行副本存储计划即可
14、Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?
1、假如Follower挂了:
假如Follower挂掉了,Leader和其他的Follower 继续往前存储数据,挂掉的节点从ISR集合中剔除,此时挂掉的Follower又重启了,它会先从上一次挂掉的节点的HW(最高水位线)开始同步数据,直到追上最后一个Follower为止,此时会重新回归ISR。
2、假如Leader挂了:
首先会从ISR中选出一个新的Leader,紧接着其余的Follower会将各自的log文件高于HW的部分截掉,然后从新的Leader同步数据。
15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢?
手动调整分区副本,它的大致步骤是这样的:
1、创建一个新的topic:假如是topicA
2、查看这个默认的分区副本存储情况
3、创建副本存储计划:创建一个json文件,里面写入自定义的分区副本存储计划
4、执行副本存储计划:然后执行这个副本存储计划即可!
5、再次查看分区副本存储情况,发现已经修改完毕!
16、kafka是如何做到高效读写
1、Kafka 本身是分布式集群,可以采用分区技术,并行度高
2、读数据采用稀疏索引,可以快速定位要消费的数据。(mysql中索引多了之后,写入速度就慢了)
3、顺序写磁盘
4、页缓存 + 零拷贝技术
17、Kafka集群中数据的存储是按照什么方式存储的?
首先,生产者把数据发送给各个分区,每个partition会对应于一个log文件,而Produce生产的数据就存储在log文件中。
其次,Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件
18、kafka中是如何快速定位到一个offset的
1、根据目标offset定位Segment文件
2、找到小于等于目标offset的最大offset对应的索引项
3、定位到log文件
4、向下遍历找到目标Record
19、简述kafka中的数据清理策略
Kafka 中默认的数据保存时间为 7 天,也可以通过调整consumer参数修改保存时间。
如果超过了这个时间,Kafka 提供了delete 和 compact 两种日志清理策略
第一种是delete 日志删除:这种策略会将过期数据删除
第二种是compact日志压缩:这个策略会对于相同key的不同value值的数据,只保留最后一个版本。
但是这个compact策略只适合特殊场景!(比如消息的key是用户ID,value是用户的资料,通过这种压缩策略,整个消息集里就保存了所有用户最新的资料)
20、消费者组和分区数之间的关系是怎样的?
消费者组是由多个consumer组成的。
首先,消费者组内每个消费者负责消费不同分区的数据,一个分区只能由组内一个消费者消费。
其次,消费者组之间互不影响。所有的消费者都属于某个消费者组。
21、kafka如何知道哪个消费者消费哪个分区?
生产者把数据发送给各个分区,每个broker节点都有一个coordinator(协调器)。
消费者组对分区进行消费,消费规则是:
1、首先groupId对50取模,看最后的结果是哪个分区节点,假如是1分区,那么1分区的协调器就是本次消费者组的老大
2、其次每个消费者会向该协调器进行注册,协调器会从中随机选择一个消费者作为本次消费的Leader,然后把本次消费的具体情况发送给Leader,让其制定一个消费计划(就是哪个消费者消费哪个分区)
3、最后Leader发送给协调器,协调器再进行群发,将计划公布,各个消费者按照这个计划进行消费。
22、kafka消费者的消费分区策略有哪些,默认是个?
消费者分区策略就是consumer制定的消费计划。
Kafka有四种主流的分区分配策略: Range、RoundRobin(轮询)、Sticky(粘性)、CooperativeSticky(配合的粘性)
其中默认策略是Range + CooperativeSticky