如何恢复kafka消息?

How to recover kafka messages?

我们正在考虑用kafka做分布式开发,也想用它做数据库。具体案例:我们在kafka中写到"transact"topic,想依赖它来存储所有的交易。 问题是:这个设计中是否需要一个恢复计划,Kafka会不会因为崩溃,磁盘故障而丢失数据? 或者 Kafka 有自己的恢复机制,所以用户不需要自己的恢复计划?

您问题的简短回答:

Kafka 提供持久性,fault-tolerance 但是,您需要负责配置相应的参数和设计可以处理故障转移的架构,以确保您永远不会丢失任何数据.

对您问题的详细回答:

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

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

分区 0:

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

分区 1:

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

现在一个Kafka集群由多个broker组成。每个代理都用一个 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    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(并且 Broker 3 不包含 topic 2 的任何数据)。

主题,应该有一个 replication-factor > 1(通常是 2 或 3),这样当一个 broker 宕机时,另一个可以提供主题的数据。例如,假设我们有一个包含 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 提供数据。因此 replication-factor 3 始终是一个好主意,因为它允许为了维护目的而关闭一个代理还有另一个意外被取消。 因此,Apache-Kafka提供了强大的持久性和容错性保证。

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

关于保留期的注意事项 如果您计划使用 Kafka 作为存储,您还需要了解每个主题的可配置保留期。如果您不注意此设置,您可能会丢失数据。根据 docs:

The Kafka cluster durably persists all published records—whether or not they have been consumed—using a configurable retention period. For example, if the retention policy is set to two days, then for the two days after a record is published, it is available for consumption, after which it will be discarded to free up space.

请阅读 Kafka 文档的 replication 部分,尤其是名为 "Availability and Durability Guarantees" 的小节。阅读文档后,如果您遇到问题,请随时 post 另一个问题。