我是Kafa和数据摄取的新手。我知道Kafka是容错的,因为它把数据冗余地保存在多个节点上。然而,我不明白的是,我们如何才能在sourceproducer端实现容错。例如,如果我把netcat作为souce,如下例所示。
nc -l [some_port] | ./bin/kafka-console-producer --broker-list [kafka_server]:9092 --topic [my_topic]
如果做netcat的节点宕机,生产者推送消息就会失败。我在想,是否有一种机制可以让Kafka自己拉动输入,比如说,如果在一个节点上netcat失败了,另一个节点就可以接手,开始使用netcat推送消息。
我的第二个问题是在Flume中如何实现,因为它是一个基于拉的架构。在这种情况下,也就是说,如果一个节点做netcat失败了,Flume还能用吗?
每个 课题,是一个特定的数据流(类似于数据库中的表)。主题,分为 隔断 (你喜欢多少就有多少),其中一个分区内的每条消息都有一个递增的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 |
+-------------------+
Broker 3:
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
请注意,数据是分布式的(并且 经纪人3 不持有任何数据的 专题2).
主题,应该有一个 replication-factor
> 1(通常是2或3),这样当一个broker宕机时,另一个broker可以为一个主题的数据服务。例如,假设我们有一个主题,有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提供了强大的耐久性和容错保证。
关于Leaders的说明。在任何时候,只有一个代理可以成为一个分区的领导,并且只有这个领导可以接收和服务该分区的数据。其余的broker只会同步数据(in-synchronic replicas)。另外,请注意,当 replication-factor
设为1,则 魁首 当一个代理失败时,不能移动到其他地方。一般来说,当一个分区的所有副本都失败或离线时,该分区的 leader
将自动设置为 -1
.
说到这里,就你的生产者列出了集群中所有Kafka经纪人的地址(bootstrap_servers
),你应该没事。即使一个经纪人倒下了,你的制作人也会尝试把唱片写给另一个经纪人。
最后,请确保设置 acks=all
(虽然可能会对吞吐量有影响),这样所有同步的副本都会确认他们收到了消息。