如何使用Kafka在生产者端实现容错功能

我是Kafa和数据提取的新手。我知道Kafka是容错的,因为它可以将数据冗余地保留在多个节点上。但是,我不了解的是我们如何在源/生产者端实现容错能力。例如,如果我有netcat作为源,如下面的示例所示。

nc -l [some_port] | ./bin/kafka-console-producer --broker-list [kafka_server]:9092 --topic [my_topic]

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

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

aazhenzhen 回答:如何使用Kafka在生产者端实现容错功能

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

分区0:

+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+

分区1:

+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+

现在,Kafka集群由多个经纪人组成。每个代理都有一个ID标识,并且可以包含某些主题分区。

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

经纪人1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+

经纪人2:

+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+

经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(并且经纪人3 不保存任何主题2 的数据)。

主题,应该具有replication-factor> 1(通常为2或3),以便在代理崩溃时,另一个可以提供主题数据。例如,假设我们有一个包含2个分区的主题,其中replication-factor设置为2,如下所示:

经纪人1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

经纪人2:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+

经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

现在假定经纪人2 失败了。 经纪人1 和3仍然可以提供主题1的数据。因此,replication-factor为3始终是一个好主意,因为它允许出于维护目的以及出于维护目的而删除一个经纪人。另一个被意外删除。 因此,Apache-Kafka提供了强大的耐用性和容错保证。

有关领导者的说明: 在任何时候,只有一个代理可以成为分区的领导者,并且只有该领导者可以接收和提供该分区的数据。其余的代理将仅同步数据(同步副本)。另请注意,当replication-factor设置为1时,如果代理失败,则 leader 不能移到其他位置。通常,当分区的所有副本失败或脱机时,leader将自动设置为-1


话虽如此,只要您的生产者列出了集群(bootstrap_servers)中Kafka经纪人的所有地址,就可以了。即使经纪人倒闭,您的生产者也将尝试将记录写到另一个经纪人。

最后,请确保设置acks=all(尽管可能会影响吞吐量),以便所有同步副本都确认它们已收到消息。

本文链接:https://www.f2er.com/2303846.html

大家都在问