Kafka 如何保证零停机和零数据丢失?

Raj*_*jam 3 apache-kafka

通过关于卡夫卡。但不知道它是如何实现零停机和零损失的。

Gio*_*ous 8

我将通过解释 Kafka 的一般工作原理以及它如何处理故障来回答您的问题。

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

分区 0:

+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
Run Code Online (Sandbox Code Playgroud)

分区 1:

+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
Run Code Online (Sandbox Code Playgroud)

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

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

经纪人1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

经纪人2:

+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

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

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

经纪人1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

经纪人2:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 1     |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

现在假设Broker 2失败了。Broker 1和 3 仍然可以为主题 1 提供数据。 A replication-factorof 3 始终是一个好主意,因为它允许一个 Broker 因维护目的而被关闭,也允许另一个 Broker 意外关闭。

这就是 Kafka 如何提供强大的持久性和容错保证的总体思路。

关于领导者的注意事项: 在任何时候,只有一个代理可以成为分区的领导者,并且只有该领导者可以为该分区接收和提供数据。其余的代理只会同步数据(同步副本)。另请注意,当replication-factor设置为 1 时,当代理失败时无法将领导者移动到其他地方。一般来说,当一个分区的所有副本都失败或离线时,leader将自动设置为-1

  • kafka 如何保证可用性*而*领导人选举正在发生?一旦经纪人宕机,就会有一段间歇期,没有经纪人是领导者,选举可能就位。在此期间生产/消费请求会发生什么? (3认同)