如何恢复Kafka消息?

cfh9epnr  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(602)

我们正在考虑使用kafka进行分布式开发,但也希望将其用作数据库。具体案例:我们在kafka中编写“transact”主题,并希望依赖它来存储所有事务。问题是:在这个设计中是否需要一个恢复计划,Kafka是否会因为崩溃、磁盘故障而丢失数据?或者Kafka有自己的恢复机制,所以用户不需要恢复计划?

rvpgvaaj

rvpgvaaj1#

请阅读Kafka文件的复制部分,特别是“可用性和耐久性保证”小节。阅读完文档后,如果您遇到问题,请随时发布另一个问题。

mgdq6dx1

mgdq6dx12#

对您的问题的简短回答:
kafka提供了持久性和容错性,但是,您需要负责相应参数的配置以及可以处理故障转移的体系结构的设计,以确保您永远不会丢失任何数据。
回答你的问题:
我将通过解释Kafka是如何工作的以及它如何处理失败来回答你的问题。
每个主题都是一个特定的数据流(类似于数据库中的表)。主题被划分为多个分区(可以任意多个分区),分区中的每条消息都获得一个增量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     |
+-------------------+

经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(broker 3不包含主题2的任何数据)。
主题,应该有一个 replication-factor >1(通常是2或3),这样当一个代理关闭时,另一个代理可以提供一个主题的数据。例如,假设一个主题有两个分区,每个分区有一个 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总是一个好主意,因为它允许一个经纪人为了维护的目的被拆掉,也允许另一个经纪人意外地被拆掉。因此,apachekafka提供了强大的持久性和容错保证。
关于引线的注意:在任何时候,只有一个代理可以是分区的引线,并且只有该引线可以接收和服务该分区的数据。其余的代理将只同步数据(同步副本)。还要注意的是 replication-factor 如果设置为1,则在代理失败时不能将引线移到其他位置。通常,当一个分区的所有副本都失败或脱机时 leader 将自动设置为 -1 .
关于保留期的注意事项如果您计划将kafka用作存储,您还需要了解每个主题的可配置保留期。如果不注意此设置,可能会丢失数据。根据文件:
kafka集群持久地保存所有已发布的记录,不管它们是否使用了可配置的保留期。例如,如果将保留策略设置为“两天”,则在记录发布后的两天内,它可供使用,之后将被丢弃以释放空间。

相关问题