redis-RDB/AOF-主从复制整理
- 1. RDB 持久化
- 1.1 RDB 概述
- 1.2 RDB 工作原理
- 1.3 RDB 配置
- 1.4 RDB 优缺点
- 2. AOF 持久化
- 2.1 AOF 概述
- 2.2 AOF 工作原理
- 2.3 AOF 重写机制
- 2.4 AOF 配置
- 2.5 AOF 优缺点
- 3. RDB 与 AOF 对比
- 4. 主从复制
- 4.1 主从复制概述
- 4.2 主从复制架构
- 4.3 主从复制工作原理
- 4.4 主从复制配置
- 4.5 主从复制验证
- 4.6 主从复制管理命令
- 4.7 主从复制优化配置
- 5. 完整的主从复制部署示例
- 5.1 环境准备
- 5.2 配置文件定制
- 5.3 启动集群(可以在/etc/rc.d/rc.local配置开机启动)
- 6. 故障处理与监控
- 6.1 常见问题排查
- 6.2 主从切换(重启服务器后会优先按照redis.conf中配置重新建立主从关系)
1. RDB 持久化
1.1 RDB 概述
RDB(Redis Database)是 Redis 的快照式持久化方式,通过在指定时间间隔内将内存中的数据生成二进制快照文件(dump.rdb)保存到磁盘
1.2 RDB 工作原理
+----------------+ fork() +----------------+ 写入磁盘 +----------------+
| Redis主进程 | -------------> | Redis子进程 | -------------> | RDB文件 |
| (内存数据) | | (内存副本) | | (dump.rdb) |
+----------------+ +----------------+ +----------------+
工作流程:
- Redis 主进程 fork 一个子进程
- 子进程将内存数据写入临时 RDB 文件
- 写入完成后替换旧的 RDB 文件
- 子进程退出
1.3 RDB 配置
# redis.conf 配置文件
# 快照触发条件
save 900 1 # 900秒内至少1个key变化
save 300 10 # 300秒内至少10个key变化
save 60 10000 # 60秒内至少10000个key变化
# RDB文件名
dbfilename dump.rdb
# RDB文件保存目录
dir ./
# 持久化出错时是否停止写入
stop-writes-on-bgsave-error yes
# 是否压缩RDB文件
rdbcompression yes
# 是否校验RDB文件
rdbchecksum yes
1.4 RDB 优缺点
优点:
- 性能高,适合大规模数据恢复
- 文件紧凑,适合备份和灾难恢复
- 最大化 Redis 性能(父进程不需要磁盘IO)
缺点:
- 可能丢失最后一次快照后的数据
- 大数据集时 fork 过程较慢
2. AOF 持久化
2.1 AOF 概述
AOF(Append Only File)通过记录所有写操作命令来持久化数据,以文本格式记录操作日志
2.2 AOF 工作原理
+----------------+ 命令追加 +----------------+ 同步磁盘 +----------------+
| Redis进程 | -------------> | AOF缓冲区 | -------------> | AOF文件 |
| | | | | (appendonly.aof)
+----------------+ +----------------+ +----------------+
工作流程:
- 执行写命令后将命令追加到 AOF 缓冲区
- 根据同步策略将缓冲区内容写入 AOF 文件
- 定期重写 AOF 文件以压缩体积
2.3 AOF 重写机制

2.4 AOF 配置
# redis.conf 配置文件
# 开启AOF
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# AOF同步策略
# appendfsync always # 每个命令都同步,最安全但性能差
appendfsync everysec # 每秒同步一次,推荐配置
# appendfsync no # 由操作系统决定,性能最好但可能丢失数据
# AOF重写配置
auto-aof-rewrite-percentage 100 # 当前AOF文件比上次重写后大小增长100%时重写
auto-aof-rewrite-min-size 64mb # AOF文件至少64MB时才重写
# 加载AOF时遇到错误是否继续
aof-load-truncated yes
2.5 AOF 优缺点
优点:
- 数据安全性更高,最多丢失1秒数据
- AOF文件易读,可手动修改
- 支持后台重写,不影响客户端请求
缺点:
- 文件体积通常比RDB大
- 恢复速度比RDB慢
- 性能略低于RDB
3. RDB 与 AOF 对比
| 特性 | RDB | AOF |
|---|---|---|
| 持久化方式 | 快照 | 日志 |
| 数据安全性 | 可能丢失分钟级数据 | 最多丢失1秒数据 |
| 文件大小 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
| 性能影响 | fork时可能阻塞 | 同步时可能阻塞 |
| 数据可读性 | 二进制,不可读 | 文本,可读 |
4. 主从复制
4.1 主从复制概述
Redis 主从复制允许将一台 Redis 服务器的数据复制到多台从服务器,实现数据冗余和读写分离
4.2 主从复制架构
+----------------+ 复制命令 +----------------+
| Redis主节点 | <-------------> | Redis从节点1 || (可写可读) | | (只读) |+----------------+ +----------------+|| 复制命令|+----------------+| Redis从节点2 || (只读) |+----------------+
4.3 主从复制工作原理

详细流程:
1. 连接建立:从节点连接主节点,发送 SYNC 或 PSYNC 命令
2. 全量同步:主节点执行 BGSAVE 生成 RDB 文件发送给从节点
3. 部分同步:2.8+版本支持 PSYNC,根据复制偏移量进行增量同步
4. 命令传播:主节点持续将写命令发送给从节点
4.4 主从复制配置
方式一:配置文件方式
主节点配置(redis-master.conf):
# 主节点配置
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis_6379.log"
dir /var/lib/redis/6379
# 持久化配置
save 900 1
save 300 10
save 60 10000
# 如果需要密码验证
# requirepass yourpassword
从节点配置(redis-slave.conf):
# 从节点配置
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/var/log/redis_6380.log"
dir /var/lib/redis/6380
# 配置主节点
slaveof 127.0.0.1 6379
# 如果主节点有密码
# masterauth yourpassword
# 从节点是否只读(默认yes)
slave-read-only yes
# 复制超时时间
repl-timeout 60
# 从节点落后主节点时是否允许读
slave-serve-stale-data yes
方式二:命令行方式(重启服务器需要重新建立主从)
# 启动Redis实例
redis-server --port 6379 &
redis-server --port 6380 &
# 将6380配置为6379的从节点
redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
# 查看复制状态
127.0.0.1:6380> INFO replication
具体的启动方式因项目的redis架构设计而不同,核心方式:分别启动主从redis服务器(可以同ip不同port,也可以是不同ip),之后按照上述方式设置主从即可
4.5 主从复制验证
检查复制状态
# 在主节点查看
redis-cli -p 6379
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=xxx,lag=0
# 在从节点查看
redis-cli -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
测试数据同步
# 在主节点写入数据
127.0.0.1:6379> SET key1 "hello"
OK
127.0.0.1:6379> HSET user:1 name "John" age 30
(integer) 2
# 在从节点读取数据
127.0.0.1:6380> GET key1
"hello"
127.0.0.1:6380> HGETALL user:1
1) "name"
2) "John"
3) "age"
4) "30"
# 从节点不允许写入
127.0.0.1:6380> SET key2 "world"
(error) READONLY You can't write against a read only slave.
4.6 主从复制管理命令
# 查看复制信息
INFO replication
# 手动执行同步
SLAVEOF host port # 设置为指定主节点的从节点
SLAVEOF NO ONE # 停止复制,升级为主节点
# 控制复制流程
DEBUG SEGFAULT # 模拟主节点崩溃(测试用)
SHUTDOWN # 安全关闭Redis
4.7 主从复制优化配置
# 主节点配置优化
repl-backlog-size 1mb # 复制积压缓冲区大小
repl-backlog-ttl 3600 # 复制积压缓冲区存活时间
min-slaves-to-write 1 # 至少N个从节点连接时才允许写入
min-slaves-max-lag 10 # 从节点延迟不超过N秒
# 从节点配置优化
repl-ping-slave-period 10 # 从节点ping主节点频率
repl-timeout 60 # 复制超时时间
repl-disable-tcp-nodelay no # 是否启用Nagle算法
5. 完整的主从复制部署示例
5.1 环境准备
# 创建目录结构
mkdir -p /redis/{6379,6380,6381}/{data,logs,conf}
# 准备配置文件
cp redis.conf /redis/6379/conf/
cp redis.conf /redis/6380/conf/
cp redis.conf /redis/6381/conf/
5.2 配置文件定制
主节点 (6379):
# /redis/6379/conf/redis.conf
port 6379
daemonize yes
pidfile /redis/6379/data/redis_6379.pid
logfile "/redis/6379/logs/redis.log"
dir /redis/6379/data/
dbfilename dump_6379.rdb
appendonly yes
appendfilename "appendonly_6379.aof"
从节点1 (6380):
# /redis/6380/conf/redis.conf
port 6380
daemonize yes
pidfile /redis/6380/data/redis_6380.pid
logfile "/redis/6380/logs/redis.log"
dir /redis/6380/data/
dbfilename dump_6380.rdb
appendonly yes
appendfilename "appendonly_6380.aof"
slaveof 127.0.0.1 6379
slave-read-only yes
从节点2 (6381):
# /redis/6381/conf/redis.conf
port 6381
daemonize yes
pidfile /redis/6381/data/redis_6381.pid
logfile "/redis/6381/logs/redis.log"
dir /redis/6381/data/
dbfilename dump_6381.rdb
appendonly yes
appendfilename "appendonly_6381.aof"
slaveof 127.0.0.1 6379
slave-read-only yes
5.3 启动集群(可以在/etc/rc.d/rc.local配置开机启动)
# 启动所有节点
redis-server /redis/6379/conf/redis.conf
redis-server /redis/6380/conf/redis.conf
redis-server /redis/6381/conf/redis.conf
# 验证集群状态
redis-cli -p 6379 INFO replication | grep -E "role|connected_slaves"
redis-cli -p 6380 INFO replication | grep -E "role|master"
redis-cli -p 6381 INFO replication | grep -E "role|master"
6. 故障处理与监控
6.1 常见问题排查
# 检查主从连接状态
redis-cli -p 6379 INFO replication
# 查看日志文件
tail -f /redis/6379/logs/redis.log
tail -f /redis/6380/logs/redis.log
# 网络连通性测试
redis-cli -h 127.0.0.1 -p 6379 PING
# 检查复制延迟
redis-cli -p 6380 INFO replication | grep lag
6.2 主从切换(重启服务器后会优先按照redis.conf中配置重新建立主从关系)
# 当主节点故障时,提升从节点为主节点
redis-cli -p 6380 SLAVEOF NO ONE
# 将其他从节点指向新的主节点
redis-cli -p 6381 SLAVEOF 127.0.0.1 6380