1、kafka消息发送的流程?
在消息发送的过程中,涉及到两个线程--main线程和sender线程。在main线程中创建了一个双端队列RecordAccumulator。main线程将消息发送给RecordAccumulator,然后sender线程不断从双端队列RecordAccumulator 拉取消息发送到kafka Broker
2、Kafka 的设计架构你知道吗?
1,kafka会创建两个 一个是生产者,另外一个是消息消费者,消息生产者会向kafka broker发消息的客户端,而消息消费者,向kafka broke拉取消息的客户端。
一台服务器就是一个broker。一个集群由多台服务器搭建而成。一个broker可以容纳多个topic
而topic 可以理解为一个队列 生产者和消费者面向的都是一个topic。也可将topic理解成一个主题
一个topic可以分布到多台服务器也就是broker,一个topic可以分为多个partition,partition是分区,每个partition是一个有序的队列,partition的好处是 实现扩展性
2,简单来说结构就是
我们需要先创建一个主题 也就是 topic 可以理解为一个队列 生产者和消费者面向的都是一个topic
然后生产者 向broker集群 发送消息,而消费者 再从 broker集群 里面拉取消息 ,期间会产生两个副本,一个是leader 和 follower ,而leader是多个副本的主,生产者发送数据的对象,以及消费者消费数据的对象都是leader,broker集群里面由包含了许多的分区 partition,是为了实现扩展性
一台kafka服务器就是一个broker,而一个集群是由多个broker组成
3、Kafka 分区的目的?
kafka 分区的目的是
1,是便于合理使用储存资源,让每个partition在broker上储存,可以把海量的数据切割成一块一块数据存储到多台服务器上,合理控制分区任务,可以实现负载均衡的效果
2,可以提高并行度,生产者可以以分区为单位发送数据,消费者可以以分区为单位进行消费数据
4、你知道 Kafka 是如何做到消息的有序性?
将kafka的分区设置为1
因为单分区有序多分区无序或者是我把数据拉过来再进行排序,不过这个做法不可取因为kafka一般就没有发完的那一天所以没办法排序。
5、ISR、OSR、AR 是什么?
isr:只保留存活的leader和follower一个队列。
osr:就是isr里的follower与leader副本同步时,延迟过多的被踢出去的副本
AR:kafka分区中的所有副本,包含(leader)统称为AR
AR =ISR+OSR
6、Kafka 在什么情况下会出现消息丢失
ack=0 我们有一个ack 设置 如果我们给它设置为0的话 ,生产者发送过来的数据,不需要等数据落盘应答,假如我们发送了两条消息,此时leader如果挂掉了,数据就丢失了
ack=1另外一种情况是我们把ack设置为1,生产者发送数据给leader,leader保存成功,应答完毕,此时生产者就i以为数据发送成功了,但此时leader挂掉了,但是还没来得及同步给follower,follower此时变成了leader,此时lerader向生产者要数据,生产者不会再发,因为它应答完之后生产者觉得它已经发过了,所有不会给新的leader再发一次,这样数据就丢失了
-1的话,给leader发消息,leader给follower同步消息,给一个follower同步消息时,这个follower迟迟没有同步,这个时候就会出现问题,leader没法向生产者答应
解决办法:leader维护了一个动态的额isr ,这里面存的时leader和follower的集合,如果我同步数据follower迟迟没有给我应答,isr就会把该follower踢出isr默认时间时30m
这还不是最安全的,如果分区副本设置为1,只有一个leader,这个效果跟ack等于一的效果是一样的,仍然有丢数的风险。
数据完全可靠的条件=ACK级别设置为-1+分区副本大于等于2+ISR里应答的最小副本数量大于等于2
副本数量是2,但是ISR中不一定有两个,因为会挂掉
7、怎么尽可能保证 Kafka 的可靠性
把ack调到-1 生产者发送过来的数据,leader和isr队列里面的所有节点收齐数据后应答。这保证了kafka的可靠性。
数据完全可靠条件 = ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
8、Kafka中如何做到数据唯一,即数据去重?
幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复。
精确一次(Exactly)=幂等性+至少一次(ack=-1+分区副本数>=2+ISR最小副本数量>=2
幂等性类似与sql语句中的distinct
9、生产者如何提高吞吐量?
关于提高吞吐量就要提到kafka生产者的原理 首先要把 batch.size调大一点,默认是16k,到达16k发送一次,我们可以把这个batch.size调大个三到五倍,另外就是修改它的等待时间,因为它默认是发一条就走,连16k都达不到所以要修改这个等待的时间,设置时间为5-100ms,这个等待时间也不是越长越好,时间达到阈值就会下降,要把时间调到一个合适的时间,把消息压缩,双端队列可以设置大一点。最后就是调大分区数,比如原来是三个分区,我们调到五个分区。
1,首先要调整batch.size:批次的小 默认是16k
2,linger.ms:等待时间,修改为5-100ms
3,compression.type:压缩snappy
4,设置缓冲区大小 RecordAccumulator 修改为64m
10、zk在kafka集群中有何作用
1,zk储存的有topic的元数据,里面放着每个topic里谁是主节点谁是从节点的数据,真实的数据在kafka的datas放着。
2,zk在kafka中负责集群的协调和管理,还涉及Broker的注册和监控,topic的管理,controller的选举以及消费者管理。
11、简述kafka集群中的Leader选举机制
kafka集群中有一个broker的Controller会被选举为controller leader,负责管理集群broker的上下线
,所有topic的分区副本分配和leader 选举
leader 选举规则:首先由在isr中存货,按照ar中的排名在前的的优先
怎么选出controller leader,这个比较简单粗暴,controller谁先注册谁说了算
12、kafka是如何处理数据乱序问题的。
开启幂等性,如果不开启幂等性的话,只能把缓冲区设置为一,生产一个发一个应答一个然后再删除一个,如果发送不成功就一直发。如果开启幂等性的话就不需要设置为一,幂等性默认是开启的
幂等性是什么原理
13、kafka中节点如何服役和退役
服役节点
修改新节点里kafka的broker.id为3
删除kafka下的datas和logs
启动其他三台服务器上的kafka集群,先启动zk集群
单独启动新节点的kafka
执行负载均衡操作
创建一个要均衡的主题
在kafka下创建一个文件:vi topics-to-move.json
写上如下代码,如果多个topic 可以使用,分隔
{
"topics": [
{"topic": "third"}
],
"version": 1
}
创建副本存储计划(所有副本存储在 broker0、broker1、broker2、broker3 中)。4)
执行副本存储计划。
验证副本存储计划。
退役节点
1,执行负载均衡操作
1,创建一个要均衡的主题
2,创建执行计划。
3,创建副本存储计划(所有副本存储在 broker0、broker1、broker2 中)。
4,执行副本存储计划
5,验证副本存储计划。
6,执行停止命令
在 bigdata04上执行停止命令即可。
bin/kafka-server-stop.sh
14、Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?
LEO,每一个副本最后的偏移量offset+1
HW最高水位线,所有副本中最小的LEO
假如一个follower挂掉之后,会被踢出ISR群体,这个期间leader和follower会继续接收数据,当这个follower被重启时,它会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步
等该follower的LEO大于等于Partition的HW,即Follower追上leader之后就能重新假如ISR
15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢?
手动触发leader选举,使用kafka提供的工具kafka-leader-election.sh,可以手动触发特定Topic和分区的Leader选举。这可以通过指定具体的Topic和分区来完成,或者对所有分区进行操作
分区重分配(Reassign Partitions): 当执行分区副本重分配时,原来的Leader可能会变更,这时需要触发Leader选举。这可以通过Kafka的分区重分配功能来实现,其中会涉及到ReassignPartitionLeaderElectionStrategy
策略