Redis - 使用集群避免数据丢失(使用 Gossip 协议)

Redis - Avoid Data Loss using Cluster (Using Gossip Protocol)

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

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

Airflow Schedular 在给 Airflow worker 分配任务的过程中,会将任务相关的数据同时发送给 MariaDb(可以看作是 Truth 的来源)和 Redis。

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

MariaDB 从 Airflow Schedular 接收任务时保持不变。当 Redis 移交特定的排队任务时 对于 Worker 容器,MariaDB 将该特定任务状态更改为 'running',如果它完成执行过程,MariaDB 中的任务状态将更改为 'Success'.

实际问题:

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

有什么解决办法。

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

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

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

在你的情况下,我认为一个更简单的解决方案是在你的 redis pod 启动中加入一个恢复过程。您没有永久性数据丢失,因为您拥有 MariaDB 的真实来源,因此您可以添加一个运行脚本以从 MariaDB 恢复 Redis 数据的初始化容器。

另一种会显着限制您的问题的方法是使用持久卷来存储 Redis 数据,因为 Redis 可以定期快照它的内存状态。使用 StatefulSet 而不是 Deployment 来管理您的 Redis 节点 pods 将使存储重新附加到 restart/rescheduling 并且您不会遇到任何数据丢失(或者最多是微小的 window自上次快照以来)