kubernetes - Redis - 使用集群避免数据丢失(使用 Gossip 协议)
问题描述
我们想在 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
用来避免数据丢失:
如果是,您能否提供使用此协议解决此问题的任何文档。否则提供适合我的环境和场景的建议。
解决方案
Redis 集群会对此有所帮助,但设置起来有点麻烦,而且它不能完全替代备份。
在您的情况下,我认为一个更简单的解决方案是在您的 redis pod 启动中合并一个恢复过程。由于您拥有 MariaDB 真实数据源,因此不会出现永久性数据丢失,因此您可以添加一个运行脚本以从 MariaDB 恢复 redis 数据的 init 容器。
另一种可以显着限制您的问题的方法是使用持久卷来存储 redis 数据,因为 redis 可以定期对它的内存状态进行快照。使用 StatefulSet 而不是 Deployment 来管理您的 Redis 节点 pod 将在重新启动/重新调度时重新附加存储,并且您不会体验到任何数据丢失(或者最多是自上次快照以来的小窗口)
推荐阅读
- android - 在 RecyclerView 中搜索时出错?
- rxjs - Using RXJS to drive an 'activity' light
- proxy - 创建 Service Fabric 群集后启用反向代理
- csv - 如何在 nom 中匹配 CSV 样式的引号字符串?
- puppeteer - 如何在 puppeteer 中处理多个重定向?
- azure - 带有存储帐户的 CDN
- c# - 按住按钮时在文本框中显示密码
- c# - 什么可能导致 ICSharpCode.SharpZipLib 在 Delete -> CommitUpdate 上失败并出现错误“无法复制字节...”?
- moqui - 使用相同数据库实例的 Moqui 负载均衡实例
- openlayers - 如何在此交互中找到圆形交互与地图上可见的所有图层的所有特征之间的交集?