Redis 三大架构模式详解:主从复制、哨兵、Cluster 搭建全指南
一、引言
Redis 作为高性能的内存数据库,被广泛应用于缓存、消息队列、排行榜等场景。为了提升其可用性与扩展性,Redis 提供了三种核心架构模式:
主从复制(Master-Slave Replication)
哨兵模式(Sentinel)
集群模式(Cluster)
本文将详细介绍这三种模式的原理、优缺点及搭建方法,帮助你根据业务场景选择合适的架构。
二、主从复制:高可用的基石
✅ 原理简述
主从复制是 Redis 最基本的高可用方案。主节点负责写操作,从节点复制主节点的数据,提供读服务。
✅ 主要作用
数据冗余与备份
读写分离,提升读并发能力
故障恢复(手动)
✅ 复制流程
从节点发送
SYNC
命令请求同步主节点执行
BGSAVE
生成 RDB 文件并发送给从节点从节点加载 RDB 文件并完成初始化
主节点持续将写命令同步给从节点
✅ 搭建步骤(CentOS 示例)
设置主机名,从机名
Master节点: 192.168.10.150
Slave1节点: 192.168.10.100
Slave2节点: 192.168.10.80
关闭防火墙
systemctl stop firewalld
setenforce 0
安装redix
yum install -y gcc gcc-c++ make
wget -p /opt 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 PREFIX=/usr/local/redis installcd /opt/redis-5.0.7/utils
./install_server.sh
......
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server ln -s /usr/local/redis/bin/* /usr/local/bin/
修改主节点(master)配置文件
cp /etc/redis/6379.conf /etc/redis/6379.conf.bak
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0
daemonize yes #137行,开启守护进程
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
appendonly yes #700行,开启AOF持久化功能/etc/init.d/redis_6379 restart
修改从节点(slave)配置文件
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0
daemonize yes #137行,开启守护进程
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
replicaof 192.168.10.150 6379 #288行,指定要同步的Master节点IP和端口
appendonly yes #700行,开启AOF持久化功能/etc/init.d/redis_6379 restart
验证主从效果
1.看日志
tail -f /var/log/redis_6379.log
Replica 192.168.10.100:6379 asks for synchronization
Replica 192.168.10.80:6379 asks for synchronization
2.在master节点上验证
redis-cli info replication# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.18,port=6379,state=online,offset=1246,lag=0
slave1:ip=192.168.10.19,port=6379,state=online,offset=1246,lag=1
3.在主机上输入看从机上是否有反应
三、哨兵模式:自动故障转移
✅ 原理简述
哨兵模式在主从复制的基础上,引入了自动故障转移机制。当主节点宕机,哨兵会自动选举新的主节点。
✅ 核心功能
监控主从节点状态
自动故障转移
通知客户端新的主节点地址
✅ 故障转移流程
哨兵发现主节点主观下线(SDOWN)
多数哨兵确认客观下线(ODOWN)
选举 leader 哨兵
提升一个从节点为新主节点
通知其他从节点和客户端
✅ 配置示例(sentinel.conf)
Master节点:192.168.10.150
Slave1节点:192.168.10.100
Slave2节点:192.168.10.80
关闭防火墙
systemctl stop firewalld
setenforce 0
修改 Redis 哨兵模式的配置文件(所有节点操作)
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no #17行,关闭保护模式
port 26379 #21行,Redis哨兵默认的监听端口
daemonize yes #26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log" #36行,指定日志存放路径
dir "/var/lib/redis/6379" #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.10.150 6379 2 #84行,修改 指定该哨兵节点监控192.168.10.150:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000(180秒)
启动哨兵
先启master,再启slave
先启master,再启slave
先启master,再启slave
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
查看哨兵信息
redis-cli -p 26379 info Sentinel# Sentinelsentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.20.23:6379,slaves=2,sentinels=3
故障模拟
#查看redis-server进程号:
ps -ef | grep redis
root 57031 1 0 15:20 ? 00:00:07 /usr/local/bin/redis-server 0.0.0.0:6379
root 57742 1 1 16:05 ? 00:00:07 redis-sentinel *:26379 [sentinel]
root 57883 57462 0 16:17 pts/1 00:00:00 grep --color=auto redis#杀死 Master 节点上redis-server的进程号
kill -9 57031 #Master节点上redis-server的进程号#验证结果
tail -f /var/log/sentinel.log
23062:X 18 Sep 2025 22:36:04.175 # +monitor master mymaster 192.168.10.150 6379 quorum 2
23062:X 18 Sep 2025 22:36:04.176 * +slave slave 192.168.10.100:6379 192.168.10.100 6379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:36:04.178 * +slave slave 192.168.10.80:6379 192.168.10.80 6379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:36:11.142 * +sentinel sentinel 2d97f3ac6e2ca4a7ecdf456264324b519edae80e 192.168.10.100 26379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:36:13.326 * +sentinel sentinel 0fef2cc38d8db8ccefad0466290bcd1057e16aa9 192.168.10.80 26379 @ mymaster 192.168.10.150 6379
23066:X 18 Sep 2025 22:36:19.027 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23066:X 18 Sep 2025 22:36:19.027 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=23066, just started
23066:X 18 Sep 2025 22:36:19.027 # Configuration loaded
23067:X 18 Sep 2025 22:36:19.028 * Increased maximum number of open files to 10032 (it was originally set to 1024).
23067:X 18 Sep 2025 22:36:19.028 # Could not create server TCP listening socket *:26379: bind: Address already in use
23062:X 18 Sep 2025 22:37:50.104 # +sdown master mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:37:50.178 # +new-epoch 1
23062:X 18 Sep 2025 22:37:50.179 # +vote-for-leader 0fef2cc38d8db8ccefad0466290bcd1057e16aa9 1
23062:X 18 Sep 2025 22:37:50.560 # +config-update-from sentinel 0fef2cc38d8db8ccefad0466290bcd1057e16aa9 192.168.10.80 26379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:37:50.560 # +switch-master mymaster 192.168.10.150 6379 192.168.10.80 6379
23062:X 18 Sep 2025 22:37:50.561 * +slave slave 192.168.10.100:6379 192.168.10.100 6379 @ mymaster 192.168.10.80 6379
23062:X 18 Sep 2025 22:37:50.561 * +slave slave 192.168.10.150:6379 192.168.10.150 6379 @ mymaster 192.168.10.80 6379
23062:X 18 Sep 2025 22:38:20.584 # +sdown slave 192.168.10.150:6379 192.168.10.150 6379 @ mymaster 192.168.10.80 6379
查看是否被更换
redis-cli -p 26379 INFO Sentinel# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.10.100:6379,slaves=2,sentinels=3
四、Redis Cluster:真正的分布式方案
✅ 原理简述
Redis Cluster 是 Redis 官方提供的分布式解决方案,支持:
数据分片(16384 个哈希槽)
主从复制
自动故障转移
✅ 数据分片机制
每个 key 通过 CRC16 对 16384 取模,决定属于哪个槽
每个节点负责一部分槽
支持动态扩容、缩容
✅ 搭建步骤(单机模拟 6 节点)
节点规划:
主节点:6001、6002、6003
从节点:6004、6005、6006
配置要点(redis.conf):
搭建Redis 群集模式 ----------------------------------------
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。
cd /etc/redis/
mkdir -p 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
开启群集功能:
其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。
cd /etc/redis/redis-cluster/redis6001
vim redis.conf
#bind 127.0.0.1 #69行,注释掉bind 项,默认监听所有网卡
protected-mode no #88行,修改,关闭保护模式
port 6001 #92行,修改,redis监听端口,每个都要改
daemonize yes #136行,开启守护进程,以独立进程启动
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置,每个都要改
cluster-node-timeout 15000 #846行,取消注释群集超时时间设置
appendonly yes #700行,修改,开启AOF持久化
启动redis节点
分别进入那六个文件夹,执行命令:redis-server redis.conf ,来启动redis节点
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
doneps -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 #加-c参数,节点之间就可以互相跳转
127.0.0.1:6001> cluster slots #查看节点的哈希槽编号范围
1) 1) (integer) 54612) (integer) 10922 #哈希槽编号范围3) 1) "127.0.0.1"2) (integer) 6003 #主节点IP和端口号3) "fdca661922216dd69a63a7c9d3c4540cd6baef44"4) 1) "127.0.0.1"2) (integer) 6004 #从节点IP和端口号3) "a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 02) (integer) 54603) 1) "127.0.0.1"2) (integer) 60013) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11"4) 1) "127.0.0.1"2) (integer) 60063) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 109232) (integer) 163833) 1) "127.0.0.1"2) (integer) 60023) "816ddaa3d1469540b2ffbcaaf9aa867646846b30"4) 1) "127.0.0.1"2) (integer) 60053) "f847077bfe6722466e96178ae8cbb09dc8b4d5eb"
测试
127.0.0.1:6001> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:6003
OK127.0.0.1:6001> cluster keyslot name #查看name键的槽编号redis-cli -p 6004 -c
127.0.0.1:6004> keys * #对应的slave节点也有这条数据,但是别的节点没有
1) "name"
看是否从1转到2
五、三种模式对比总结
表格
复制
特性/模式 | 主从复制 | 哨兵模式 | Cluster 集群 |
---|---|---|---|
数据备份 | ✅ | ✅ | ✅ |
读写分离 | ✅ | ✅ | ✅ |
自动故障转移 | ❌ | ✅ | ✅ |
写操作负载均衡 | ❌ | ❌ | ✅ |
数据分片 | ❌ | ❌ | ✅ |
单机内存限制 | ❌ | ❌ | ✅ |
六、结语
小型项目:主从复制足够
中型项目:哨兵模式提供自动故障转移
大型项目:Cluster 模式支持水平扩展与高可用
选择合适的架构,才能让 Redis 在你的系统中发挥最大价值。