Redis 集群模式的主要优点包括高可用性、可扩展性和数据安全性,通过多节点部署避免单点故障,利用数据分片提高吞吐量。缺点在于部署管理复杂,数据分片不均可能导致性能问题。高可用性背后的复杂性主要通过主从复制、哨兵机制或 Cluster 自身的故障检测与转移来解决。例如,Redis Cluster 采用无中心结构,节点互联,超过半数节点检测失效才生效,且每个 master 需至少一个 slave 以实现故障自动转移,从而降低人工干预成本,确保服务持续可用。
Redis 集群模式
一、Redis 集群模式概述 Redis 集群模式是一种多节点的分布式系统,它将数据分片存储在多个节点上。Redis 集群模式的主要目标是提高可用性和可靠性,通过增加节点数量来提高系统的吞吐量和性能。Redis 集群模式通过将数据分散到多个节点上来避免单点故障,并使用主从复制来保证数据的可靠性。Redis 集群模式的主要优点包括:高可用性:通过多节点部署,避免了单点故障的风险。可扩展性:可以通过增加节点来提高系统的吞吐量和性能。数据安全性:通过主从复制来保证数据的可靠性,即使节点发生故障,数据仍然可以得到恢复。低延迟:数据分散在多个节点上,可以降低读写操作的延迟。Redis 集群模式的主要缺点包括:部署和管理复杂:Redis 集群模式需要管理多个节点,节点之间的复杂交互需要进行配置和管理。数据分片可能会导致性能问题:如果数据分布不均匀,可能会导致一些节点负载过重,而其他节点负载较轻的情况。
Redis 从入门到放弃 (9):集群模式
2、集群的原理 Redis 集群是 3.0 版本提出的一种分布式解决方案。其大致原理是通过分片 (Sharding) 和数据复制来实现数据的分布和高可用性。下面是 Redis 集群的基本原理:数据分片:Redis 集群使用哈希槽 (hash slot) 分片策略,将整个数据空间划分为固定数量的哈希槽。每个节点负责管理一部分哈希槽,而不是管理具体的键值对。数据分布:客户端将键通过哈希函数映射到某个哈希槽,然后找到负责该哈希槽的节点。这样,数据被均匀地分布在不同的节点上。数据复制:为了提供高可用性,每个主节点都有多个从节点。主节点会将自己的数据异步复制到从节点,以保持数据的一致性。从节点可以处理读请求,也可以在主节点宕机时升级为新的主节点。故障检测与转移:Redis 集群引入了哨兵 (Sentinel) 节点,用于监控主节点的状态。当主节点宕机或无法访问时,哨兵会发起选举,选择一个从节点升级为新的主节点,从而实现故障转移。故障恢复:当主节点恢复时,它会成为从节点,从新的主节点进行数据同步。这种方式可以确保在节点故障恢复后,数据能够重新同步,保持一致性。动态扩展:当需要扩展集群规模时,可以增加新的节点,调整哈希槽的分配信息,并在新节点上进行数据迁移。这样集群可以根据需求进行动态扩展,以适应不断增长的数据和流量。节点通信:集群中每个节点都需要知道其他所有节点的状态信息,包括当前集群状态、集群中各节点负责的哈希槽、集群中各节点的 master-slave 状态、集群中各节点的存活状态等。
Redis 4 种集群方案介绍 + 优缺点对比
但是主从模式、哨兵模式都没有达到真正的数据 sharding 存储,每个 redis 实例中存储的都是全量数据,所以 redis cluster 就诞生了,实现了真正的数据分片存储。但是由于 redis cluster 发布得比较晚 (2015 年才发布正式版 ), 各大厂等不及了,陆陆续续开发了自己的 redis 数据分片集群模式,比如:Twemproxy、Codis 等。主从模式 redis 单节点虽然有通过 RDB 和 AOF 持久化机制能将数据持久化到硬盘上,但数据是存储在一台服务器上的,如果服务器出现硬盘故障等问题,会导致数据不可用,而且读写无法分离,读写都在同一台服务器上,请求量大时会出现 I/O 瓶颈。为了避免单点故障 和 读写不分离,Redis 提供了复制 (replication) 功能实现 master 数据库中的数据更新后,会自动将更新的数据同步到其他 slave 数据库上。如上 redis 主从结构特点:一个 master 可以有多个 salve 节点;salve 节点可以有 slave 节点,从节点是级联结构。主从模式优缺点 优点:主从结构具有读写分离,提高效率、数据备份,提供多个副本等优点。不足:最大的不足就是主从模式不具备自动容错和恢复功能,主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预。普通的主从模式,当主数据库崩溃时,需要手动切换从数据库成为主数据库:在从数据库中使用 SLAVE NO ONE 命令将从数据库提升成主数据继续服务。启动之前崩溃的主数据库,然后使用 SLAVEOF 命令将其设置成新的主数据库的从数据库,即可同步数据。哨兵模式 第一种主从同步/复制的模式,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用,这时候就需要哨兵模式登场了。哨兵模式是从 Redis 的 2.6 版本开始提供的,但是当时这个版本的模式是不稳定的,直到 Redis 的 2.8 版本以后,这个哨兵模式才稳定下来。
【云原生进阶之 PaaS 中间件】第一章 Redis-2.3.3 集群模式
Redis 集群是一个提供在多个 Redis 节点之间共享数据的程序集。它并不像 Redis 主从复制模式那样只提供一个 master 节点提供写服务,而是会提供多个 master 节点提供写服务,每个 master 节点中存储的数据都不一样,这些数据通过数据分片的方式被自动分割到不同的 master 节点上。负载均衡 (降低单台 Redis 服务器的访问压力) 可拓展性 (降低单台 Redis 服务器的存储压力) 容灾处理 我们一般要实现一个 Redis 集群,可以有三种方式:客户端实现、Proxy 代理层、服务端实现。1.2.1 客户端实现 我们通过代码的实现方式,实现集群访问,如下图所示:这样的访问方式都通过代码来维护集群以及访问路径,可是这样的方式 维护难度大,也不支持动态扩容,因为一切都以代码实现访问规划。1.2.2 Proxy 代理层 如图所示:我们在 Redis 和我们的客户端之间新加了一层 Proxy,我们通过 Proxy 去规划访问,这样我们在代码层面以及 Redis 部署层面就无需处理,而且市面上也提供了这样的中间件,如 Codis(国产)、Twemproxy。我们看下 Codis 的架构图,就可以知道这个插件是如何工作的,如图所示:可见 Codis 是一个很完善的集群管理实现,我们可以不关心具体分片规则,程序开发容易简单,可是这样也有它的一些缺点:相对单机、主从、哨兵可以看到,原先可以直接访问 Redis,现在由于多了一层 Proxy,所有访问要经过 Proxy 中转,性能下降。我们需要依赖以及配置额外的插件 (中间件),增加了系统复杂度。服务端的实现方式就是标准的集群 (分区分片) 模式,RedisCluster 是 Redis 在 3.0 版本后推出的分布式解决方案。Cluster 模式实现了 Redis 的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。如图:RedisCluster 采用无中心结构,它的特点如下:所有的 redis 节点彼此互联 (PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。节点的 fail 是通过集群中超过半数的节点检测失效时才生效。客户端与 redis 节点直连,不需要中间代理层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。为了保证集群的高可用,每个 master 节点下面还需要添加至少 1 个 slave 节点,这样当某个 master 节点发生故障后,可以从它的 slave 节点中选举一个作为新的 master 节点继续提供服务。
FAQ
Redis 集群模式相比主从模式最大的优势是什么?
最大的优势在于实现了真正的数据分片存储和多个 master 节点提供写服务,解决了主从模式写入单点故障和水平扩容复杂的问题。
如何解决 Redis 集群高可用性背后的复杂性?
通过主从复制保证数据可靠性,利用哨兵机制或 Cluster 自带的故障检测与转移功能实现自动故障切换,减少人工干预。
Redis Cluster 采用什么机制进行节点通信?
采用无中心结构,所有节点彼此互联 (PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。