Java程序员必会!java语言的编译命令是什么
害怕干不过SpringBoot?莫慌,我送你套神级pdf文档
随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,很多同学对 Spring Boot 理解不是那么深刻,经常就会被几个连环追问就给干趴下了!
今天小编就给大家整理了全套SpringBoot“神级PDF文档”:
面试篇:35常见知识点、21道必刷题、10个高频解析题
知识脑图篇:综合解析SpringBoot知识大全预览
进阶学习必备篇:《SpringBoot学习教程》、《深入浅出SpringBoot》、《SpringBoot实战》(配对学习效果更佳:《Spring实战(第4版)》)、《SpringBoo核心宝典》、《SpringBoot揭秘-快速构建微服务体系》
整套啃下来,希望可以帮助大家深入学习Spring Boot~
Kafka的多副本冗余设计
不管是传统的基于关系型数据库设计的系统,还是分布式的如zookeeper
、redis
、Kafka
、HDFS
等等,实现高可用的办法通常是采用冗余设计,通过冗余来解决节点宕机不可用问题。
首先简单了解Kafka的几个概念:
- 物理模型
- 逻辑模型
Broker(节点):Kafka服务节点,简单来说一个
Broker
就是一台Kafka服务器,一个物理节点。Topic(主题):在Kafka中消息以主题为单位进行归类,每个主题都有一个
Topic Name
,生产者根据Topic Name将消息发送到特定的Topic,消费者则同样根据Topic Name从对应的Topic进行消费。Partition(分区):
Topic
(主题)是消息归类的一个单位,但每一个主题还能再细分为一个或多个Partition
(分区),一个分区只能属于一个主题。主题和分区都是逻辑上的概念,举个例子,消息1和消息2都发送到主题1,它们可能进入同一个分区也可能进入不同的分区(所以同一个主题下的不同分区包含的消息是不同的),之后便会发送到分区对应的Broker节点上。Offset(偏移量):分区可以看作是一个只进不出的队列(Kafka只保证一个分区内的消息是有序的),消息会往这个队列的尾部追加,每个消息进入分区后都会有一个偏移量,标识该消息在该分区中的位置,消费者要消费该消息就是通过偏移量来识别。
其实,根据上述的几个概念,是不是也多少猜到了Kafka的多副本冗余设计实现了?别急,咱继续往下看。
在Kafka 0.8版本以前,是没有多副本冗余机制的,一旦一个节点挂掉,那么这个节点上的所有Partition
的数据就无法再被消费。这就等于发送到Topic的有一部分数据丢失了。
在0.8版本后引入副本记者则很好地解决宕机后数据丢失的问题。副本是以Topic
中每个Partition
的数据为单位,每个Partition的数据会同步到其他物理节点上,形成多个副本。
每个Partition
的副本都包括一个Leader
副本和多个Follower
副本,Leader由所有的副本共同选举得出,其他副本则都为Follower副本。在生产者写或者消费者读的时候,都只会与Leader打交道,在写入数据后Follower就会来拉取数据进行数据同步。
就这么简单?是的,基于上面这张多副本架构图就实现了Kafka的高可用。当某个Broker
挂掉了,甭担心,这个Broker
上的Partition
在其他Broker
节点上还有副本。你说如果挂掉的是Leader
怎么办?那就在Follower
中在选举出一个Leader
即可,生产者和消费者又可以和新的Leader
愉快地玩耍了,这就是高可用。
你可能还有疑问,那要多少个副本才算够用?Follower和Leader之间没有完全同步怎么办?一个节点宕机后Leader的选举规则是什么?
直接抛结论:
多少个副本才算够用? 副本肯定越多越能保证Kafka的高可用,但越多的副本意味着网络、磁盘资源的消耗更多,性能会有所下降,通常来说副本数为3即可保证高可用,极端情况下将replication-factor
参数调大即可。
Follower和Lead之间没有完全同步怎么办? Follower和Leader之间并不是完全同步,但也不是完全异步,而是采用一种ISR
机制(In-Sync Replica
)。每个Leader会动态维护一个ISR列表,该列表里存储的是和Leader基本同步的Follower。如果有Follower由于网络、GC等原因而没有向Leader发起拉取数据请求,此时Follower相对于Leader是不同步的,则会被踢出ISR列表。所以说,ISR列表中的Follower都是跟得上Leader的副本。
一个节点宕机后Leader的选举规则是什么? 分布式相关的选举规则有很多,像Zookeeper的Zab
、Raft
、Viewstamped Replication
、微软的PacificA
等。而Kafka的Leader选举思路很简单,基于我们上述提到的ISR
列表,当宕机后会从所有副本中顺序查找,如果查找到的副本在ISR列表中,则当选为Leader。另外还要保证前任Leader已经是退位状态了,否则会出现脑裂情况(有两个Leader)。怎么保证?Kafka通过设置了一个controller来保证只有一个Leader。
Ack参数决定了可靠程度
另外,这里补充一个面试考Kafka高可用必备知识点:request.required.asks
参数。
Asks这个参数是生产者客户端的重要配置,发送消息的时候就可设置这个参数。该参数有三个值可配置:0、1、All。
第一种是设为0,意思是生产者把消息发送出去之后,之后这消息是死是活咱就不管了,有那么点发后即忘的意思,说出去的话就不负责了。不负责自然这消息就有可能丢失,那就把可用性也丢失了。
第二种是设为1,意思是生产者把消息发送出去之后,这消息只要顺利传达给了Leader,其他Follower有没有同步就无所谓了。存在一种情况,Leader刚收到了消息,Follower还没来得及同步Broker就宕机了,但生产者已经认为消息发送成功了,那么此时消息就丢失了。注意,设为1是Kafka的默认配置!!!可见Kafka的默认配置也不是那么高可用,而是对高可用和高吞吐量做了权衡折中。
第三种是设为All(或者-1),意思是生产者把消息发送出去之后,不仅Leader要接收到,ISR列表中的Follower也要同步到,生产者才会任务消息发送成功。
进一步思考,Asks=All
就不会出现丢失消息的情况吗?答案是否。当ISR列表只剩Leader的情况下,Asks=All
相当于Asks=1
,这种情况下如果节点宕机了,还能保证数据不丢失吗?因此只有在Asks=All
并且有ISR中有两个副本的情况下才能保证数据不丢失。
解决问题
绕了一大圈,了解了Kafka的高可用机制,终于回到我们一开始的问题本身,Kafka
的一个节点宕机后为什么不可用?
我在开发测试环境配置的Broker
节点数是3,Topic
是副本数为3,Partition
数为6,Asks
参数为1。
当三个节点中某个节点宕机后,集群首先会怎么做?没错,正如我们上面所说的,集群发现有Partition的Leader失效了,这个时候就要从ISR列表中重新选举Leader。如果ISR列表为空是不是就不可用了?并不会,而是从Partition存活的副本中选择一个作为Leader,不过这就有潜在的数据丢失的隐患了。
所以,只要将Topic副本个数设置为和Broker个数一样,Kafka的多副本冗余设计是可以保证高可用的,不会出现一宕机就不可用的情况(不过需要注意的是Kafka有一个保护策略,当一半以上的节点不可用时Kafka就会停止)。那仔细一想,Kafka上是不是有副本个数为1的Topic?
问题出在了__consumer_offset
上,__consumer_offset
是一个Kafka自动创建的Topic
,用来存储消费者消费的offset
(偏移量)信息,默认Partition
数为50。而就是这个Topic,它的默认副本数为1。如果所有的Partition
都存在于同一台机器上,那就是很明显的单点故障了!当将存储__consumer_offset
的Partition的Broker给Kill后,会发现所有的消费者都停止消费了。
这个问题怎么解决?
第一点,需要将__consumer_offset
删除,注意这个Topic时Kafka内置的Topic,无法用命令删除,我是通过将logs
删了来实现删除。
第二点,需要通过设置offsets.topic.replication.factor
为3来将__consumer_offset
的副本数改为3。
通过将__consumer_offset
也做副本冗余后来解决某个节点宕机后消费者的消费问题。
最后,关于为什么__consumer_offset
的Partition会出现只存储在一个Broker上而不是分布在各个Broker上感到困惑,如果有朋友了解的烦请指教~
总结:心得体会
既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。
学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。
面试大厂,最基本的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。
最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。
领取上述资料,只需点击这里即可免费下载
大厂Java架构核心笔记(适合中高级程序员阅读):
避免低效学习。
领取上述资料,只需点击这里即可免费下载
大厂Java架构核心笔记(适合中高级程序员阅读):
Java程序员必会!java语言的编译命令是什么相关推荐
- 每个Java程序员必须知道的5个JVM命令行标志
不熟悉JVM将不仅会影响应用程序性能,而且当JVM出问题时,尝试修复也会很困难. 本文将介绍一些命令行标志,您可以使用它们来诊断和调优您的Java虚拟机性能. 1.DisableExplicitGC ...
- java架构师之路:JAVA程序员必看的15本书的电子版下载地址
java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...
- JAVA程序员必看的15本书
java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...
- Java程序员必看的15本书的电子版下载地址
Java程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺 ...
- java程序员必看书籍
学习Java最痛苦的事情莫过于对未来职业方向的选择.尤其是选择开发Java Application还是Java Web方向,在你先定好大类后还有数不尽的小类教你无从学起. 因此,作为初学者的你必须看完 ...
- 收藏|Java程序员必看的几本基础书籍和常用工具
java程序员必看基础书籍和工具 1计算机基础 1.<深入理解计算机系统> 著名的CSAPP,从c语言到汇编语言到硬件再到操作系统,写得非常好.是一本能帮助深入理解计算机系统的书.基本上把 ...
- Java程序员必看的9本基础书籍推荐!
互联网的迅速发展给IT行业提供了广阔的前景,很多IT企业为了更好的发展,不惜重金聘请软件开发人才以增强自己在市场上的竞争力.这也让IT从业人员薪资水涨船高,许多人纷纷转投Java开发行业.很多人学Ja ...
- Java之父James Gosling鼎力推荐《Effective Java 第三版》最新中文版,Java程序员必看神书
前言 Java之父James Gosling鼎力推荐.Jolt获奖作品全新升级,针对Java 7.8.9全面更新,Java程序员必备参考书.包含大量完整的示例代码和透彻的技术分析,通过90条经验法则, ...
- 外包3年,吃透这三份Java程序员必刷的算法宝典后,已从13K涨到25K
懂点算法,很有必要 "不学数据结构和算法,一辈子都是码畜".不管你是 Java 程序员.算法工程师.数据分析师,还是技术管理者.架构师...... 我们都有一个共同的目标,就是在技 ...
- Java程序员必背单词
Java程序员必背单词 1.routput输出 2.math数学 3.try试图 4.catch抓住 5.throws抛出 6.abstract抽象 7.iterator迭代器 8.public公众的 ...
最新文章
- 如何在C中为一个数组分配空间?
- Knative Serving 健康检查机制分析
- Dockerfile中的保留字指令讲解
- vs2019配置OpenGL
- 复工后,汉堡薯条、奶茶“续命”又开始了
- Java文件下载中文名不显示乱码
- JavaScript(四)字符串类型
- PHP导航栏管理,zblog导航栏管理设置的几种方法
- 策略模式【设计模式学习-02】
- java 前端通过浏览器下载服务器上的文件
- 层次分析法-yaahp软件使用
- json字符串转对象数组
- 发几个flashxp注册码
- 怎么把PDF转换成jpg图片?这两种方法快来get
- 安葬于西敏寺的英国国教主教的墓志铭:
- 计算机思维与应用论文,计算机的思维与计算机应用关系分析
- 条件计数:COUNTIF、COUNTIFS函数
- 幼师计算机应用基础的认识200字,《计算机应用基础》课程教学与学前教育专业的深度融合...
- 基础知识 | hex文件格式详解
- 整理UI设计的三个分类,入门前要清楚!
热门文章
- golang学习资源
- 系统集成项目管理工程师英语题翻译
- html 拓扑图 开源,GitHub - pylixm/zJTopo: 开源拓扑图工具类jTopo的扩展,jtopo是一个不错的拓扑图,基于html5 canvas,功能强大...
- 经典:创业的100个成功经验方法谈
- 使用vmstat命令监视系统内存--用Enki学Linux系列(14)
- 06_03_SpringMVC 任务一: SpringMVC基本应用(SpringMVC请求与响应,进行日期转换工具类DateConverter)
- vue + vuex 实现评论和回复
- HYSBZ - 2959 长跑(动态树+并查集)
- 性别符号php,树也分男女?给6万棵杨树画上性别符号,原来是因为…
- 用多种方法求最大公倍数和最小公因数的java代码