Redis 三种集群模式详解
前言
在现代分布式系统架构中,缓存层的高可用性和扩展性至关重要。Redis 作为最流行的内存数据库之一,提供了多种集群模式来满足不同场景下的需求。无论是简单的数据备份还是大规模分布式部署,Redis 都能提供相应的解决方案。本文将详细介绍 Redis 的三种主流集群模式:主从复制、哨兵模式 和 Cluster 集群模式,帮助读者理解每种模式的工作原理、适用场景及实践方法,为构建稳定可靠的 Redis 架构提供指导。
1 Redis 三种模式概述
Redis 集群支持三种模式:主从复制、哨兵模式和Cluster集群模式。它们分别适用于不同的高可用和分布式需求场景。
主从复制(Replication)
基础高可用方案,支持数据多机备份和读操作的负载均衡。
缺点:故障恢复需手动;写操作无法负载均衡;存储受单机限制。
哨兵模式(Sentinel)
在主从复制基础上实现自动故障恢复。
缺点:写操作无法负载均衡;存储受单机限制;从节点故障需额外处理。
集群模式(Cluster)
完善的分布式高可用方案,支持写负载均衡和突破单机存储限制。
2 Redis 主从复制
2.1 主从复制的作用
数据冗余:热备份机制
故障恢复:从节点可快速替代主节点
负载均衡:读写分离提升读并发能力
高可用基础:哨兵和集群模式的基础
2.2 主从复制流程
Slave 发送
SYNC
命令请求同步Master 启动后台进程生成RDB快照,并缓存写命令
Master 发送RDB文件至Slave,Slave加载到内存
Master 发送缓存的写命令至Slave
多个Slave连接时,Master统一处理并分发数据
2.3 搭建示例(Master: 192.168.10.77,Slaves: 192.168.10.88/99)
bash
#环境准备(关闭防火墙和增强功能) systemctl stop firewalld setenforce 0# 安装Redis yum install -y gcc gcc-c++ make wget http://download.redis.io/releases/redis-5.0.7.tar.gz tar zxvf redis-5.0.7.tar.gz -C /opt/ cd /opt/redis-5.0.7/ make && make PREFIX=/usr/local/redis install cd /opt/redis-5.0.7/utils ./install_server.sh #一直回车 若出现 Please select the redis executable path [] 则在后面加上 /usr/local/redis/bin/redis-server#创建软链接,便于系统识别 ln -s /usr/local/redis/bin/* /usr/local/bin/# Master配置(/etc/redis/6379.conf) bind 0.0.0.0 daemonize yes logfile /var/log/redis_6379.log dir /var/lib/redis/6379 appendonly yes# Slave配置 bind 0.0.0.0 daemonize yes logfile /var/log/redis_6379.log dir /var/lib/redis/6379 appendonly yes replicaof 192.168.10.23 6379 # 添加此行指向Master#配置完后重启服务 /etc/init.d/redis_6379 restart# 在Master节点上验证主从 redis-cli info replication
3. Redis 哨兵模式
3.1 哨兵功能
监控:检查节点健康状态
自动故障转移:Master宕机时自动提升Slave为新Master
通知:向客户端发送故障转移结果
3.2 故障转移机制
哨兵通过心跳检测判断节点状态
主观下线 → 客观下线(需多数哨兵确认)
Raft算法选举Leader哨兵
Leader执行故障转移:
选择健康Slave提升为新Master
切换其他节点指向新Master
通知客户端
3.3 搭建示例
bash
# 哨兵配置(sentinel.conf) protected-mode no port 26379 daemonize yes logfile "/var/log/sentinel.log" dir "/var/lib/redis/6379" sentinel monitor mymaster 192.168.10.23 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel failover-timeout mymaster 180000# 启动哨兵 redis-sentinel sentinel.conf &# 验证 redis-cli -p 26379 #哨兵默认运行在端口26379 info Sentinel
4、故障模拟#查看redis-server 进程号
kill -9 进程号#验证结果
tail -f /var/log/sentinel.log#查看master是否被切换
redis-cli -p 26379 INFO Sentinel
4. Redis 集群模式(Cluster)
4.1 集群特性
数据分片:16384个哈希槽分散到多个节点
高可用:支持主从复制和自动故障转移
4.2 数据分片原理
每个Key通过CRC16校验后取模16384决定所属哈希槽
示例三节点集群:
节点A:0-5460
节点B:5461-10922
节点C:10923-16383
4.3 搭建示例(例:在一台服务器上操作 6节点 3主3从)
bash
# 创建节点目录 mkdir -p /etc/redis/redis-cluster/redis600{1..6} for i in {1..6} do cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i done# 配置示例(redis6001/redis.conf) port 6001 #92行,修改,redis监听端口 #bind 127.0.0.1 #69行,注释掉bind 项,默认监听所有网卡 protected-mode no #88行,修改,关闭保护模式 daemonize yes #136行,开启守护进程,以独立进程启动 cluster-enabled yes #832行,取消注释,开启群集功能 cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置 cluster-node-timeout 15000 #846行,取消注释群集超时时间设置 appendonly yes #700行,修改,开启AOF持久化# 启动所有节点 for d in {1..6}; docd /etc/redis/redis-cluster/redis600$dredis-server redis.conf done#查看服务状态 ps -ef | grep redis# 创建集群 redis-cli --cluster create \127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 \127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 \--cluster-replicas 1# 测试集群 redis-cli -p 6001 -c 127.0.0.1:6001> cluster slots# 故障模拟
5 总结
Redis三种集群模式各有侧重:主从复制实现数据备份与读写分离,适合基础场景;哨兵模式在此基础上提供自动故障转移,保障高可用性;Cluster集群通过数据分片实现真正分布式,支持水平扩展。选择时需根据数据规模、性能需求和运维复杂度权衡,从简到繁逐步演进。