【问题标题】:Redis - Avoid Data Loss using Cluster (Using Gossip Protocol)Redis - 使用集群避免数据丢失(使用 Gossip 协议)
【发布时间】:2018-08-29 00:59:41
【问题描述】:

我们想在 2 个数据中心的 Kubernetes 上部署 Airflow 应用程序。

Airflow Schedular 容器每 1 分钟、5 分钟和 10 分钟生成一次 DAG。这些 DAG 是将分配给 Airflow Worker 容器的任务。

在将任务分配给 Airflow Worker 的过程中,Airflow Schedular 将有关任务的数据发送到 MariaDb(可以认为是 Truth 的来源)和 Redis。

在 MariaDB 中,任务可以具有以下状态之一:“queued”、“running”、“success”、“failed”。当任务在 Redis 中时,它将处于“queued”状态。

MariaDB 在从 Airflow Schedular 接收任务时保持相同。当 Redis 移交特定的队列任务时 对于 Worker 容器,MariaDB 将该特定任务状态更改为“正在运行”,如果它完成执行过程,MariaDB 中的任务状态将更改为“成功”。

实际问题:

当 Redis 发生故障时,我们在 MariaDB 中有任务排队,但我们会丢失 Redis 中的数据。当 k8s 启动新的 Redis 服务器时,它会丢失以前的任务 - DATA LOSS

有什么办法可以解决这个问题。

我们可以使用Redis Clustering - Gossip protocol 来避免数据丢失吗:

如果是,您能否提供使用此协议解决此问题的任何文档。 else 提供适合我的环境和场景的建议。

【问题讨论】:

  • 如果您能建议任何企业级解决方案在我们的场景中依赖它,那就太好了
  • 有人能给出使用 Hazelcast 代替 Redis 的建议吗?这会解决我的问题还是创建新问题?
  • 你真的确定Redis是必要的吗?
  • @RickJames James - 项目仍处于研究阶段,Redis 较早提出,但与 Airflow 集成时存在一些缺陷。

标签: kubernetes mariadb hazelcast airflow-scheduler redis-cluster


【解决方案1】:

Redis 集群会对此有所帮助,但设置起来有点麻烦,而且它不能完全替代备份。

在您的情况下,我认为一个更简单的解决方案是在您的 redis pod 启动中合并一个恢复过程。由于您拥有 MariaDB 真实数据源,因此不会出现永久性数据丢失,因此您可以添加一个运行脚本以从 MariaDB 恢复 redis 数据的 init 容器。

另一种显着限制您的问题的方法是使用持久卷来存储 redis 数据,因为 redis 可以定期对其内存状态进行快照。使用 StatefulSet 而不是 Deployment 来管理您的 Redis 节点 pod 将在重新启动/重新调度时重新附加存储,并且您不会经历任何数据丢失(或自上次快照以来最多只有很小的窗口)

【讨论】:

  • 我们有备份计划,因为在我的 redis pod 启动/Schedular 中加入了恢复过程,因为它已经与 MariaDB 连接,所以可以将任务分配给 Redis。但它可能是一个复杂的部分!现在,我想了解更多关于 Redis Clustering 做 POC 的信息。您能否建议一些有关设置集群的文档以及如何在集群不停机的情况下手动启动节点(如果可能)。我们还没有考虑过持久卷,但我们对将数据存储在外部卷上不太感兴趣。
  • 您能否提供更多有关在我的 redis pod 启动中合并恢复过程的信息。在 Airflow schedular(您可以将其视为 Producer 组件)或 redis pod 启动中合并恢复过程是否会很好?你能详细指导我吗?
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多