Kafka-backup: 支持时间点备份

创建于 2020-04-08  ·  13评论  ·  资料来源: itadventurer/kafka-backup

这是一个一次性工具(意味着它在备份完成后不需要在后台运行),因此对后台守护进程的依赖很有趣。 根本不需要将 kafka-connect 作为守护进程运行。

enhancement help wanted

所有13条评论

您对还原过程是正确的。 恢复是一次性的活动。
备份是一个持续运行的活动。 Kafka 中没有“我完成了备份”,因为 Kafka 数据是一个流,它没有尽头。 当然,您可以假设如果您在 x 秒内没有获得任何新数据,那么您就“完成”了,但您不能一概而论。
查看 #46 和 #54 了解更多

56:然后:

@itadventurer

备份是一个持续运行的活动。

这假设连续的数据流是 24x7x365,这并不适用于所有情况。 在我们的例子中,流每天只运行 X 小时,备份仅在此之后发生,实际上是作为数据的每日备份/快照。

我认为应该有一种方法来(内部)检测 X 时间(可能是可配置的时间间隔)内没有任何新消息,在此之后备份进程将正常退出并因此终止该进程。

另一种(可能更简单)的替代方法是仅备份直到备份开始时的时间戳的消息。 不确定这将如何与备份偏移量一起发挥作用。 也许首先备份偏移量,然后我们知道备份偏移量的时间戳,我们可以备份消息直到该时间戳。

我明白你的意思。 是的,有办法进行时间点备份可能会很好:思考:
尽管如此,这并非微不足道,因为没有简单的方法来确定流是否“完成”。

在你的情况下你可以做什么:

  • 让Kafka Backup在后台运行
  • Kafka Backup在后台不断地将数据写入文件系统
  • kill -9 Kafka 备份一旦“完成”,即完成写入您的数据。 这应该在您完成数据生成后立即进行
  • 将 Kafka Backup 的数据移动到您的新目的地。

我知道这是一个非常常见的用例,我将在 #2 中提供更多文档。 对于 v0.1 文档是最后一个大问题,所以希望这应该很快发生;)


我看到以下方法

  • #54 引入了一个新的独立 CLI 工具。 CLI 工具应该支持这一点。
  • 我们向 CLI 工具添加一个新标志--snapshot (或添加一个名为backup-snapshot.sh的新工具)

如何检测备份何时“完成”(仅适用于设置了--snapshot标志的情况):

  • 我们记得备份开始的时间。 备份期间将忽略具有较新时间戳的所有记录
  • 当分区在一段时间内(例如 20 秒)没有产生任何新数据时,我们假设没有新数据

你怎么认为?

让Kafka Backup在后台运行

问题正是在这一步。 我们不能让它在后台运行。 当我们可以做快照时,我们只有一个特定的窗口。 何时可以进行备份不是由我们决定的,这是外部监管要求。

我们记得备份开始的时间。 备份期间将忽略具有较新时间戳的所有记录

是的,这正是我的意思,我认为这将消除让它在后台运行的要求(并试图抓住所有生产者完成的时刻)。

当分区在一段时间内(例如 20 秒)没有产生任何新数据时,我们假设没有新数据

我认为这个选项与另一个是互斥的。 而且我认为第一个更好,因为它提供了特定的参考点,并且在没有消息时不依赖于查找窗口。

实际上,我想写这对于 Kafka 来说几乎是不可能的,但是在写作时我想到了一个解决方案:

kafka-consumer-groups返回消费者在分区中的当前位置,但更有趣的是它返回每个特定分区的当前结束偏移量。 这意味着有一种方法可以在某个时间点获取分区的最新偏移量。 我目前不知道这是如何实现的(需要检查代码)。

所以现在有一条清晰的路径如何进行(或多或少)时间点备份:

  1. 获取要备份的每个分区的分区结束偏移量(此处某处:https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink /BackupSinkTask.java#L81 )
  2. 消耗每个分区
  3. 一旦消耗的记录具有偏移量>= ,该分区的保存记录就记住这一点。 忽略备份中的所有记录。 (见 https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink/BackupSinkTask.java#L63)
  4. 一旦所有分区都是最新的,就会向 STDOUT 打印一条消息
  5. 使用包装器脚本检测此消息并优雅地终止 kafka 连接。 类似于在恢复过程中如何解决: https :

你看这真的不是那么简单。

我目前的重点是改进测试套件并稳定第一个版本的 Kafka 备份(参见 https://github.com/itadventurer/kafka-backup/milestone/1)。 我无法为您提供该功能的预计到达时间。 我很乐意为此审查 PR(我也在寻找其他维护者;))如果有任何问题,我很乐意提供帮助

你看这真的不是那么简单。

我更关注操作方面的事情(比如设置、监控 Kafka 集群等)。 所以在这方面我相信你。 我的观点是,从我的工作角度来看,这是我(以及很确定其他许多人)确实需要的。

我很乐意为此审查 PR(我也在寻找其他维护者;))

我对 Java/Scala 不太擅长,所以在这里没有太大帮助。 如果是 Python、C/C++ 或至少是 Go,我可以提供帮助:P

你好!
起初 - 我很高兴找到您的解决方案,因为我必须备份 kafka 主题数据
第二个 - 不幸的是我不能用 Java/Scala 写任何东西,所以我为你准备了“包装器”,用 python 为你提供完整的备份解决方案“backup-standalone.sh”
https://gist.github.com/FloMko/7adf2e00cd80fe7cc88bb587cde999ce
很高兴看到有关时间点备份的任何内置支持的任何更新

嘿,
感谢您的工作! 作为临时解决方法,我可以想象将此作为附加脚本添加到此 repo 中,并稍后用内置解决方案替换它。 随意将其添加为拉取请求:)(添加到./bin/kafka-backup-point-in-time.py或其他内容;))

我即将发布用 Go 编写的完全独立的实现,它不依赖于连接 API。 仅供参考。 我们已经在我们的生产环境中使用它。

@akamensky你能分享你的解决方案吗? 只要你测试过你的解决方案就可以了

@FloMko我们刚刚发布了它。 您可以在此处找到它(以及重建的二进制文件)

谢谢@WesselVS的 PR #99! 我刚刚将它合并到master。 将很快发布具有此增强功能和其他一些修复的版本。

@akamensky酷! 很高兴看到更多关于 Kafka 备份的工作;)

此页面是否有帮助?
0 / 5 - 0 等级