首页 > 其他分享 >面试官:Leader崩溃Follower不够新怎么办?

面试官:Leader崩溃Follower不够新怎么办?

时间:2024-08-27 12:14:44浏览次数:13  
标签:面试官 Partition Kafka 升级 Follower Leader 节点

这是一道非常经典的 Kafka 问题,是关于 Leader 在“异常”情况下的选举问题。

背景

我们知道 Kafka 中的 Partition(分区)是存储消息的最终介质,但 Partition 又有两种分类:

  1. Leader Partition:主分区,负责数据写入和读取。
  2. Follower Partition:副本分区,用于数据备份和主节点宕机之后的分区选举,保证了 Kafka 服务的高可用。

如下图所示:
image.png
其中,Leader Partition 是用来处理生产者和消费者请求的,而 Follower Partition 是用来保证 Kafka 集群的高可用的,也就是当 Leader Partition 宕机之后,会通过某种算法将其中一个 Follower Partition 升级为 Leader Partition 继续运行。

不同步的 Follower 节点

在分布式系统下,数据一致性问题是一个令人头疼的问题,那么这个问题在 Kafka Leader Partition 和 Follower Partition 中也存在,例如以下场景:
image.png
也就是说,Follower Partition 还未从 Leader Partition 中同步到最新的数据,Leader Partition 就突然宕机了,这就产生了不同的 Follower 节点了。

小知识点:数据一致性问题是指在一个系统中,不同部分的数据在逻辑上应该保持一致,但实际情况却出现了矛盾或不匹配的现象。

那问题来了,如果有不同步的 Follower Partition 要升级为 Leader 会发生什么问题?

升级 VS 不升级

当出现不同步的 Follower Partition,而 Leader Partition 有意外宕机的场景,此时我们有两种选择:

  1. 将不同步的 Follower 节点升级为 Leader 节点:但这样就会造成数据丢失的问题,但好处是此时集群可以继续运行。
  2. 不同步的 Follower 不自动升级 Leader 节点:等待原 Leader 恢复再继续运行,此时不会导致数据丢失,但可能要等待很久才能恢复 Kafka 服务的正常运行,因为 Leader 宕机可能要更新内存芯片之后才能运行,而这个时间是比较久的。

所以,不同步的 Follower 节点是升级为 Leader 或不升级为 Leader 都有其优点和缺点。

使用者的选择权

而在这种情况下,Kafka 就把这个选择权给使用者了,此时我们可以通过配置 Broker(或集群)的“unclean.leader.election.enable”属性来决定到底要不要升级不同步的 Follower 节点为 Leader 节点,这个属性有以下两个值可以设置:

  1. true:如果此属性设置为 true,那么即使是不完全同步的 Follower Partition 也会升级为 Leader,此时牺牲了一定的数据一致性(数据丢失风险),保证了 Kafka 服务的高可用。
  2. false:如果此属性设置为 false,就表示不会将不完全同步的 Follower Partition 升级为 Leader,会等待原 Leader 重新上线之后才能继续运行 Kafka 服务。此时保证了数据的一致性,但牺牲了 Kafka 服务的可用性。

unclean.leader.election.enable 的默认值为 true。

因此,如果是对数据丢失不敏感的系统可以使用 unclean.leader.election.enable=true,如果对数据丢失敏感的,例如银行系统等可以使用 unclean.leader.election.enable=false 保证数据的一致性。

课后思考

说说 Follower 升级为 Leader 的选举算法和执行流程?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:面试官,Partition,Kafka,升级,Follower,Leader,节点
From: https://www.cnblogs.com/vipstone/p/18382420

相关文章

  • 大厂面试官:Redis分布式锁掌握的还可以啊,那你了解Redis集群下的分布式锁么? 我:不好意思,
    大厂常问面试题,Redis集群下的分布式锁,你了解多少?希望大家能关注点赞,创作不易且没收益,您的小小举动却能给予我大大的鼓励,会激励我继续创作出高质量文章......
  • 面试官问什么?Python基础与进阶?介绍Django框架?MySQL数据库索引?
    Catalog自我介绍Python001.Python支持哪些数据类型?01.数字类型02.序列类型03.映射类型04.集合类型05.其他类型06.特点总结002.什么是模块(module),如何导入一个模块?01.导入模块02.`import`和`from...import...`的区别003.高频发问题004.数据去重005.Python中......
  • 大厂面试官:你知道Redis如何实现分布式锁么?
    常见面试题,看完基本也没啥问题了Redis如何实现分布式锁分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。如下图所示:Redis本身可以被多个客户端共享访问,正好就是一个共享存储系统,可以用来保存分布式锁,而且Redis的读写......
  • HR和面试官如何实现高效招聘?
    在人力资源管理的众多环节中,招聘无疑是最具挑战性的任务之一。对于HR和面试官而言,他们不仅要面对简历筛选的海量工作,还要确保面试过程的公正性,并准确评估候选人的潜力。这些问题的解决对于构建高效、公正的招聘流程至关重要。那么如何安排好面试、提高面试效率等工作难题是HR和......
  • 这是我见过的(最全面,最优质的)Java的List集合常见面试题汇总,一文讲完,通俗易懂,看完不吊打
    Arraylist和数组(Array)的区别?ArrayList内部基于动态数组实现,比Array(静态数组)使用起来更加灵活:ArrayList会根据实际存储的元素动态地扩容或缩容,而Array被创建之后就不能改变它的长度了。ArrayList允许你使用泛型来确保类型安全,Array则不可以。ArrayList中只能存储对象......
  • 面试官:JDK中都用了哪些设计模式?
    设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK中都用了哪些设计模式?我按照大家比较熟悉且好理解的方式,把JDK中使用的设计模......
  • 面试官:说说volatile应用和实现原理?
    volatile是并发编程中的重要关键字,它的名气甚至是可以与synchronized、ReentrantLock等齐名,也是属于并发编程五杰之一。需要注意的是volatile并不能保证原子性,因此使用volatile并没有办法保证线程安全。并发编程五杰:PS:“并发编程五杰”是我个人起的名字,大家也不用太......
  • 29. Hibernate 面试官必须出的面试题
    1.前言本节课先和大家聊聊面试过程中需要注意的事项,再和大家一起讲解Hibernate中常见的面试题。2.面试技巧面试官出的面试题一般会有3个特点:强调原理性: 通过面试者对问题原理性的讲解,可以了解面试者是否真正理解、掌握了相关知识。对于知识而言,用是一个层次,说出来......
  • 面试官:说说读写锁的实现原理?
    在实际项目开发中,并发编程一定会用(提升程序的执行效率),而用到并发编程那么锁机制就一定会用,因为锁是保证并发编程的主要手段。在Java中常用的锁有以下几个:synchronized(内置锁):Java语言内置的关键字,JVM层级锁实现,使用起来较为简单直观。ReentrantLock(可重入锁):需要显式地获取......
  • Flow -- 理解(面试官最爱问的7个Flow问题)
    1、问题: 请解释Flow是什么,与传统的RxJava相比有何优势?出发点:在回答这个问题时,应当强调对Flow的理解以及与RxJava的对比。涉及到Flow的背后原理、冷流、热流的概念,以及在响应式编程中的应用场景。参考简答:Flow是一种基于协程的响应式编程库,用于处理异步数据流。与RxJava相......