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

问题描述 投票:1回答:1

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

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

在向Airflow工作人员分配任务的过程中,Airflow Schedular将有关任务的数据发送到MariaDb(可以被视为真相来源)和Redis。

在MariaDB任务中,可以使用“queued”,“running”,“success”,“failed”等状态之一。当任务在Redis中时,它将处于'queued'状态。

MariaDB在从Airflow Schedular接收任务时保持不变。当Redis将特定排队任务切换到Worker容器时,MariaDB将该特定任务状态更改为“正在运行”,如果它完成执行过程,则MariaDB中的任务状态将更改为“成功”。

实际问题:

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

什么可以解决这个问题。

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

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

kubernetes mariadb hazelcast airflow-scheduler redis-cluster
1个回答
1
投票

Redis群集可以帮助它,但是设置起来有点痛苦,它不是备份的完全替代品。

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

另一种可以显着限制您的问题的方法是使用持久性卷来存储redis数据,因为redis可以定期快照它的内存状态。使用StatefulSet而不是Deployment来管理Redis节点pod将在重新启动/重新安排时重新连接存储,并且您不会遇到任何数据丢失(或者至少是自上次快照以来的小窗口)

© www.soinside.com 2019 - 2024. All rights reserved.