首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Kafka在生产者端进行容错

如何使用Kafka在生产者端进行容错
EN

Stack Overflow用户
提问于 2020-05-21 19:08:04
回答 1查看 560关注 0票数 2

我是Kafa和数据摄取的新手。我知道Kafka是容错的,因为它将数据冗余地保存在多个节点上。然而,我不明白的是,我们如何在源/生产者端实现容错。例如,如果我使用netcat作为资源,如下面的示例所示。

代码语言:javascript
复制
nc -l [some_port] | ./bin/kafka-console-producer --broker-list [kafka_server]:9092 --topic [my_topic]

如果执行netcat的节点宕机,生产者将无法推送消息。我在想,是否有一种机制可以让Kafka自己拉取输入,例如,如果在一个节点上netcat出现故障,另一个节点可以接管并开始使用netcat推送消息。

我的第二个问题是如何在Flume中实现这一点,因为它是一个基于pull的架构。Flume在这种情况下是否可以工作,也就是说,如果执行netcat的一个节点失败了?

EN

回答 1

Stack Overflow用户

发布于 2020-05-21 19:16:47

每个主题都是一个特定的数据流(类似于数据库中的表)。主题被分成多个分区(任意多个),其中一个分区中的每个消息都会获得一个增量id,称为偏移,如下所示。

分区0:

代码语言:javascript
复制
+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+

分区1:

代码语言:javascript
复制
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+

现在,一个Kafka集群由多个brokers组成。每个代理都使用一个ID进行标识,并且可以包含特定的主题分区。

2个主题示例(每个主题分别有3个和2个分区):

Broker 1:

代码语言:javascript
复制
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+

Broker 2:

代码语言:javascript
复制
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+

Broker 3:

代码语言:javascript
复制
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(并且Broker 3不持有主题2的任何数据)。

主题,应该有一个大于1的replication-factor (通常是2或3),这样当一个代理宕机时,另一个代理可以为主题的数据提供服务。例如,假设我们有一个包含2个分区的主题,replication-factor设置为2,如下所示:

Broker 1:

代码语言:javascript
复制
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

Broker 2:

代码语言:javascript
复制
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+

Broker 3:

代码语言:javascript
复制
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

现在假设Broker 2出现故障。代理1和3仍然可以为主题1提供数据。因此,replication-factor为3总是一个好主意,因为它允许一个代理出于维护目的而关闭,也允许另一个代理意外关闭。因此,Apache-Kafka提供了强大的持久性和容错性保证。

关于Leaders的说明:在任何时候,只有一个代理可以成为分区的leader,并且只有该leader可以接收和服务该分区的数据。其余的代理将只同步数据(同步副本)。还要注意,当replication-factor设置为1时,当代理发生故障时,leader不能移动到其他地方。通常,当一个分区的所有副本都失败或离线时,leader将自动设置为-1

话虽如此,只要您的生产者列出集群中的所有Kafka代理的地址(bootstrap_servers),您就应该没问题了。即使当一个代理关闭时,您的生产者也会尝试将记录写入另一个代理。

最后,确保设置acks=all (但可能对吞吐量有影响),以便所有同步副本确认它们收到了消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61933114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档