赞
踩
1、kafka消息发送的流程?
kafka消息的发送主要涉及两个线程分别是main线程和sender线程。
在main线程中,会由KafkaProducer创建消息,通过可能存在的拦截器、 序列化器、和分区器的作用后,缓存到消息累加器(RecrdAccumlator)中,在消息累加器中,每一个分区对应一个双端队列,当每个分区的消息会放入对应的双端队列,当batch.size到达16k或到达linger.ms设置的时间后,会由sender线程读取。
Sender线程在从消息累加器中读取到消息后,会创建发送的请求,kafka集群的每一个broker都会有一个InFlightRequests队列存在于NetWorkClient中,一般情况下,每个InFlightRequests队列缓存5个请求,这些请求通过selector发送到kafka集群,当集群返回acks信息后,Producer根据应答将数据存入磁盘。
2、Kafka 的设计架构你知道吗?
Producer:消息生产者,就是向 Kafka broker 发消息的客户端。
Consumer:消息消费者,向 Kafka broker 取消息的客户端。
Consumer Group(CG):消费者组,由多个 consumer 组成。
消费者组内每个消 费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;
消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者
Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。
Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和 Leader 数据的同步。
Leader 发生故障时,某个 Follower 会成为新的 Leader。
3、Kafka 分区的目的?
(1)便于合理使用存储资源, 可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。
2)提高并行度,(类似java的多线程)多个分区共同处理同一组数据,能大幅度提高效率。
4、你知道 Kafka 是如何做到消息的有序性?
(1)消息分区,kafka将同一个topic的数据分散存储在多个partition中,在每个partition中,都会有自己的offset偏移量,这是一条消息在分区中的唯一标识符,kafka会通过offset偏移量确保每个分区内部的消息存储顺序是有序的。
(2)生产者端(producer),生产者发送信息数据时,可以指定分区,也可以有kafka自动选择分区。当生产者使用同步发送方式将消息发送到指定的分区时,kafka会按照消息发送的顺序依次将它们写入到目标分区中。
(3)消费者端(Consumer),消费者从kafka急群中中读取消息时,会从指定的offset偏移量处开始读取,并发送给客户端。在消费者组消费场景下,kafka还会对多个消费者之间的消息进行协调,确保每条消息只能被其中一个消费者处理,并且每个消费者只能读取到特定分区内的消息,这样就保证了消费者端的有序性。
5、ISR、OSR、AR 是什么?
Kafka 分区中的所有副本统称为 AR(Assigned Repllicas)。
AR = ISR + OSR
ISR,还存活的所有副本(Leader + Follower)
OSR,从 ISR队列踢出的所有副本(故障的Leader 和 长时间未向 Leader 发送通信请求或同步 数据的Follower)。
6、Kafka 在什么情况下会出现消息丢失
在Leader发生故障时,会从ISR队列中还存活的副本中选出一个新的Follower作为Leader,
为了保证Follower和Leader的数据的一致性,各个Follower会将各自的log文件中高于HW的部分
截掉,然后从新的Leader中同步数据,如果新的Leader的LEO是偏小的,那么就会出现数据丢失的情况。
7、怎么尽可能保证 Kafka 的可靠性
ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
acks=0,生产者发送信息数据就不管了,可靠性差,效率高;
acks=1,生产者发送数据,Leader读取后应答,可靠性中等,效率中等;
acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer都存储后才能应答,可靠性高,效率低,且有可能出现数据重复问题。
在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;
acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。
8、Kafka中如何做到数据唯一,即数据去重?
幂等性 Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条
开启幂等性后,会根据<PID, Partition, SeqNumber>判断是否是重复数据,遇到重复数据,Broker只会持久化一条。其 中PID是Kafka每次重启都会分配一个新的;Partition 表示分区号;Sequence Number是单调自增的。(幂等性只能保障服务器不挂掉的情况下,发送数据是唯一的)。
事务 类似sql中的事务,在启用事务前,需要自定义一个transaction_id,服务器重启后也可以根据transaction_id继续处理未处理完的事务。
9、生产者如何提高吞吐量
(1)batch.size:批次大小,默认16k
(2)linger.ms:等待时间,修改为5-100ms
(3)compression.type:压缩snappy
(4) RecordAccumulator:缓冲区大小,修改为64m
10、zk在kafka集群中有何作用?
配置管理:Kafka使用ZooKeeper来管理和存储集群的配置信息,包括broker的地址、topic的分区信息等。
Leader选举:Kafka 集群中有一个 broker 的 Controller 会被选举为 Controller Leader,负责管理集群broker 的上下线。
Broker注册:Kafka的broker在启动时会向ZooKeeper注册自己的信息,包括broker的ID、地址等。其他组件如生产者、消费者可以通过ZooKeeper获取到可用的broker列表,以便进行消息的发送和接收。
Topic和分区管理:ZooKeeper存储了Kafka中所有topic和分区的元数据信息,包括topic的名称、分区的数量、分区的副本分配等。
11、简述kafka集群中的Leader选举机制
当一个分区的Leader不可用时,Kafka会自动触发选举新的Leader。选举的前提是
在ISR队列中存活,然后根据在AR队列的前后顺序来选举。
12、kafka是如何处理数据乱序问题的。
kafka在1.x版本之前保证数据单分区有序,条件如下:
max.in.flight.requests.per.connection=1(不需要考虑是否开启幂等性)
一个队列只有一个请求,就不会出现乱序。
kafka在1.x及以后版本保证数据单分区有序,条件如下:
开启幂等性
max.in.flight.requests.per.connection需要设置小于等于5。
未开启幂等性
max.in.flight.requests.per.connection需要设置为1。
13、kafka中节点如何服役和退役
服役:
修改新节点的配置文件并启动该节点,创建一个topics-to-move.json的文件,里面存放
要负载均衡的主题,运行kafka自带的kafka-reassign-partitions.sh脚本,指定服务器的节点,生成负载均衡计划(负载均衡计划也可以自定义)
创建increase-replication-factor.json副本存储计划的json文件,将生成的负载均衡计划填入该文件,运行kafka-reassign-partitions.sh脚本,执行副本存储计划文件即可。
bin/kafka-reassign-partitions.sh --bootstrap-server hadoop11:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate
退役:
过程与服役的过程一致,只是服役时是运行kafka-reassign-partitions.sh脚本时,增加节点数量,退役时是,剔除要退役的节点。
14、Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?
Follower挂了后,会被临时踢出ISR队列,在这个期间其他的Leader和Follower继续接收数据,
等到该宕机的Follower重启后,会读取磁盘中上次记录的HW,将log中高于HW的部分截掉,从
HW继续同步Leader的数据,等到该Follower的LEO高于该partition的HW时,即Follower追上Leder时,就可重新加入ISR队列。
15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢?
左:kafka自带代码规则创建的 分区副本 右:自定义负载均衡计划创建的分区副本
手动调整分区副本存储,选择一个要负载均衡的主题,自定义负载均衡计划, 之后运行kafka-reassign-partitions.sh脚本并指定自定义的负载均衡计划,这样该主题的各个分区的leader就会改变。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。