从Kafka的可靠性设计体验软件设计之美

这篇具有很好参考价值的文章主要介绍了从Kafka的可靠性设计体验软件设计之美。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. Kafka可靠性概述

2. 副本剖析

     2.1 什么是副本

   2.2 副本失效场景

  2.3 数据丢失场景

2.4 解决数据丢失方案

3. 日志同步机制

4. 可靠性分析


1. Kafka可靠性概述

     Kafka 中采用了多副本的机制,这是大多数分布式系统中惯用的手法,以此来实现水平扩展、提供容灾能力、提升可用性和可靠性等。

2. 副本剖析

     2.1 什么是副本

            副本(Replica)是分布式系统中常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。

   2.2 副本失效场景

        a.  follower副本进程卡住,在一段时间内根本没有向leader副本发起同步请求,比如频繁的Full GC。

       b.   follower副本进程同步过慢,在一段时间内都无法追赶上leader副本,比如I/O开销过大。

       c.   如果通过工具增加了副本因子,那么新增加的副本在赶上leader副本之前也都是处于失效状态的。

  2.3 数据丢失场景

      在某一时刻,B中有2条消息m1和m2,A从B中同步了这两条消息,此时A和B的LEO都为2,同时HW都为1;之后A再向B中发送请求以拉取消息,FetchRequest请求中带上了A的LEO信息,B在收到请求之后更新了自己的HW为2;B中虽然没有更多的消息,但还是在延时一段时间之后返回FetchResponse,并在其中包含了HW信息;最后A根据FetchResponse中的HW信息更新自己的HW为2。
从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式
                                           数据丢失场景(part 1)
        可以看到整个过程中两者之间的HW同步有一个间隙,在A写入消息m2之后(LEO更新为2)需要再一轮的FetchRequest/FetchResponse才能更新自身的HW为2。如果在这个时候A宕机了,那么在A重启之后会根据之前HW位置(这个值会存入本地的复制点文件replication-offset-checkpoint)进行日志截断,这样便会将m2这条消息删除,此时A只剩下m1这一条消息,之后A再向B发送FetchRequest请求拉取消息。
从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式
                                                                  数据丢失场景(part 2)
       此时若B 再宕机,那么 A 就会被选举为新的leader,B 恢复之后会成为follower,由于follower副本HW不能比leader副本的HW高,所以还会做一次日志截断,以此将HW调整为1。这样一来m2这条消息就丢失了(就算B不能恢复,这条消息也同样丢失)。
从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式
                                                                  数据丢失场景(part 3)
         对于这种情况,也有一些解决方法,比如等待所有follower副本都更新完自身的HW之后再更新leader副本的HW,这样会增加多一轮的FetchRequest/FetchResponse延迟,自然不够妥当。还有一种方法就是follower副本恢复之后,在收到leader副本的FetchResponse前不要截断follower副本(follower副本恢复之后会做两件事情:截断自身和向leader发送FetchRequest请求),不过这样也避免不了数据不一致的问题。
       当前leader副本为A,follower副本为B,A中有2条消息m1和m2,并且HW和LEO都为2,B中有1条消息m1,并且HW和LEO都为1。假设A和B同时“挂掉”,然后B第一个恢复过来并成为leader。

从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式
                                                                   数据不一致场景(part 1)
从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式
                                                              数据不一致场景(part 2)
         之后B写入消息m3,并将LEO和HW更新至2(假设所有场景中的min.insync.replicas参数配置为1)。此时A也恢复过来了,根据前面数据丢失场景中的介绍可知它会被赋予follower的角色,并且需要根据HW截断日志及发送FetchRequest至B,不过此时A的HW正好也为2,那么就可以不做任何调整了。
从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式
                                                                  数据不一致场景(part 3)
如此一来A中保留了m2而B中没有,B中新增了m3而A也同步不到,这样A和B就出现了数据不一致的情形。

2.4 解决数据丢失方案

     为了解决数据丢失问题,Kafka从0.11.0.0开始引入了leader epoch的概念,在需要截断数据的时候使用leader epoch作为参考依据而不是原本的HW。leader epoch代表leader的纪元信息(epoch),初始值为0。每当leader变更一次,leader epoch的值就会加1,相当于为leader增设了一个版本号。

从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式

       A在收到2之后发现和目前的LEO相同,也就不需要截断日志了。之后B发生了宕机,A成为新的leader,那么对应的LE=0也变成了LE=1,对应的消息m2此时就得到了保留,之后不管B有没有恢复,后续的消息都可以以LE1为LeaderEpoch陆续追加到A中。

3. 日志同步机制

          在Kafka中动态维护着一个ISR集合,处于ISR集合内的节点保持与leader相同的高水位(HW),只有位列其中的副本(unclean.leader.election.enable配置为false)才有资格被选为新的 leader。写入消息时只有等到所有 ISR 集合中的副本都确认收到之后才能被认为已经提交。位于 ISR 中的任何副本节点都有资格成为 leader,选举过程简单、开销低,这也是Kafka选用此模型的重要因素。Kafka中包含大量的分区,leader副本的均衡保障了整体负载的均衡,所以这一因素也极大地影响Kafka的性能指标。
        在采用ISR模型和(f+1)个副本数的配置下,一个Kafka分区能够容忍最大f个节点失败,相比于“少数服从多数”的方式所需的节点数大幅减少。

4. 可靠性分析

        生产者客户端参数 acks,相比于0和1,acks=-1(客户端还可以配置为all,它的含义与-1一样,以下只以-1来进行陈述)可以最大程度地提高消息的可靠性。

      对于acks=1的配置,生产者将消息发送到leader副本,leader副本在成功写入本地日志之后会告知生产者已经成功提交,如图8-24所示。如果此时ISR集合的follower副本还没来得及拉取到leader中新写入的消息,leader就宕机了,那么此次发送的消息就会丢失。

   从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式

     ack=-1的配置,生产者将消息发送到leader副本,leader副本在成功写入本地日志之后还要等待 ISR 中的 follower 副本全部同步完成才能够告知生产者已经成功提交,即使此时leader副本宕机,消息也不会丢失,如果在消息成功写入leader副本之后,并且在被ISR中的所有副本同步之前leader副本宕机了,那么生产者会收到异常以此告知此次发送失败。

从Kafka的可靠性设计体验软件设计之美,消息中间件,kafka,数据库,分布式

      

       

   

    

           文章来源地址https://www.toymoban.com/news/detail-861665.html

到了这里,关于从Kafka的可靠性设计体验软件设计之美的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 系统架构设计师教程(十)软件可靠性基础知识

    软件架构的演化是为了适应用户需求、业务环境和运行环境的变化,它涵盖了软件架构的全生命周期,包括需求获取、建模、文档、实现和维护等阶段。软件架构的演化的重要性体现在以下几个方面: 保障软件系统质量:软件架构支撑整个软件系统,决定其性能、可靠性、安

    2024年01月18日
    浏览(63)
  • VR全景乡村旅游浇灭乡愁,近距离体验自然之美

    说起乡愁,可能每位漂泊的游子都有所感受,在外漂泊数十载,每到佳节倍思亲,家乡的一草一木都浮现在脑海中,满载着儿时的回忆。为了留住那抹儿时回忆,VR全景助力数字化乡村建设。 乡村振兴是国家的重大战略,而VR全景只是其中的一个展现形式,让乡村振兴有了更

    2024年02月13日
    浏览(46)
  • 小程序文章采集大比拼:功能丰富、体验流畅、数据可靠

    敬请期待我们的评测报告!本次报告将深入考察数个小程序在文章内容采集中的具体表现,包括它们各自的功能、用户体验和数据精准度等方面,力求为每一位阅读者提供详实而实用的对比参考信息。 1.功能丰富多样: 各种小程序都友好地提供丰富齐全的文章采集功能,如关

    2024年02月22日
    浏览(40)
  • Kafka如何保证数据高可靠

    Kafka它本身其实不是一个金融级别数据可靠的分布式消息系统。 虽然说它存储到某个topic里的数据会先拆分多个partition,这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本,不同的副本存储在不同的节点。这样的话任意一个节点挂掉,其实数据是不丢

    2024年02月09日
    浏览(42)
  • Kafka 相关参数以及可靠性

    1、消息存储可靠性 Kafka 通过持久化消息到磁盘来保障消息存储的可靠性,但是消息都是先写到操作系统的页缓存中,如果没有fsync到磁盘,存在消息丢失的可能性 Kafka 提供了两个参数来控制 Broker 的刷盘时机: log.flush.interval.ms long型,默认值null,单位ms,用于控制日志刷盘的

    2024年02月16日
    浏览(39)
  • 品味布隆过滤器的设计之美

    布隆过滤器是一个精巧而且经典的数据结构。 你可能没想到: RocketMQ、 Hbase 、Cassandra 、LevelDB 、RocksDB 这些知名项目中都有布隆过滤器的身影。 对于后端程序员来讲,学习和理解布隆过滤器有很大的必要性。来吧,我们一起品味布隆过滤器的设计之美。 我们先来看一个商品

    2023年04月14日
    浏览(30)
  • Kafka 入门到起飞 - Kafka是怎么保证可靠性的呢

    什么是消息的可靠性呢,就是Kafka作为消息中间件,可以保证生产者发送过来的消息,即使在Kafka集群有节点出现宕机的情况下,也不会丢失 Kafka 是通过 消息确认机制 和 副本复制机制 来保证消息可靠性的 创建topic时,可以指定 副本因子 repilication-factor = 3 ,默认是3 表示分区

    2024年02月12日
    浏览(36)
  • Kafka 高可靠高性能原理探究

    在探究 Kafka 核心知识之前,我们先思考一个问题: 什么场景会促使我们使用 Kafka?  说到这里,我们头脑中或多或少会蹦出 异步解耦 和 削峰填谷等字样,是的,这就是 Kafka 最重要的落地场景。 异步解耦 :同步调用转换成异步消息通知,实现生产者和消费者的解耦。想象一

    2024年02月04日
    浏览(41)
  • 设计模式之美——单元测试和代码可测性

    最可落地执行、最有效的保证重构不出错的手段应该就是单元测试(Unit Testing)。 什么是单元测试? 单元测试由研发工程师自己来编写,用来测试自己写的代码的正确性。我们常常将它跟集成测试放到一块来对比。单元测试相对于集成测试(Integration Testing)来说,测试的粒

    2024年02月12日
    浏览(47)
  • Kafka—工作流程、如何保证消息可靠性

    分布式事件流平台 。希望不仅仅是存储数据,还能够数据存储、数据分析、数据集成等功能。消息队列(把数据从一方发给另一方),消息生产好了但是消费方不一定准备好了(读写不一致),就需要一个中间商来存储信息,kafka就是中间商 架构图如下: 名称 解释 Broker 消

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包