如果leader没有死但是无法接收Kafka中的消息会发生什么?单点故障?

2024-03-23

我有 3 个经纪人,3 个分区。每个代理都是一个分区的领导者和所有分区的 ISR。 假设我已经在端口上运行了代理19092,29092,39092分别。

19092 - partition 0
29092 - partition 1
39092 - partition 2

半经纪人测试:

我想这样命名!因为它只允许 OUTPUT 而不允许 INPUT

现在,我添加了以下 iptables 规则:

iptables -A INPUT -p tcp --dport 29092 -j DROP

并在生产者中:

bin/kafka-console-producer --broker-list 10.54.8.172:19092 --topic ftest

上述 iptables 规则会阻止 INPUT 访问,但不会限制代理通过 Zookeeper 更新其活动状态。 所以zookeeper不会认为它已经死了,因此不会为分区1进行领导者选举。

但是,由于规则的原因,生产者无法连接到它,因此会抛出错误。

org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for ftest-1: 1778 ms has passed since batch creation plus linger time

我已手动完成此操作,但可能还有其他原因导致 INPUT 访问被阻止(某些恶意软件、DDoS 或其他任何原因)。

在 iptables 规则之前:

Metadata for ftest (from broker 1: 10.54.8.172:19092/1):

 3 brokers:

  broker 2 at 10.54.8.172:29092

  broker 1 at 10.54.8.172:19092

  broker 3 at 10.54.8.172:39092

 1 topics:

  topic "ftest" with 3 partitions:

    partition 2, leader 3, replicas: 3,1,2, isrs: 3,1,2

    partition 1, leader 2, replicas: 2,3,1, isrs: 2,3,1

    partition 0, leader 1, replicas: 1,2,3, isrs: 1,2,3

iptables 规则之后:

Metadata for ftest (from broker 1: 10.54.8.172:19092/1):

 3 brokers:

  broker 2 at 10.54.8.172:29092

  broker 1 at 10.54.8.172:19092

  broker 3 at 10.54.8.172:39092

 1 topics:

  topic "ftest" with 3 partitions:

    partition 2, leader 3, replicas: 3,1,2, isrs: 3,1,2

    partition 1, leader 2, replicas: 2,3,1, isrs: 2

    partition 0, leader 1, replicas: 1,2,3, isrs: 1,2,3

因为,只有一位领导者,而且是dead(从某种意义上说,它无法接收任何消息),不是单点故障?

我认为,理想情况下 Zookeeper 之间必须有 2 种方式的通信 和卡夫卡经纪人。不是吗?卡夫卡允许吗?如果是这样,怎么办?

此外,当 29092 被阻止输入访问时,其 ISR 会缩小 至 1。

可能是因为无法接收任何消息 (心跳)来自其他 2 个经纪人。

如果它可以连接(输出已启用),那么它可以写入它们并且 为了使复制得到确认,它需要 INPUT 访问权限。

所以 INPUT 和 OUTPUT 也应该在这里。

经纪人29092在这里就没什么用了。让系统处于不可恢复的状态!


您的问题可能最好通过了解 Kafka 如何利用 Zookeeper 原语来维护和组织集群状态来回答。

在 Kafka 中,领导选举是由充当控制器的经纪人之一精心策划的。只有一个控制器,它是使用zookeeper从代理中选举出来的。

现在,每个代理将自己注册为 Zookeeper 中的“临时节点”。因此,发起 zK 会话的代理通过使用定期心跳(zK 术语中的刻度)来维护成员资格。如果代理未能在超时间隔内勾选,zookeeper 会删除该节点和已注册以接收该事件通知的 Kafka 控制器(通过zK手表 https://zookeeper.apache.org/doc/r3.4.0/zookeeperProgrammers.html#ch_zkWatches) 收到通知。如果失败的代理是分区的领导者,这将触发新的领导者选举。控制器处理领导者选举并通知所有经纪人。

所以,是的,Kafka 和 zK 之间存在双向通信 - 但就分区领导者选举而言,这并不是每个代理和 zK 之间的直接双向通信。有一个中间人作为控制者。

在您的测试中,由于控制器永远不会收到代理 2 发生故障的通知,因此该代理仍然是分区 1 的领导者。

从现在开始,我推测

输入被阻止的代理 2 无法接收元数据更新,因此它通过将 ISR 缩小到自身来保护自己。这有可能help https://cwiki.apache.org/confluence/display/KAFKA/KIP-343%3A+Add+a+Controller+Heartbeat+Mechanism#KIP-343以及。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果leader没有死但是无法接收Kafka中的消息会发生什么?单点故障? 的相关文章

  • 编辑 Kafka Listener Spring 应用程序以更改阶段/目标

    我可以利用另一个运行 Kafka 应用程序 代码库的团队来使用相同的数据 将其加载到我们的新暂存表中 而不是他们的 他们在 Messages 文件夹中有许多不同的 kafka 侦听器适配器 java 文件 每个文件消耗不同类型的数据 每个
  • YARN UNHEALTHY 节点

    在我们的 YARN 集群已满 80 的情况下 我们看到一些纱线节点管理器被标记为不健康 在深入研究日志后 我发现这是因为数据目录的磁盘空间已满 90 出现以下错误 2015 02 21 08 33 51 590 INFO org apach
  • 无法找到任何实现 Connector 且名称与 io.debezium.connector.mysql.MySqlConnector 匹配的类,可用的连接器有

    使用 Kafka MySQL 和 Debezium 设置数据流管道 我是这个版本的 Kafka 3 4 0 MySQL 8 Debezium 2 2 1 Java 11 目标 我想从 MySQL 捕获所有 CDC 并将数据流式传输到 Kaf
  • 使用 kafka java api 的 Avro 序列化器和反序列化器

    Kafka Avro 序列化器和反序列化器无法工作 我尝试使用 kafka 控制台消费者消费消息 我可以看到发布的消息 public class AvroProducer
  • Spark shell (spark 3.0.0) 添加包 confluence kafka 5.5.1 javax.ws.rs-api 问题

    我本地的win10 WSL回到ubuntu 在ubuntu上 我安装了spark3 0 0 confluence平台5 5 1 手动下载 当我尝试运行spark shell或spark submit时 下面是shell示例 spark sh
  • 为每个键使用主题中的最新值

    我有一个 Kafka 生产者 它正在以高速率生成消息 消息键是用户名 值是他在游戏中的当前分数 Kafka消费者处理消费消息的速度相对较慢 在这里 我的要求是显示最新的分数并避免显示陈旧的数据 但代价是某些分数可能永远不会显示 本质上 对于
  • kafka消费者群体正在重新平衡

    我正在使用 Kafka 9 和新的 java 消费者 我正在循环内进行轮询 当代码尝试执行 Consumer commitSycn 时 由于组重新平衡 我收到 commitfailedexcption 请注意 我将 session time
  • 有没有办法使用 .NET 中的 Kafka Ksql Push 查询

    我目前正在 NET 中使用 Kafka 消费者处理大量 Kafka 消息 我的处理过程的第一步是解析 JSON 并根据 JSON 中特定字段的值丢弃许多消息 我不想首先处理 特别是不下载 那些不需要的消息 看起来 kSql 查询 写为推送查
  • Spring Kafka - 为任何主题的分区消耗最后 N 条消息

    我正在尝试读取请求的卡夫卡消息数 对于非事务性消息 我们将从 endoffset N 对于 M 个分区 开始轮询并收集当前偏移量小于每个分区的结束偏移量的消息 对于幂等 事务消息 我们必须考虑事务标记 重复消息 这意味着偏移量将不连续 在这
  • 创建 Kafka 主题导致没有领导者

    我正在使用 Kafka v0 9 0 1 Scala v2 11 和com 101tec zkclientv0 7 我正在尝试使用AdminUtils创建一个kafka主题 我的代码如下 String zkServers node1 218
  • Zookeeper + Kafka - 无法创建数据目录

    我在单节点中使用zookeeper 3 4 8并尝试使用kafka 当我运行这个命令时 zookeeper server start sh usr local kafka 2 9 2 0 8 2 2 config zookeeper pro
  • Kafka中如何同时实现分布式处理和高可用?

    我有一个由 n 个分区组成的主题 为了进行分布式处理 我创建了两个在不同机器上运行的进程 他们使用相同的 groupd id 订阅主题并分配 n 2 个线程 每个线程处理单个流 每个进程 n 2 个分区 这样我就可以实现负载分配 但现在如果
  • Mesos DCOS 未安装 Kafka

    我正在尝试在 Mesos 上安装 Kafka 看来安装已经成功了 vagrant DevNode dcos dcos package install kafka This will install Apache Kafka DCOS Ser
  • Kafka JDBC Sink Connector,批量插入值

    我每秒收到很多消息 通过 http 协议 50000 100000 并希望将它们保存到 PostgreSql 我决定使用 Kafka JDBC Sink 来实现此目的 消息以一条记录保存到数据库 而不是批量保存 我想在 PostgreSQL
  • 内存缓存 VS。分布式系统中的集中式缓存

    我们目前正在寻找最合适的解决方案来访问分布式系统上的关键数据 并且我们正在考虑是否使用内存缓存而不是集中式缓存 有关我们希望存储 访问的数据的一些信息 数据量非常小 数据很冷 这意味着它几乎不会改变 并且只有当人们改变我们后台系统中的某些内
  • 将 Kafka 输入流动态连接到多个输出流

    Kafka Streams 中是否内置了允许将单个输入流动态连接到多个输出流的功能 KStream branch允许基于真 假谓词进行分支 但这并不是我想要的 我希望每个传入的日志都确定它将在运行时流式传输到的主题 例如日志 date 20
  • 如何使用PySpark结构流+Kafka

    我尝试将 Spark 结构流与 kafka 一起使用 并且在使用 Spark 提交时遇到问题 消费者仍然从生产中接收数据 但 Spark 结构出错 请帮我找到我的代码的问题 这是我在 test py 中的代码 from kafka impo
  • 获取:导入 Spark 模块时出错:没有名为“pyspark.streaming.kafka”的模块

    我需要将从 pyspark 脚本创建的日志推送到 kafka 我正在做 POC 所以在 Windows 机器上使用 Kafka 二进制文件 我的版本是 kafka 2 4 0 spark 3 0 和 python 3 8 1 我正在使用 p
  • 卡夫卡监听器中的钩子

    kafka 监听消息之前 之后是否有任何类型的钩子可用 使用案例 必须设置MDC关联id才能进行日志溯源 我在寻找什么 之前 之后回调方法 以便可以在进入时设置 MDC 关联 ID 并最终在退出时清除 MDC 编辑后的场景 我将关联 id
  • 如何在kafka中定义多个序列化器?

    比如说 我发布和使用不同类型的 java 对象 对于每个对象 我必须定义自己的序列化器实现 我们如何在 serializer class 属性下提供kafka消费者 生产者属性文件中的所有实现 我们有一个类似的设置 不同主题中的不同对象 但

随机推荐