Redis 集群
是什么
Redis 集群是一种通过将多个 Redis 节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许 Redis 在不同节点上同时提供服务,提高整体性能和可靠性。根据搭建的方式和集群的特点,Redis集群主要有三种模式:主从复制模式(Master-Slave)、哨兵模式(Sentinel)和 Cluste r模式
Redis集群的作用和优势
- 高可用性
- 负载均衡
- 容灾恢复
- 数据分片
- 易于拓展
Master-Slave(主从复制模式)
工作原理
它通过将一个 Redis 节点(主节点)的数据复制到一个或多个其他 Redis 节点(从节点)来实现数据的冗余和备份
主节点负责处理客户端的写操作,同时从节点会实时同步主节点的数据。客户端可以从从节点读取数据,实现读写分离,提高系统性能
实现
在 redis.conf 添加 以下配置
# 从节点设置端口号6380
port 6380
# replicaof 主节点IP 主节点端口
replicaof 127.0.0.1 6379
或者直接在从节点 Redis 命令行执行
#replicaof 主节点地址 主节点端口
replicaof 127.0.0.1 6379
优点
- 配置简单,易于实现
- 实现数据冗余,提高数据可靠性
- 读写分离,提高系统性能
缺点
- 主节点故障时,需要手动切换到从节点,故障恢复时间较长
- 主节点承担所有的写操作,可能成为性能瓶颈
- 无法实现数据分片,受单节点内存限制
Redis Sentinel(哨兵模式)
解决的问题
高可用性解决方案,用于监控和管理Redis实例,确保系统的可用性和故障恢复能力
工作原理
主从复制,通过周期性检查Rrdis实力的状态来监控各个节点。当主节点不可用时,Sentinel会自动选取一个从节点晋升为新的主机点,保障系统的可用性
实现
-
配置主从复制:首先按照主从复制模式的配置方法,单间一个主从复制集群
-
配置哨兵节点:在哨兵节点上创建一个新的哨兵配置文件(如:sentinel.conf),并添加如下配置:
# sentinel节点端口号 port 26379 # sentinel monitor 被监控主节点名称 主节点IP 主节点端口 quorum sentinel monitor mymaster 127.0.0.1 6379 2 # sentinel down-after-milliseconds 被监控主节点名称 毫秒数 sentinel down-after-milliseconds mymaster 60000 # sentinel failover-timeout 被监控主节点名称 毫秒数 sentinel failover-timeout mymaster 180000
-
启动哨兵节点:使用如下命令启动哨兵节点:
redis> redis-sentinel /path/to/sentinel.conf
-
验证哨兵模式:手动停止主节点,观察哨兵节点是否自动选举出新的主节点,并通知其他从节点和客户端
特点
- 监控简单:Sentinel的配置相对简单,通过指定要监控的Redis实例即可启动监控
- 故障切换:当主节点发生故障时,Sentinel自动进行故障切换,将一个从节点晋升为新的主节点
- 适用场景:适合小规模部署,对于中小型应用提供了简单而有效的高可用性方案。可用于管理Redis Cluster集群中的节点,监控节点状态、配置变更和故障恢复等,它可以自动检测并处理节点的故障,并确保集群的稳定运行。
优点
- 自动故障转移,提高系统的高可用性
- 具有主从复制的所有优点,如数据冗余和读写分离
缺点
- 配置和管理相对复杂
- 依然无法实现数据分片,受单节点内存限制
Redis Cluster
解决的问题
分布式解决方案,旨在解决单个Redis实例的容量和性能瓶颈
工作原理
采用了分布式架构,采用哈希槽(Hash Slot)的概念,将数据分为16384个槽位。每个节点负责管理一部分槽位,并在集群中进行数据交互和协调。客户端根据Key通过哈希算法(使用CRC16算法计算键的哈希值,然后对16384取模,得到槽位编号)来确定对应的槽位,然后负责该槽位的节点进行通信。实现高可用性和横向扩展。自动分片和节点故障切换是Cluster的两个关键特点。
实现
- 配置 Redis 节点:为每个节点创建 redis.conf 配置文件,并添加如下配置:
# cluster节点端口号 port 7001 # 开启集群模式 cluster-enabled yes # 节点超时时间 cluster-node-timeout 15000
像这样的配置,一共需要创建6个,我们做一个三主三从的集群:
1. 启动 Redis 节点:使用如下命令启动6个节点:
redis> redis-server redis_7001.conf
2. 创建 Redis Cluster:使用 Redis 命令行工具执行如下命令创建 Cluster:
redis> redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
cluster-replicas 表示从节点的数量,1地表每个主节点都有1个从节点。
-
创建 Redis Cluster:使用 Redis 命令行工具执行如下命令创建 Cluster:
-
验证 Cluster 模式:向 Cluster 发送请求,观察请求是否正确路由到相应的节点
特点
- 分布式架构:Redis Cluster将数据分布在多个节点上,实现了负载均衡和横向扩展
- 自动分片:Cluster支持自动分片,实现了数据在各个节点的均匀分布
- 故障切换:当节点发生故障时,Cluster能够通过自动重新分配哈希槽(Hash Slot)和选举新的主节点来实现快速的故障切换
- 适用场景:Redis Cluster 适用于大规模部署,能够处理更大量级的数据和请求。比如:高并发读写(大规模数据存储),容量扩展,高可用性
优点
- 数据分片,实现大规模数据存储
- 负载均衡,提高系统吸能
- 自动故障转移,提高高可用性
缺点
- 配置和管理较复杂
- 一些复杂的多键操作可能受到限制
总结
- 主从模式:适用于数据备份和读写分离场景,配置简单,但在主节点故障时需要手动切换
- Sentinel(哨兵模式):在主从复制的基础上实现自动故障转移,提高高可用性,适用于高可用性要求较高的场景
- Cluster模式:通过数据分片和负载均衡实现大规模数据存储和高性能,适用于大规模数据存储和高性能要求场景