[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| master | n. | /ˈmɑːstə(r)/ | 主节点(负责写,同步数据给从节点) |
| replica | n. | /ˈreplɪkə/ | 从节点(同步主节点数据,默认只读,可升级为主) |
| replication | n. | /ˌreplɪˈkeɪʃn/ | 复制(主从数据同步机制) |
| sentinel | n. | /ˈsentɪnl/ | 哨兵(监控主从,自动故障转移的高可用组件) |
| failover | n. | /ˈfeɪlˌəʊvə(r)/ | 故障转移(主节点宕机后自动选新主) |
| read-only | adj. | /ˌriːd ˈəʊnli/ | 只读的(从节点默认 replica-read-only yes) |
| full sync | n. | /fʊl sɪŋk/ | 全量复制(首次/断线重连,传完整数据) |
| partial sync | n. | /ˈpɑːʃl sɪŋk/ | 增量复制(断线后只补缺失的命令) |
Lecture10-Redis-主从复制与哨兵
目标:搭建主从复制实现读写分离与数据备份,再用哨兵 Sentinel 让主节点宕机时自动切换,实现高可用。
1、主从复制
1、结构与好处
- 读写分离:主写、从读,分担读压力。
- 数据多份:避免单点故障,降低数据丢失风险。
- 高可用基础:主节点挂了,从节点可升级为新主。
2、搭建(教学:一台机器起 3 个实例)
生产环境搭建主从结构,每一个实例都需要单独占用一台服务器,充分发挥服务器性能;
但是我们现在条件不宽裕,也是为了操作简便,暂时放在同一台 Ubuntu 虚拟机
①准备配置文件
在一台机器上启动三个 Redis 进程,端口分别为 6379、6380、6381。
从解压目录下,复制原始、纯净、未被修改的配置文件,复制到专门的目录下:
mkdir -p /usr/local/redis_repl
sudo chown -R $USER:$USER /usr/local/redis_repl
cp /opt/redis-8.0.6/redis.conf /usr/local/redis_repl/redis-master.conf
cp /opt/redis-8.0.6/redis.conf /usr/local/redis_repl/redis-6380.conf
cp /opt/redis-8.0.6/redis.conf /usr/local/redis_repl/redis-6381.conf
编辑三个文件,各自改端口/日志/数据文件:
# redis-master.conf(主,6379 默认即可)
port 6379
daemonize yes
dir /usr/local/redis_repl
logfile master.log
dbfilename dump-master.rdb
protected-mode no
bind 0.0.0.0
# redis-6380.conf(从)
port 6380
daemonize yes
dir /usr/local/redis_repl
logfile repl6380.log
dbfilename dump-6380.rdb
protected-mode no
bind 0.0.0.0
replicaof 127.0.0.1 6379 # 关键:指定主节点
# redis-6381.conf(从)
port 6381
daemonize yes
dir /usr/local/redis_repl
logfile repl6381.log
dbfilename dump-6381.rdb
protected-mode no
bind 0.0.0.0
replicaof 127.0.0.1 6379
②启动三个实例
redis-server /usr/local/redis_repl/redis-master.conf
redis-server /usr/local/redis_repl/redis-6380.conf
redis-server /usr/local/redis_repl/redis-6381.conf
③查看主从关系
redis-cli -p 6379 info replication
# role:master
# connected_slaves:2
# slave0:ip=127.0.0.1,port=6380,state=online,offset=...
redis-cli -p 6380 info replication
# role:slave
# master_host:127.0.0.1
# master_port:6379
# master_link_status:up
④临时设置主从(命令方式)
# 设为从
redis-cli -p 6381 slaveof 127.0.0.1 6379
# 取消(变回主)
redis-cli -p 6381 slaveof no one
replicaof(配置)和slaveof(命令)二选一,配置方式重启仍有效。
3、测试要点
- 主节点写入 → 从节点能读到(数据同步 ✓)。
- 从节点不能写:
(error) READONLY You can't write against a read only replica. - 从节点宕机重启后,需重新建立主从关系(命令方式会丢)。
- 主节点宕机期间,从节点仍是只读,不能自动接管 → 这就是需要哨兵的原因。
4、同步原理(够用版)
- 首次/断线重连:全量复制(主节点
bgsave生成快照传给从节点加载)。 - 断线期间累积的命令:增量复制(从复制积压缓冲区补缺失命令,用
PSYNC实现)。
2、哨兵 Sentinel(高可用)
1、为什么需要
主从复制是手动维护的:主挂了,从不会自动升级。哨兵自动完成:
- 监控:心跳检查(heart beat)主/从是否存活。
- 故障转移:主宕机后自动把某个从提升为主,并通知其它从/客户端。
- 通知:客户端通过哨兵拿到新的主节点地址。
2、主观下线与客观下线
单个哨兵说"它可能挂了"是主观下线;多个哨兵(超过 quorum)一致确认才客观下线,然后触发故障转移(避免网络抖动误判)。
# sentinel.conf
# mymaster 是主节点别名;1 表示至少 1 个哨兵同意才客观下线
sentinel monitor mymaster 127.0.0.1 6379 1
生产建议至少 3 个哨兵(奇数),避免"哨兵自己挂了导致无法决策"。
3、启动哨兵
./redis-sentinel /usr/local/redis_repl/sentinel.conf --sentinel
哨兵运行后会自动改配置(记录当前 master 信息),日志会打印:
+sdown master mymaster 127.0.0.1 6379
+odown master mymaster ...
+switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380 ← 主切换到 6380
4、测试故障转移
redis-cli -p 6379 shutdown杀掉主节点。- 等待十几秒,观察哨兵日志:自动把某个从(如 6380)提升为新主。
- 从节点按新主继续同步;客户端连哨兵会自动感知新主。
3、对接 SpringBoot 4(通过哨兵)
应用不直连 Redis,而是连接哨兵,由哨兵返回当前主节点地址。
spring:
data:
redis:
client-type: lettuce
sentinel:
master: mymaster # 哨兵配置文件里定义的主节点名
nodes:
- 127.0.0.1:26379 # 哨兵端口(默认 26379)
lettuce:
pool:
enabled: true
max-active: 8
max-idle: 5
哨兵默认端口 26379(master 6379 + 20000)。Lettuce 会自动发现新主并重连。
4、本讲小结
- 主从复制:主写从读、数据备份;从节点只读、需手动切换。
- 哨兵:监控 + 自动故障转移 + 通知,实现高可用。
- 高可用等级:单机 → 主从 → 主从+哨兵 → 集群(下一讲)。
5、课堂练习
- 在一台机器上启动 3 个 Redis 实例(6379 主 + 6380/6381 从),用
replicaof建立主从。 - 主节点写入
name=hello,分别在两个从节点读取,验证同步。 - 在从节点执行
set,观察READONLY报错。 - 启动 1 个哨兵监控主节点,杀掉主节点,观察哨兵自动把从节点提升为新主。
6、本节验证
- 会搭建一主两从,理解读写分离 ✅
- 会用命令/配置设置主从,查看主从关系(role、master_link_status)✅
- 理解全量复制与增量复制(够用版)✅
- 会配置并启动哨兵,理解主观/客观下线与故障转移,对接 SpringBoot4 ✅