Redis高可用方案

在使用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

除特殊说明,博客文章均为东篱原创,依据 CC BY-SA 4.0 许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇