如何恢复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 另一个问题。
我们正在考虑用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 另一个问题。