无盘复制是什么
主从首次全量同步时,主库默认先把 RDB 写到本地磁盘再发送给从库。repl-diskless-sync 设为 yes 后,主库直接通过 socket 把 RDB 流式写给从库,不落中间文件,适合磁盘紧张或落盘很慢的实例。配套的 repl-diskless-sync-delay 控制首次同步的等待窗口:主库先等几秒,把随后到达的从库合并进同一次全量传输,避免每个从库都单独触发一次 fork。
基本信息
| 开关 | repl-diskless-sync yes / no |
|---|---|
| 等待窗口 | repl-diskless-sync-delay,默认 5 秒 |
| 收益 | 省掉中间文件与磁盘写入,从库扩容更快 |
| 代价 | 对网络稳定性更敏感,抖动可能整体重来 |
| 接收侧 | 从库可用无盘加载把收到的流直接写内存 |
典型使用场景
- 主库磁盘 IO 慢或容量紧张,落盘快照本身就成了瓶颈
- 云主机本地盘带宽受限,写快照会明显拖慢主库
- 批量扩容多个从库,用等待窗口把它们的首次同步合并
- 主库磁盘写放大明显,希望减少一次全量写盘的字节数
- 演练环境快速搭建主从,缩短从库追赶时间
查看与开启
查看与开启
redis-cli CONFIG GET repl-diskless-sync repl-diskless-sync-delay
redis-cli CONFIG SET repl-diskless-sync yes # 开启无盘复制
redis-cli CONFIG SET repl-diskless-sync-delay 5 # 等待窗口,批量加入时留出合并时间
redis-cli INFO replication | grep -E 'sync_full|sync_partial_ok' # 观察全量同步次数
tail -f /var/log/redis/redis.log | grep -i diskless # 看是否走了无盘路径参数与取舍
| 参数 | 默认值 | 作用与建议 |
|---|---|---|
| repl-diskless-sync | no | 开启后不落中间文件,磁盘紧张时收益最明显 |
| repl-diskless-sync-delay | 5 秒 | 等待更多从库加入同一轮,从库很少时可适当调小 |
| repl-diskless-load | disabled | 从库侧的接收方式,需按版本支持情况确认 |
| sync_full 计数 | 累计值 | 持续增长说明全量同步频繁,要查断连原因 |
等待窗口内第一个到达的从库必须等够时间才开始同步,从库数量少或扩容是单台时,把窗口调到 0 可以更快开始,代价是失去合并机会。
无盘复制要求传输链路稳定,网络抖动导致传输失败时整轮要重来,可靠性优先的场景里传统落盘模式反而更稳。