kafka面试夺命连环三十问(上篇)

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策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9746.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】再谈网络基础(二)

8. 再谈端口号 (一)与协议之间的关系 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识…

关键词策略的有效运用提升内容价值和搜索排名的关键

内容概要 在当今的数字时代,关键词策略是确保内容创作成功的重要基础。无论是个人博客还是商业网站,合适的关键词不仅能够提升文章的可见性,还能显著影响搜索引擎的排名。合理运用关键词,有助于吸引目标读者,将他们引…

1.62亿元!812个项目立项!上海市2024年度“科技创新行动计划”自然科学基金项目立项

本期精选SCI&EI ●IEEE 1区TOP 计算机类(含CCF); ●EI快刊:最快1周录用! 知网(CNKI)、谷歌学术期刊 ●7天录用-检索(100%录用),1周上线; 免费稿件评估 免费匹配期…

【Ant Design Pro】不想用轻量的hook就喜欢用dva的数据状态管理

就像TS是JS的超集一样,antdpro框架也类似,底层也是用dva来构建的。关于数据管理,官方还是建议我们使用轻量的hooks方法来进行操作使用。 使用dva实现数据状态管理效果 框架中的数据管理模式 简单的数据共享 对于简单的应用,不需…

requestAnimationFrame与setInterval的抉择

🙌 如文章有误,恳请评论区指正,谢谢! ❤ 写作不易,「点赞」「收藏」「转发」 谢谢支持! 背景 在之前的业务中遇到有 JS 动画的实现场景,但当电脑打开太多网页或是同时启动很多应用时&#xff0c…

【C++练习】使用海伦公式计算三角形面积

编写并调试一个计算三角形面积的程序 要求: 使用海伦公式(Herons Formula)来计算三角形的面积。程序需要从用户那里输入三角形的三边长(实数类型)。输出计算得到的三角形面积,结果保留默认精度。提示用户…

附件商户,用户签到,uv统计功能(geo,bitmap,hyperloglog结构的使用)

目录 附近商户一:Geo数据结构二:附近商户搜索 用户签到一:BitMap功能演示二:实现签到功能三:统计签到功能 uv统计一:hyperloglog的用法二:测试百万数据的tji二:测试百万数据的tji 附…

【LuatOS】修改LuatOS源码为PC模拟器添加高精度时间戳库timeplus

0x00 缘起 LuatOS以及Lua能够提供微秒或者毫秒的时间戳获取工具,但并没有提供获取纳秒的工具。通过编辑LuatOS源码以及相关BSP源码,添加能够获取纳秒的timeplus库并重新编译,以解决在64位Windows操作系统中LuatOS模拟器获取纳秒的问题&#…

[Python学习日记-64] 组合

[Python学习日记-64] 组合 简介 继承与组合 组合的使用 简介 继承其实就是生活当中的归类,就是把对象之间的共同特征再一次提炼,然后形成一个类,但是在实际的开发当中不单单只有归类这一个动作,对象与对象之间都会有一些关系&a…

关于stm32中IO映射的一些问题

在STM32固件库(比如HAL或LL库)中,GPIO的寄存器映射已经定义好了,开发者可以通过标准的读写操作访问GPIO引脚的状态。 一、我们可以直接通过位移操作来修改特定值。 二、下面我们提供另一种方法,位带操作 首先要定义一…

Python游戏开发之《人机大战象棋》-附完整源码-python教程

今天给大家带来的是人机大战的象棋 中国象棋 首先绘制一下棋盘,看看样子: 黑白经典款 绘制棋盘: class Board(QLabel):棋盘坐标与屏幕坐标类似,左上角为 (0, 0),右下角为 (8, 9)BOARD str(dirpath / u"images…

AutoCAD2014

链接: https://pan.baidu.com/s/1Q4fhVmiSYDZ2DbPNi7m4cA 提取码: f3bm

免费送源码:Java+ssm+MySQL 在线购票影城 计算机毕业设计原创定制

摘要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设在线购票影城。 本设计…

MYSQL——事务管理

什么是事务 在数据库使用者角度,事务就是完成一个事件。例如一个员工信息数据库,要完成员工离职的事件,可能需要很多操作,比如删除员工基本信息以及员工在公司的表现,薪资水平等。而这一系列的操作就是为了完成员工离…

书生实战营第四期-基础岛第四关-InternLM + LlamaIndex RAG 实践

一、任务要求1 基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前 浦语 API 不会回答,借助 LlamaIndex 后 浦语 API 具备回答 A 的能力,截图保存。 1、配置开发机系统 镜像:使用 Cuda12.0-conda 镜…

LC:二分查找——杂记

文章目录 268. 丢失的数字162. 寻找峰值 268. 丢失的数字 LC将此题归类为二分查找,并且为简单题,下面记一下自己对这道题目的思考。 题目链接:268.丢失的数字 第一次看到这个题目,虽然标注的为简单,但肯定不能直接排…

推荐一款国产数据库管理工具Chat2DB

什么是 Chat2DB ? Chat2DB 是一款专为现代数据驱动型企业打造的数据库管理、数据开发及数据分析工具。作为一款AI原生的产品,Chat2DB 将人工智能技术与传统数据库管理功能深度融合,旨在提供更为智能、便捷的工作体验,助力用户高效地管理数据…

前端三件套(HTML + CSS + JS)

前言: 前端三件套,会用就行 毕竟在后面学习JavaWeb,以及在学习vue的时候也有帮助 前端三件套: HTML 定义网页的结构和内容。CSS 负责网页的样式和布局。JavaScript 添加动态交互和功能。 使用到的工具是Visual Studio Code 即…

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能,我使用了flutter_reactive_ble这个库,但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

网络编程示例之网络基础知识

TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP: TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送…