0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探究Kafka宕机引发的高可用问题

马哥Linux运维 来源:掘金 作者:JanusWoo 2021-10-20 15:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、Kafka宕机引发的高可用问题

问题要从一次Kafka的宕机开始说起。

笔者所在的是一家金融科技公司,但公司内部并没有采用在金融支付领域更为流行的RabbitMQ ,而是采用了设计之初就为日志处理而生的Kafka,所以我一直很好奇Kafka的高可用实现和保障。从Kafka部署后,系统内部使用的Kafka一直运行稳定,没有出现不可用的情况。

但最近系统测试人员常反馈偶有Kafka消费者收不到消息的情况,登陆管理界面发现三个节点中有一个节点宕机挂掉了。但是按照高可用的理念,三个节点还有两个节点可用怎么就引起了整个集群的消费者都接收不到消息呢?

要解决这个问题,就要从Kafka的高可用实现开始讲起。

二、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上感到困惑,如果有朋友了解的烦请指教~

作者:JanusWoo

来源:https://juejin.im/post/6874957625998606344

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HDFS
    +关注

    关注

    1

    文章

    32

    浏览量

    10140
  • kafka
    +关注

    关注

    0

    文章

    55

    浏览量

    5595

原文标题:从一次 Kafka 节点宕机探究 Kafka 的高可用实现

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Cloudflare宕机!全球网络崩了

    错误提示。而这一切的原因在于互联网基础设施服务商Cloudflare又宕机了。   尽管Cloudflare随后表示,目前已修复问题。但对此已经造成的数十亿美元的损失,这次事件持续超三小时,影响范围极广,甚至波及用于监测网站状态的平台Downdetector本身,因其也依赖C
    的头像 发表于 11-21 08:57 9709次阅读

    靠港供电总中断,CSD 船用变压器如何保障船舶用电连续不宕机

    船舶靠港期间,供电中断就是灾难——冷库停运货物变质、导航通讯中断影响航行、生活设备停运船员无法正常作息,甚至引发电路故障危及船舶安全。可现实中,接岸电后频繁跳闸、电压不稳、设备罢工导致供电中断的情况
    的头像 发表于 04-12 00:00 1034次阅读
    靠港供电总中断,CSD 船用变压器如何保障船舶用电连续不<b class='flag-5'>宕机</b>?

    工程师之夜系列分享第三十九篇:Kafka、RocketMQ、JMQ 存储架构深度对比

    开源,金融级特性突出)、JMQ(京东开源,侧重可用与灵活性),从存储模型、数据组织、索引设计等维度展开深度对比,为技术选型与架构优化提供参考。​ 本文将从概念辨析出发,系统拆解主流存储模型与存储引擎的设计逻辑,对比 JMQ、Kafka
    的头像 发表于 01-13 16:19 291次阅读
    工程师之夜系列分享第三十九篇:<b class='flag-5'>Kafka</b>、RocketMQ、JMQ 存储架构深度对比

    探究PCB样板贴片技术特点

    PCB样板贴片技术是现代电子制造过程中不可或缺的一环,它可以为量产前的电路板测试提供参考,发现不足之处,从而避免一些不必要的错误和损失。本文将从技术特点、优缺点和售卖市场等方面深入探究PCB样板贴片
    的头像 发表于 01-08 12:46 305次阅读
    <b class='flag-5'>探究</b>PCB样板贴片技术特点

    探究TDA8035:集成低功耗智能卡接口的实用之选

    探究TDA8035:集成低功耗智能卡接口的实用之选 在智能卡技术广泛应用的今天,一款性能卓越的智能卡接口芯片显得尤为重要,NXP的TDA8035就是这样一款值得关注的产品。它是集成式接触式智能卡
    的头像 发表于 12-28 15:05 1492次阅读

    模块电源使用指南:核心注意点与最佳实践

    模块电源以其小体积、集成度、高可靠性等优点,在电子设备中得到了广泛应用。然而,要充分发挥其性能并确保系统长期稳定运行,正确的使用至关重要。忽视细节可能导致电源损坏、系统宕机,甚至引发安全隐患。
    的头像 发表于 10-28 18:33 923次阅读
    模块电源使用指南:核心注意点与最佳实践

    企业级HDFS可用与YARN资源调度方案

    作为一名在大数据运维领域摸爬滚打8年的老兵,我见过太多因为基础架构不够健壮而导致的生产事故。今天,我想和大家分享一套经过实战检验的 HDFS 可用与 YARN 资源调度方案,这套方案帮助我们团队将平台可用性从 99.5% 提升
    的头像 发表于 09-08 17:15 868次阅读

    华纳云:海外服务器负载均衡与可用架构设计

    在现代互联网应用中,海外服务器承担着跨境业务、并发请求和实时数据传输的关键角色。单台服务器难以支撑大量并发请求,一旦发生故障,可能导致服务中断和业务损失。因此,合理设计负载均衡与可用架构,能够
    的头像 发表于 08-28 18:32 795次阅读

    深入剖析RabbitMQ可用架构设计

    在微服务架构中,消息队列故障导致的系统不可用率高达27%!如何构建一个真正可靠的消息中间件架构?本文将深入剖析RabbitMQ可用设计的核心要点。
    的头像 发表于 08-18 11:19 1095次阅读

    QNAP 正式推出 NAS 双机架构的可用性解决方案,打造不中断的储存环境

    台北2025年7月28日 /美通社/ -- 运算、网通与储存解决方案领导品牌威联通®科技 (QNAP® Systems, Inc.) 今日正式发布可用性 (High Availability
    的头像 发表于 07-28 09:26 719次阅读

    Kafka生产环境应用方案

    Apache Kafka作为分布式流处理平台,在现代大数据架构中扮演着消息中间件的核心角色。本文将从运维工程师的角度,详细介绍Kafka在生产环境中的部署方案、配置优化、监控运维等关键技术。通过实战案例和代码示例,帮助运维团队构建稳定、高效的
    的头像 发表于 07-09 09:56 686次阅读

    工控一体机散热不良导致宕机?聚徽揭秘3 步优化散热方案 + 选型避坑指南

    在工业自动化进程加速的当下,工控一体机凭借高度集成化和强大的运算能力,成为生产线上不可或缺的核心设备。然而,散热不良引发宕机问题,却如同隐藏在设备中的 “定时炸弹”,不仅中断生产流程,还可能造成
    的头像 发表于 07-02 10:23 1167次阅读

    介绍三种常见的MySQL可用方案

    在生产环境中,为了确保数据库系统的连续可用性、降低故障恢复时间以及实现业务的无缝切换,可用(High Availability, HA)方案至关重要。本文将详细介绍三种常见的 MySQL
    的头像 发表于 05-28 17:16 1439次阅读

    MYSQL集群可用和数据监控平台实现方案

    该项目共分为2个子项目,由MYSQL集群可用和数据监控平台两部分组成。
    的头像 发表于 05-28 10:10 1457次阅读
    MYSQL集群<b class='flag-5'>高</b><b class='flag-5'>可用</b>和数据监控平台实现方案

    Kafka工作流程及文件存储机制

    Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的。
    的头像 发表于 05-19 10:14 1067次阅读
    <b class='flag-5'>Kafka</b>工作流程及文件存储机制