zoukankan      html  css  js  c++  java
  • kafka理论总结

    server向 producer 应答机制有3种

    一、立即回复,最快,但是最不安全
    二、server 让leader 储存 ,立即发送ack
    三、等所有的leader 及follower 全都同步完了,才回ack

    ISR列表 保持同步的副本

    存储的所有的副本的列表

    isr in-sync replica set leader 维护一张leader的表

    如果follower 在多少时间内未发送数据到leader则 踢出去

    High Watermark


    LEO log end offset
    HW high waterMark


    Exactly Once 语义:
    服务器的ack级别:
    ack -1 保证不会丢失数据 at least once 到少一次
    优点: 保证不丢数据
    缺点: 可能导致重复发送
    ack 0 只发送一次数据 at most once 最多一次 (保证生产者的每条消息,只能发送一次)
    优点: 可以保证数据不重复
    缺点: 不能保证数据不丢失

    如何保证消息,既不复发,也能保证发送呢? Exactly Once
    历史: 在0.11版本以前的Kafka,对此是无能为力的,只能保证数据不丢失
    历史解决办法: 费者对数据做全局去重

    0.11版本的Kafka: 引入 "幂等性"
    "幂等性" --> 不论向Server发送多少次重复数据,Server端都只会持久化一条
    At Least Once + 幂等性 = Exactly Once

    用法:
    要启用幂等性,只需要将Producer的参数中enable.idompotence设置为true即可

    原理: (pid,partition,SeqNumber)
    开启幂等性的Producer在 "初始化" 的时候会被分配一个PID,发往同一Partition的消息会附带Sequence Number。而Broker端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时,Broker只会持久化一条。
    问题:
    但是PID重启就会变化,同时不同的Partition也具有不同主键,所以幂等性无法保证跨分区跨会话的Exactly Once。

    以上问题如何解决? 重重重重重要........
    Kafka从0.11版本开始引入了事务支持
    事务可以保证Kafka在Exactly Once语义的基础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。
    为了实现跨分区跨会话的事务,需要引入一个全局唯一的Transaction ID,并将Producer获得的PID和Transaction ID绑定。这样当Producer重启后就可以通过正在进行的Transaction ID获得原来的PID。


    实现:
    为了管理Transaction,Kafka引入了一个新的组件Transaction Coordinator.

    负责两件事情:
    1、写事务的执行状态写入kafka 一个topic里面
    2、向producer提供事务的状态信息,从而来获取pid

  • 相关阅读:
    Django的中间件
    Django的Models(三)
    多个SSH key对应多个Host: Github, Bitbucket
    最简单的私有库方法
    Swift compile slow 编译慢问题
    Hide Xcode8 strange log.
    cocoapods 终极方案
    "Mac OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("Mac OS X"想使用系统钥匙串)
    Xcode7下载地址
    Xcode8安装不成功, 需要升级系统. The operation couldn't be completed. cpio read error
  • 原文地址:https://www.cnblogs.com/leigepython/p/12418528.html
Copyright © 2011-2022 走看看