华人澳洲中文论坛

热图推荐

    出产环境里的Kafka每天丢动静,老大逼着我彻夜排查解决

    [复制链接]

    2022-9-13 09:38:59 22 0

    目录
    一、配景引入二、Kafka散布式存储架构三、Kafka高可用架构四、画图复现Kafka的写入数据丧失问题五、Kafka的ISR机制是甚么?六、Kafka写入的数据如何包管不丧失?七、总结一、配景引入
    这篇文章,给大家聊一下写入Kafka的数据该如何包管其不丧失?
    看过以前的文章《敲重点,MQ如何完成每秒几十万的高并发写入?面试官想听到甚么!》的同窗,应该都知道写入Kafka的数据是会落地写入磁盘的。
    咱们暂且不斟酌写磁盘的详细进程,先大抵看看上面的图,这代表了Kafka的中心架构原理。


    二、Kafka散布式存储架构
    那末当初问题来了,假如天天发生几十TB的数据,莫非都写一台机器的磁盘上吗?这显著是不靠谱的啊!
    所以说,这里就得斟酌数据的散布式存储了,其实对于动静两头件的散布式存储以及高可用架构,以前的一篇文章《想去BAT、美团、京东和字节面试?那你必需懂他们的面试套路!》也剖析过了,然而这里,咱们结合Kafka的详细状况来讲说。
    在Kafka外面,有一个中心的概念叫做“Topic”,这个topic你就权且以为是一个数据聚拢吧。
    举个例子,假如你当初有一份网站的用户行动数据要写入Kafka,你能够搞一个topic叫做“user_access_log_topic”,这里写入的都是用户行动数据。
    而后假如你要把电商网站的定单数据的增删改动更记载写Kafka,那能够搞一个topic叫做“order_tb_topic”,这里写入的都是定单表的变卦记载。
    而后如果说我们举个例子,就说这个用户行动topic吧,外面假如天天写入几十TB的数据,你感觉都放一台机器上靠谱吗?
    显著不太靠谱,所以Kafka有一个概念叫做Partition,就是把一个topic数据聚拢拆分为多个数据分区,你能够以为是多个数据分片,每个Partition能够在不同的机器上,贮存部份数据。
    这样,不就能把一个超大的数据聚拢散布式存储在多台机器上了吗?大家看下图,一同来领会一下。


    三、Kafka高可用架构
    然而这个时分,咱们又会遇到一个问题,就是万一某台机器宕机了,这台机器上的阿谁partition办理的数据不就丧失了吗?
    所以说,咱们还得做多正本冗余,每个Partition均可以搞一个正本放在别的机器上,这样某台机器宕机,只不外是Partition其中一个正本丧失。
    假如某个Partition有多正本的话,Kafka会选举其中一个Parititon正本作为Leader,而后其余的Partition正本是Follower。
    只要Leader Partition是对外提供读写操作的,Follower Partition就是从Leader Partition同步数据。
    一旦Leader Partition宕机了,就会选举其余的Follower Partition作为新的Leader Partition对外提供读写办事,这不就完成了高可用架构了?
    大家看上面的图,看看这个进程。


    四、Kafka写入数据丧失问题
    当初咱们来看看,甚么状况下Kafka中写入数据会丧失呢?
    其实也很简略,大家都知道写入数据都是往某个Partition的Leader写入的,而后阿谁Partition的Follower会从Leader同步数据。
    然而万一1条数据刚写入Leader Partition,还没来得及同步给Follower,此时Leader Partiton所在机器忽然就宕机了呢?
    大家看下图:


    如上图,这个时分有一条数据是没同步到Partition0的Follower下来的,而后Partition0的Leader所在机器宕机了。
    此时就会选举Partition0的Follower作为新的Leader对外提供办事,而后用户是否就读不到方才写入的那条数据了?
    由于Partition0的Follower上是没有同步到最新的一条数据的。
    这个时分就会形成数据丧失的问题。
    五、Kafka的ISR机制是甚么?
    当初咱们先留着这个问题不说详细怎么解决,先回过头来看一个Kafka的中心机制,就是ISR机制。
    这个机制简略来讲,就是会自动给每个Partition保护一个ISR列表,这个列内外一定会有Leader,而后还会包孕跟Leader放弃同步的Follower。
    也就是说,只有Leader的某个Follower始终跟他放弃数据同步,那末就会存在于ISR列内外。
    然而假如Follower由于本身产生一些问题,致使不克不及及时的从Leader同步数据过来,那末这个Follower就会被以为是“out-of-sync”,从ISR列内外踢出去。
    所以大家先得明确这个ISR是甚么,说白了,就是Kafka自动保护和监控哪些Follower及时的跟上了Leader的数据同步。
    六、数据如何包管不丧失?
    所以假如要让写入Kafka的数据不丧失,你需求要求几点:
    每个Partition都最少得有1个Follower在ISR列内外,跟上了Leader的数据同步每次写入数据的时分,都要求最少写入Partition Leader胜利,同时还有最少一个ISR里的Follower也写入胜利,才算这个写入是胜利了假如不知足上述两个前提,那就始终写入失败,让出产零碎不断的尝试重试,直到知足上述两个前提,而后能力以为写入胜利根据上述思绪去配置相应的参数,能力包管写入Kafka的数据不会丧失好!当初我们来剖析一下下面几点要求。
    第一条,必需要求最少一个Follower在ISR列内外。
    那必需的啊,要是Leader没有Follower了,或者是Follower都没法及时同步Leader数据,那末这个事儿确定就没法弄上来了。
    第二条,每次写入数据的时分,要求leader写入胜利之外,最少一个ISR里的Follower也写胜利。
    大家看上面的图,这个要求就是包管说,每次写数据,必需是leader和follower都写胜利了,能力算是写胜利,包管一条数据必需有两个以上的正本。
    这个时分万一leader宕机,就能切换到阿谁follower下来,那末Follower上是有刚写入的数据的,此时数据就不会丧失了。


    如上图所示,如果当初leader没有follower了,或者是刚写入leader,leader立马就宕机,还没来得及同步给follower。
    在这类状况下,写入就会失败,而后你就让出产者不断的重试,直到kafka恢复正常知足上述前提,能力持续写入。
    这样就能让写入kafka的数据不丧失。
    七、总结
    最初总结一下,其实kafka的数据丧失问题,波及到各个方面。
    譬如出产真个缓存问题,包罗消费真个问题,同时kafka本人外部的底层算法和机制也可能致使数据丧失。
    然而平时写入数据遇到对比大的一个问题,就是leader切换时可能致使数据丧失。所以本文仅仅是针对这个问题说了一下出产环境解决这个问题的计划。


    此外保举儒猿课堂的1元系列课程给您,欢送参加一同学习~
    互联网Java工程师面试突击课(1元专享)
    SpringCloudAlibaba零根底入门到名目实战(1元专享)
    亿级流量下的电商详情页零碎实战名目(1元专享)
    Kafka动静两头件内核源码精讲(1元专享)
    十二个实战案例带你玩转Java并发编程(1元专享)
    Elasticsearch零根底入门到精晓(1元专享)
    基于Java手写散布式两头件零碎实战(1元专享)
    基于ShardingSphere的分库分表实战课(1元专享)

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    注册会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题29

    帖子35

    积分158

    图文推荐