从库无盘加载
从库做全量同步时,默认路径是先把主库传来的 RDB 落到磁盘,再从磁盘加载进内存。repl-diskless-load 允许直接读入内存,省掉一次磁盘往返;代价是加载期间旧数据与新数据会同时占用内存,可用内存算不过来就会出大问题。
基本信息
| 取值 | disabled / on-empty-db / swapdb |
|---|---|
| 默认值 | disabled,即先落盘再加载 |
| 收益 | 免去磁盘往返,全量同步更快 |
| 成本 | 加载期间内存占用接近双份 |
典型使用场景
- 从库磁盘性能受限(云盘 IOPS 低)时缩短全量同步时间
- 从库磁盘空间紧张,不想再落一份完整 RDB
- 希望同步期间从库仍能对外提供旧数据(swapdb 模式)
- 演练全量同步耗时,比较不同模式的实际差异
- 内存富余但对磁盘 IO 敏感的实例做同步优化
配置与观察
配置与观察
# 查看当前策略:disabled 表示仍旧先落盘再加载
redis-cli CONFIG GET repl-diskless-load
# on-empty-db:从库为空时直接读进内存
redis-cli CONFIG SET repl-diskless-load on-empty-db
# swapdb:加载期保留旧数据可读,加载完成后再原子切换
redis-cli CONFIG SET repl-diskless-load swapdb
# 全量同步过程与链路状态
redis-cli INFO replication | grep -E 'master_link_status|master_sync_in_progress'取值对照
| 取值 | 行为 | 内存代价 |
|---|---|---|
| disabled | 先落盘再加载 | 低,仅需额外磁盘空间 |
| on-empty-db | 库为空时无盘加载,否则仍落盘 | 加载期接近双份内存 |
| swapdb | 无盘加载并保留旧数据对外服务 | 最高,新旧两份同时在内存 |
| master_sync_in_progress | 是否正在全量同步 | 为 1 时不要重启从库 |
| master_link_status | 与主库的链路状态 | down 表示同步未完成或已断开 |
swapdb 的价值在于加载期间旧数据仍可读、加载完成后一次原子切换;如果业务能接受从库短暂不可读,这个模式带来的双份内存压力就没有必要承担。
内存余量不足时开启无盘加载,可能把从库直接推到 OOM 或被系统杀掉;先按数据集大小核算可用内存,再决定是否固化为配置。