先说几个核心判断。单节点Redis在生产中会遇到四个比较头疼的问题:数据有丢失风险、存储能力受限、并发能力有限、故障后自动恢复能力弱。针对这些,业界已经有成熟的应对方案——数据丢失靠持久化到磁盘,存储能力不够就搭分片集群用插槽机制扩容,并发上不去用主从集群搞读写分离,故障恢复则交给哨兵机制自动处理。
先说几个核心判断。单节点Redis在生产中会遇到四个比较头疼的问题:数据有丢失风险、存储能力受限、并发能力有限、故障后自动恢复能力弱。针对这些,业界已经有成熟的应对方案——数据丢失靠持久化到磁盘,存储能力不够就搭分片集群用插槽机制扩容,并发上不去用主从集群搞读写分离,故障恢复则交给哨兵机制自动处理。下面就从持久化开始,把这几块逐一拆开来看。
RDB全称Redis数据备份文件,也叫数据快照。简单理解,就是定时把内存里所有数据完整地拍一张"照片"存到磁盘上。一旦Redis实例挂掉重启,就可以从这张照片里恢复数据。值得注意的是,当你主动关闭Redis时,它也会自动执行一次RDB,算是个保底机制。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
执行RDB有两种方式:
save # 由主进程直接执行,会阻塞所有命令 bgsave # 另起子进程执行,主进程不受影响
实际生产中当然用bgsave,毕竟谁也不想因为备份就让线上请求卡住。Redis内部也预设了自动触发规则,在redis.conf里就能找到:
# 900秒内至少1个key被修改,触发bgsave save 900 1 # 300秒内至少10个key被修改,触发bgsave save 300 10 # 60秒内至少10000个key被修改,触发bgsave save 60 10000 # 注意:如果设置save "",就是彻底禁用RDB,生产环境要慎用
其他几个常用配置也值得留意:
# 是否压缩RDB文件(默认开启)。但压缩会消耗CPU,如今磁盘又不值钱,建议关掉 rdbcompression yes # RDB文件名 dbfilename dump.rdb # 保存目录 dir ./
bgsave的执行逻辑很巧妙:先fork出一个子进程,这个子进程和主进程共享同一份内存数据。子进程负责读取并写入RDB文件,主进程继续处理请求。这里用到了copy-on-write技术——主进程只读操作时直接访问共享内存,只有写操作发生时才会拷贝一份数据再写。这种机制在保证数据一致性的同时,也把性能影响降到了最低。
梳理一下bgsave的完整流程:
但RDB也有硬伤。最明显的是两次RDB之间的间隔可能长达几分钟,这段时间里如果宕机,所有写入的数据都会丢失。另外,fork子进程、压缩、写文件这些操作本身也比较耗时。
AOF的思路和RDB完全不同。它不拍快照,而是把每一次写命令都记录下来。这就带来一个问题——AOF文件通常比RDB大得多,而且同一个key可能被反复修改,但真正有价值的只有最后一次操作。
对此Redis提供了bgrewriteaof命令做重写,用最少命令达到相同效果,从而精简文件体积。
AOF默认是关闭的,需要在redis.conf里手动开启:
appendonly yes # 开启AOF appendfilename "appendonly.aof" # 文件名
最关键的是刷盘策略,决定了数据安全的程度和性能的取舍:
# 每次写命令都立即写入磁盘 appendfsync always # 每秒写入一次(默认) appendfsync everysec # 交给操作系统决定(通常30秒左右) appendfsync no
三种策略的差异很明显:
| 策略 | 同步时机 | 数据安全 | 性能影响 | 适用场景 |
|---|---|---|---|---|
| always | 每次写命令后 | 最高(零丢失) | 最低 | 金融交易、支付系统 |
| everysec | 每秒一次 | 较高(最多丢1秒) | 中等 | 大多数生产环境 |
| no | 由系统决定 | 最低(可能丢30秒+) | 最高 | 缓存、非关键数据 |
另外,Redis也支持AOF的自动重写,阈值可配置:
# 比上次文件增长超过100%则触发重写 auto-aof-rewrite-percentage 100 # 文件最小体积超过64MB才触发 auto-aof-rewrite-min-size 64mb
两个方案各有千秋,如果对数据安全性要求很高,实际开发中通常会两者结合起来用:
| 对比维度 | RDB | AOF |
|---|---|---|
| 持久化方式 | 定时对整个内存做快照 | 记录每一次执行的命令 |
| 数据完整性 | 不完整,两次备份之间会丢失 | 相对完整,取决于刷盘策略 |
| 文件大小 | 有压缩,体积小 | 体积很大 |
| 宕机恢复速度 | 很快 | 慢 |
| 数据恢复优先级 | 低 | 高 |
| 系统资源占用 | 高(fork子进程) | 低(主要是磁盘IO,但重写时也高) |
| 使用场景 | 可容忍数分钟丢失,追求启动速度 | 对数据安全性要求高 |
单节点的并发能力是有上限的,要突破这个瓶颈就得搭建主从集群,实现读写分离。
具体搭建方式这里不再展开。
主从同步的核心在于master判断slave是不是第一次来同步。这里有两个关键概念:
所以slave做数据同步时,必须向master声明自己的replid和offset,这样master才能判断到底该同步哪些数据。
一、全量同步(第一次同步)

结合两个核心概念后,流程更清晰:

全量同步的完整流程:
二、增量同步(slave重启后)

但repl_baklog有大小限制,写满后会覆盖旧数据。如果slave断开太久,导致未同步的数据被覆盖,那就只能再来一次全量同步了。
优化主从集群的几个建议:
repl-diskless-sync yes,启用无磁盘复制,避免全量同步时的磁盘IO瓶颈
全量同步和增量同步的本质区别:
以上就是关于Redis持久化和主从集群的核心内容。从单节点的问题出发,我们看到了RDB和AOF这两种持久化方案各自的优缺点和适用场景,也了解了主从集群如何通过全量同步和增量同步来保证数据一致性。实际部署时,结合业务对数据完整性的要求和性能预算来做取舍,才是最合理的方式。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述