6.Kafka Acks详解

概述

   本文对 kafka 的一些核心概念进行解释,也是 kafka 需要调优的一些地方。

官方原文速递

Replication(分区副本)

  对于每个分区,存在一个 leadernfollower 。控制分区中 leader与 follower(1+N)数量的配置是 replication.factor。表示数据在 kafka 集群中数据副本数。默认及推荐的建议是3。

  kafka 中的分区副本两种类型:leaderfollowerfollower 是不对外提供服务的,所有的请求都必须由 leader来处理。

在这里插入图片描述

In-sync replicas

   broker 上分区的最新同步副本(ISR), 一个 leader 的副本一直是最新的 。只有当一个 follower 完全与 leader 一致时,它才是同步副本。换句话说,它不能落后于给定分区的最新记录。
如果一个 follower 落后于分区的最新数据,将不再将其视为同步副本。请参见图2,其中显示Broker3落后(不同步)。

总结:

  • 所说的同步不是指完全的同步,即并不是 follower 副本同步滞后于 leader 副本,就会被踢出 ISR 列表
  • kafka的 broker 端有一参数 replica.lag.time.max.ms ,表示 follower 副本与 leader 滞后的最长时间间隔,默认是 10s
  • 如果 follower 副本被踢出 ISR 列表,等追上了 leader 副本的进度 ,会再次加入 ISR 列表,所以 ISR 是一个动态列表。
    在这里插入图片描述
    注意:一般某个 follower 落后,可能是满负载,或者空间不足。

Acknowledgements

  acks 设置是在客户端(生产者)配置。表示 brokers 接受到写入成功的信息 。它支持三个值:01all

acks=0

  如果值为 0,生产者不会等待 broker 的响应。在 消息 发出的那一刻 ,就认为是写入成功。(见图3:生产者甚至不等待响应。消息已被确认!)

在这里插入图片描述

acks=1

  设置为1,当 leader 收到记录时那一刻,则认为写入成功,不再等待。(见图4:生产者等待响应。一旦收到响应,消息就会得到确认。broker 在收到记录后立即响应。followers 异步复制新记录。)

在这里插入图片描述

acks=all

  当设置为all时,当所有同步副本都收到记录时,此时生产者将认为写入成功。这是通过 leader broker 在响应请求时来实现的——一旦所有同步副本都收到记录,它就会发回响应。(见图5:没那么快!Broker 3还没有收到记录。)

在这里插入图片描述
leader broker 知道所有 followers 都同步完
在这里插入图片描述

Ack实用建议

  正如上面总结的那样,需要在性能与数据可靠性之间做平衡,如果想要保证数据准确与安全,配置 all ;如果想要保证性能,丢失一些数据,无影响 ,使用 0,来获得极致的性能、低延迟,高吞吐。

Minimum in-sync replica

  当 acks=all 时,需要所有的副本都同步了才会发送成功响应到生产者,这里面存在一个问题:如果 leader 副本是唯一的同步副本时,相当于 acts=1 ,所以是不安全的。
  kafka的 broker 端提供了 min.insync.replicas ,该参数控制的是消息至少被写入到多少个副本才算是 真正的写入,默认值 1 ,生产环境设定一个大于 1 的值可以提升消息的持久性。因为如果同步副本的数量低于该配置值 ,则生产者会收到错误响应,从而确保消息不丢失。
  请看下图,Broker2 同步成功,Broker3 没有同步成功,且不在 ISR 列表中,此时min.insync.replicas=2 表示消息发送成功 。
在这里插入图片描述

  下图对 acks=allacks=1 时,同是 min.insync.replicas=2 条件下发送消息,ACK 是不一样的。
在这里插入图片描述

Caveat(警告)

  这种情况容易引起误解。如果 acks=allmin.insync.replicas=2 ,此时 ISR 列表为 [1,2,3],那么还是会等到所有的同步副本都同步了消息,才会向生产者发送响应的 ack。因为 min.insync.replicas=2 只是一个最低限制,即同步副本少于该值配置值 ,则会抛出异常,而 acks=all 是需要保证所有的 ISR 列表的副本都同步了才可以发送成功响应。

在这里插入图片描述

相关推荐

  1. ECMAScript6详解

    2024-07-20 14:06:02       56 阅读
  2. ES<span style='color:red;'>6</span><span style='color:red;'>详解</span>

    ES6详解

    2024-07-20 14:06:02      42 阅读
  3. ES6 Reflect详解

    2024-07-20 14:06:02       52 阅读
  4. ES6 Proxy详解

    2024-07-20 14:06:02       51 阅读
  5. ES6—Symbol详解

    2024-07-20 14:06:02       33 阅读
  6. Scala详解6

    2024-07-20 14:06:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 14:06:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 14:06:02       102 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 14:06:02       83 阅读
  4. Python语言-面向对象

    2024-07-20 14:06:02       92 阅读

热门阅读

  1. LeetCode 221. 最大正方形

    2024-07-20 14:06:02       26 阅读
  2. Vue中Key的作用

    2024-07-20 14:06:02       20 阅读
  3. VMware 虚拟机 ping 不通原因排查

    2024-07-20 14:06:02       25 阅读
  4. 数据响应式(Object.defineProperty和Proxy)

    2024-07-20 14:06:02       22 阅读
  5. 云计算的三种服务模式

    2024-07-20 14:06:02       27 阅读
  6. wps的xls文件,如何过滤掉空白没有数据的行

    2024-07-20 14:06:02       25 阅读
  7. Provider(5) - AdjustChannelsBufferProvider

    2024-07-20 14:06:02       20 阅读
  8. lua 游戏架构 之 SceneLoad场景加载(一)

    2024-07-20 14:06:02       25 阅读
  9. Thread类的基本用法

    2024-07-20 14:06:02       25 阅读
  10. C?C++?

    2024-07-20 14:06:02       24 阅读