前言
在现代分布式系统架构中,缓存层的高可用性和扩展性至关重要。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}; do
cd /etc/redis/redis-cluster/redis600$d
redis-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集群通过数据分片实现真正分布式,支持水平扩展。选择时需根据数据规模、性能需求和运维复杂度权衡,从简到繁逐步演进。
1536

被折叠的 条评论
为什么被折叠?



