详解Redis集群的三种实现方案
Redis分布式存储的常见方案有:
1.「主从 (Master-Slave) 模式」主从复制,读写分离,数据备份。 2.「哨兵 (Sentinel) 模式」一主多从,哨兵监控,自动处理故障,容错和恢复。 3.「 集群 (Cluster) 模式」多主多从,数据分片,在线扩容。 Redis集群切片的方式有: 1.「客户端分片」分片逻辑在Redis客户端实现,采用一致性哈希来决定Redis节点。 2.「中间件分片」借助中间件实现Redis节点的路由分派,根据路由规则将请求发送到正确的Redis节点上。 3. 「客户端服务端分片」Redis Cluster模式,客户端采用一致性哈希,服务端提供错误节点的重定向服务。
本文将详细介绍「Redis分布式存储」的3种方案和「Redis集群切片」的3种常见方式。
什么是Redis集群
Redis集群是由多个redis实例组成的集合,将缓存的数据分散到多个redis节点上存储,减轻单个缓存节点的访问压力,达到分流效果,提高了存储容量和吞吐量,提供高可用性和容错恢复能力,实现了水平扩容。
Redis集群的作用和优势
1. 处理大规模数据:将数据分散在多个节点上,从而突破单节点内存限制,有效应对数据量的增长和高并发的访问请求。
2. 高可用性:当主节点发生故障时,集群会自动选举新的主节点,从而实现故障转移,保证高可用性。
3. 可扩展性:Redis集群可以根据业务需求和系统负载,动态添加或删除节点,实现水平扩展,以适应数据规模的变化。
4. 高性能:Redis集群中的各个节点可以并行处理不同的请求,从而提高系统整体吞吐量和响应速度,适合于高并发访问的场景。
5. 自动故障转移:Redis集群通过哨兵节点监控主节点的健康状态,在主节点故障时,自动选举新的主节点,减少服务中断和数据丢失的风险。
1 主从(Master - Slave)模式
主从模式是指在Redis集群中有一个主节点(Master)和多个从节点(Slave)。
Master节点负责数据的写操作,Slave节点负责数据的读操作。
通过主从复制,将Master节点的数据变更同步到Slave节点。
「主从模式的优点」
1. 数据备份:通过主从复制,从节点备份主节点的数据,提高数据可靠性。
2. 读写分离:将读操作和写操作分配给不同的节点处理,提高系统稳定性。
3. 提升读取性能:通过多个从节点来分担读操作的压力,提高数据的查询效率。
「主从模式的缺点」
1. 没有容错和恢复的能力,存在单点故障:一旦Master节点故障,不会自动选出新的主节点,导致后续所有的写操作直接失败。
2. 可用性低:主节点故障时不能自动实现故障转移,需要人工干预手动切换,故障恢复时间长。
3. 没有实现数据分片,无法在线扩容,并发压力受限于单节点服务器的资源配置。
4. 集群中所有节点保存的都是全量数据,浪费内存空间,且数据量过大时严重影响主从同步的速度。
5. 单个主节点承担所有写操作,写操作受单节点性能瓶颈影响。
「主从模式的应用场景」
适用于数据备份、读写分离、对可用性要求不高,小规模数据处理的场景。
2 哨兵(Sentinel)模式
「哨兵模式的优点」
1. 高可用性:提供故障的自动处理能力。
2. 容灾恢复:在主从模式数据备份的基础上,提供容错和自动恢复机制。
3. 读写分离:通过多个从节点来分担读操作的压力,提升读取性能。
4. 解决了单点故障:监测到master节点故障,会自动从slave节点中选出一个节点将其切换成master节点,在选举结束之前,redis会开启保护机制,禁止写操作,直到新的master节点产生。每个哨兵节点都是一个独立的进程,哨兵节点之间也会互相监控。
「哨兵模式的缺点」
1. 依然没有实现数据分片,无法在线扩容,并发压力受限于单节点服务器的资源配置。
2. 每个从节点和主节点的耦合度高,在主节点宕机到重新选举Master的期间,服务不可用。
3. 集群中所有节点保存的都是全量数据,浪费内存空间,且数据量过大时严重影响主从同步的速度。
4. 单个主节点承担所有写操作,写操作受单节点性能瓶颈影响。
「哨兵模式的应用场景」
适用于数据备份、容灾恢复,高可用性、小规模数据处理的场景。
3 集群(Cluster)模式
在Redis Cluster中,数据被分为16384个槽,每个槽存储一部分数据。
数据分片是用CRC16算法对key进行hash操作,哈希计算的结果是16位的哈希值,将哈希值对16384取模,得到槽位编号。当存取Key的时候,根据槽位编号,找到对应的节点进行数据的读写。
「Cluster的优点」
1. 数据分片:基于slot槽的数据分片,突破单节点的内存限制,实现更大规模的数据分布式存储。
2. 横向扩展:实现在线动态横向扩缩容。
3. 高可用性:每个分片都是一个主节点对应多个从节点,主从复制,当Master出现故障,会从Slave节点中选举一个新的Master继续提供服务,实现自动故障转移。
「Cluster的缺点」
1. slave节点只是一个冷备节点,用于在主节点故障时接替其角色,不提供分担读操作的压力。
2. 对Redis里面的批量操作指令会有限制。
3. 客户端的实现会更加复杂。
「Cluster的应用场景」
适用于海量数据+高并发+高可用的场景。
总结
Redis集群分片的方式
1.「客户端分片」分片逻辑在Redis客户端实现,采用一致性哈希来决定Redis节点。
优点:不依赖于第三方中间件,服务端的Redis实例彼此独立,相互无关联,分片逻辑和路由规则可控。
2.「中间件分片」Redis客户端把请求发送到中间件(例如Twemproxy、Codis),借助中间件实现Redis节点的路由分派,根据路由规则将请求发送到正确的Redis节点上。
优点:支持平滑增减Redis实例而无需修改任何的代码。
3. 「客户端服务端分片」Redis Cluster模式,客户端采用一致性哈希,服务端提供错误节点的重定向服务。
发表评论