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

时间:2018-08-29 00:59:42

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

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

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

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

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

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

实际问题:

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

有什么解决方案?

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

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

1 个答案:

答案 0 :(得分:1)

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

就您而言,我认为一个更简单的解决方案是将恢复过程合并到您的redis pod启动中。您没有永久的数据丢失,因为您拥有自己的MariaDB真实数据源,因此您可以添加一个运行脚本以从MariaDB恢复Redis数据的初始化容器。

另一种可能会严重限制您的问题的方法是使用持久性卷来存储Redis数据,因为Redis可以定期对其内存状态进行快照。使用StatefulSet而不是Deployment来管理您的Redis节点Pod,将在重新启动/重新安排计划时重新连接存储,并且您不会经历任何数据丢失(或者自上次快照以来最多只有一个很小的窗口)