普通视图

Received before yesterday

Redis高可用方案

作者东篱
2025年3月11日 11:49

在使用Redis存储数据时,如果只部署一个Redis服务,可能会出现单点故障,一旦Redis服务寄掉了,整套服务都完蛋,因此我们需要一些Redis的高可用方案

Redis 高可用性方案的核心是通过 数据冗余自动故障切换 来确保在某个 Redis 节点宕机时,服务不会中断。以下是几种常见的高可用方案的 原理 解析:

Redis Sentinel

Redis Sentinel 是 Redis 官方提供的一种高可用性解决方案,用于监控、自动故障转移(failover)和提供通知服务。Sentinel 主要通过监控 Redis 实例的健康状况,自动切换主从节点,保证系统高可用。

一般情况用这个就行,这个也是Redis官方推荐的

原理:

  • 监控功能:Sentinel 会周期性地检查所有 Redis 实例的状态,包括主节点和从节点的健康状态。通过心跳检查,Sentinel 能判断节点是否宕机。
  • 自动故障转移:当 Sentinel 发现主节点宕机时,会从现有的从节点中选举一个新的主节点,并将原来的从节点设置为新的从节点。
  • 通知功能:Sentinel 会通过发布通知的方式告知其他 Redis 客户端主节点的变化。

与持久化(AOF 和 RDB)的关系:

  • AOF 和 RDB:Sentinel 本身不涉及数据持久化,它依赖于 Redis 的持久化机制(如 AOF 和 RDB)。在主节点发生故障切换时,新的主节点会从之前的从节点恢复数据。如果启用了 AOF 或 RDB,数据能够从持久化文件中恢复。
  • AOF(追加文件日志):Redis 以日志的方式将每次写操作追加到磁盘,可以保证数据几乎不丢失,即使在主节点崩溃后,也可以通过 AOF 恢复数据。
  • RDB(Redis 数据库快照):Redis 定期将内存中的数据快照保存到磁盘,如果配置了 RDB 持久化,在主节点崩溃时,会丢失最近的几秒/分钟数据,具体取决于上次保存的快照时间。相对于 AOF,RDB 可能丢失一些未同步到磁盘的操作。

通俗来讲,RDB就是备份一个存档,恢复数据只能恢复到上次备份的存档,而AOF相当于把之前的每一步操作都往磁盘里记录了一遍,恢复数据就是重新执行一遍所有未执行的操作就可以了

优缺点

  • 优点:简单、适用于小型 Redis 集群。
  • 缺点:仅支持单主从架构,扩展性差。

Redis Cluster

Redis Cluster 是 Redis 提供的一个分布式解决方案,能够将数据分片(sharding)存储在多个 Redis 实例上。Cluster 支持自动故障转移,能保证集群内节点的高可用性和分布式存储。

原理:

  • 数据分片:Redis Cluster 会将数据分布在多个节点上,每个节点负责一个数据范围(slot)。数据通过一致性哈希分配到不同的节点,保证负载均衡和高效存储。
  • 自动故障转移:每个数据分片(slot)有一个主节点和多个从节点。当某个主节点发生故障时,Redis Cluster 会自动选择一个从节点升级为新的主节点,并通过 Cluster Manager 实现故障转移。
  • 客户端透明切换:客户端直接连接到 Redis Cluster 中的任一节点,Cluster 会根据数据的 slot 值将请求路由到正确的节点。

与持久化(AOF 和 RDB)的关系:

  • AOF 和 RDB:Redis Cluster 结合持久化(AOF 或 RDB)来保证数据的持久化存储。每个节点都有自己的 AOF 或 RDB 配置,节点发生故障时,从节点会同步 AOF 或 RDB 中的数据来恢复。
  • AOF:适用于需要保证数据不丢失的场景,AOF 记录所有写操作,提供高精度的数据恢复。
  • RDB:适用于性能要求较高的场景,定期进行快照操作,恢复时可能会丢失最新的数据。

优缺点

  • 优点:高可用、高扩展性,适用于大规模应用。
  • 缺点:配置复杂,管理和维护要求较高。

实际上Cluster相比于Sentinel的特点是不是就是数据分片,拿后端举例子,就是分布式单体架构和微服务架构的区别,Sentinel就相当于分布式单体架构,只是通过整体的复制和故障转移保证可靠性,而Cluster就相当于微服务架构,将完整的数据拆分成很多数据分片,分别放在不同节点上维护,可靠性更高且便于横向拓展

Redis with Proxy(Twemproxy 或 Codis)

通过 代理层(如 TwemproxyCodis)来管理 Redis 集群,代理充当客户端和 Redis 实例之间的中介,提供负载均衡和故障转移。

原理:

  • 代理层:代理服务位于客户端和 Redis 实例之间,将客户端请求路由到对应的 Redis 实例。通过代理层实现负载均衡、故障转移和连接池管理。
  • 故障转移和负载均衡:代理层会监控 Redis 实例的健康状态,出现故障时会将请求转发到健康的 Redis 实例。
  • 集群管理:类似于 Redis Cluster 的数据分片,代理层将数据分发到多个 Redis 节点,并负责处理分片操作。

与持久化(AOF 和 RDB)的关系:

  • AOF 和 RDB:每个 Redis 节点依然需要配置 AOF 或 RDB 持久化,代理层只负责请求的路由和负载均衡,数据持久化和故障恢复依赖于 Redis 本身的机制。
  • AOF:适用于对数据一致性要求较高的应用,确保 Redis 服务在宕机后能恢复数据。
  • RDB:适用于性能要求较高的应用,虽然会有数据丢失,但恢复速度较快。

优缺点

  • 优点:通过代理层简化了 Redis 集群的访问,支持负载均衡,适用于中小型应用。
  • 缺点:代理层可能成为性能瓶颈,需要额外维护。

其实Twemproxy类似于nginx,只不过对Redis做了适配,实际上是为Redis提供了一种负载均衡策略,使其支持更高的并发。但是在实际生产中,使用Cluster可能更好,因为Cluster也提供了负载均衡,同时还具备自动故障转移和集群管理能力

总结:

方案 适用场景 可靠性 复杂度
Redis Sentinel 小到中规模应用,单主从结构 ⭐⭐⭐⭐
Redis Cluster 大规模、需要扩展的应用 ⭐⭐⭐⭐⭐
代理(Twemproxy, Codis) 需要负载均衡的应用 ⭐⭐⭐

如果只考虑 Redis 本身的高可用性,最推荐的方案是使用 Redis SentinelRedis Cluster

The post Redis高可用方案 first appeared on 东篱blog.

Celery任务队列的Redis高可用方案

作者东篱
2025年3月11日 11:49

在使用Clelty时,如果Redis 作为 Broker ,容易引发单点故障(SPOF,Single Point of Failure),如果 Redis 挂了,Celery 就无法提交和获取任务了,本文主要介绍一下解决方案。(直接使用RabbitMQ就行)

本文可以参考文章Redis高可用方案

🌟 解决 Redis 单点故障的方法

如果担心 Redis 挂掉影响 Celery,可以使用以下方案:

方案 1:Redis Sentinel(官方推荐)

Redis Sentinel 是 Redis 官方提供的高可用方案,它可以自动切换主节点,保证 Celery 任务队列的稳定性。

✅ 优点:

  • 自动故障转移,如果 Redis 主节点崩溃,Sentinel 会自动选出新的主节点。
  • 应用程序无感知切换,Celery 连接 Sentinel,Sentinel 负责返回当前的主节点地址。

✅ 配置 Celery 使用 Sentinel

1、启动 Redis Sentinel

  • 配置sentinel.conf,假设 Redis 运行在127.0.0.1:6379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
  • 启动 Sentinel:
redis-sentinel /etc/redis/sentinel.conf

2、修改 Celery 配置,使用 Sentinel

from celery import Celery
from kombu import Connection

broker_url = "sentinel://127.0.0.1:26379;sentinel://127.0.0.1:26380"
app = Celery('tasks', broker=broker_url, backend="redis://127.0.0.1:6379/1")

app.conf.broker_transport_options = {
    'sentinel': [('127.0.0.1', 26379), ('127.0.0.1', 26380)],
    'master_name': 'mymaster',
}
  • 这样,Celery 会自动连接 Sentinel 获取当前的 Redis 主节点,主从切换时不会影响任务执行

方案 2:Redis Cluster

Redis Cluster 是 Redis 自带的分布式方案,提供数据分片+高可用

✅ 优点:

  • 数据分片,支持大规模数据存储,适合高并发任务队列。
  • 内置故障转移,节点宕机时,集群会自动选出新的主节点。

✅ 配置 Celery 使用 Redis Cluster

1、启动 Redis Cluster(假设 6 个节点,3 主 3 备):

redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 \
192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379 --cluster-replicas 1

2、修改 Celery 配置

from celery import Celery

app = Celery('tasks', broker='redis://192.168.1.1:6379/0', backend='redis://192.168.1.1:6379/1')

app.conf.broker_transport_options = {
    'cluster': [
        "redis://192.168.1.1:6379/0",
        "redis://192.168.1.2:6379/0",
        "redis://192.168.1.3:6379/0",
    ]
}
  • 这样 Celery 会自动负载均衡多个 Redis 节点,即使某个节点挂了,任务队列也能继续运行

方案 3:RabbitMQ 代替 Redis(更稳定)

如果不想用 Redis,可以考虑 RabbitMQ,它是 Celery 官方默认的 Broker,提供持久化存储+集群高可用

✅ 优点:

  • RabbitMQ 的消息存储在磁盘中,即使崩溃重启,消息不会丢失
  • 支持 高可用模式(HA),多个节点一起工作,不会有单点故障
  • 任务队列 更稳定,支持事务、消息确认、队列优先级等功能

✅ 配置 Celery 使用 RabbitMQ

app = Celery('tasks', broker='pyamqp://guest@localhost//')
  • 这样 Celery 会连接 RabbitMQ,所有任务都会进入 RabbitMQ 队列,即使 Celery 挂了,任务也不会丢失

🚀 最佳实践(推荐)

方案 适用场景 可靠性 复杂度
Redis Sentinel 中小规模任务队列 ⭐⭐⭐⭐ 中等
Redis Cluster 高并发、大规模任务 ⭐⭐⭐⭐
RabbitMQ 需要强一致性任务(如支付、交易) ⭐⭐⭐⭐⭐

🔹 如果只是简单任务队列,Redis Sentinel 就够用了。
🔹 如果任务量很大,Redis Cluster 更合适。
🔹 如果任务不能丢,RabbitMQ 是最佳选择。


✅ 总结

🚀 Redis 默认是单点故障,但可以用 Sentinel 或 Cluster 解决。
🚀 如果任务特别重要,建议用 RabbitMQ 代替 Redis。
🚀 根据业务需求选择合适的 Broker 方案,避免单点故障! 💡

The post Celery任务队列的Redis高可用方案 first appeared on 东篱blog.

❌