为什么会失败?节点 n1 和 n2 仍然启动并运行,并假设主题具有replication-factor=3
所有数据应该仍然可以访问。
我会说这取决于。跨所有节点复制主题不会有害,但有时它是多余的(尤其是当集群中有大量代理时)。要获得高可用性,您应该至少设置replication-factor=3
. 例如,这允许一个代理被关闭以进行维护,而另一个代理意外失败。
bootstrap.servers
用于设置 Kafka 集群的连接。一个地址通常足以访问整个集群,但最好提供所有地址,以防其中一台服务器出现故障。请注意,客户端(生产者或消费者)使用所有代理,而不管bootstrap.servers
.
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 |
| |
| |
| |
| |
+-------------------+
请注意,数据是分布式的(并且Broker 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 |
| |
| |
| |
| |
+-------------------+
现在假设Broker 2失败了。代理 1和 3 仍然可以为主题 1 提供数据。因此,a replication-factor
of 3 始终是一个好主意,因为它允许一个代理因维护目的而被关闭,也允许另一个代理意外关闭。因此,Apache-Kafka 提供了强大的持久性和容错保证。
关于领导者的注意事项:
在任何时候,只有一个代理可以成为分区的领导者,并且只有该领导者可以接收和提供该分区的数据。其余的代理只会同步数据(同步副本)。另请注意,当replication-factor
设置为 1 时,当代理失败时,领导者无法移动到其他地方。一般来说,当一个分区的所有副本都失败或下线时,leader
会自动设置为-1
.