You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不覆盖数据的情况下向运行中的Redis Sentinel导入RDB文件

问题分析与解决方案

核心错误点

你使用的redis-cli --rdb dump.rdb是将Redis实例的RDB文件导出到本地客户端的命令,并非导入数据到Redis的命令——这就是为什么B集群主节点日志没有数据导入记录,反而出现了RDB生成相关日志的原因(日志里的BGSAVE是为了响应你的导出请求,和导入操作无关)。

无停机导入RDB到Redis Sentinel主节点的步骤

以下操作全程不会中断Redis服务对外处理请求:

  1. 确认B集群主节点身份
    进入B集群的任意Sentinel Pod,执行命令获取当前主节点地址:

    redis-cli -p 26379 SENTINEL get-master-addr-by-name <你的集群名称>
    

    或者直接进入候选主节点Pod,验证角色:

    kubectl exec -it <B集群主节点Pod名称> -- redis-cli info replication | grep role
    

    确保输出为role:master

  2. 将A集群的RDB文件复制到B主节点Pod内
    假设本地已拿到A集群的dump.rdb,执行:

    kubectl cp ./dump.rdb <B集群主节点Pod名称>:/tmp/dump.rdb
    
  3. 执行无停机导入
    进入B主节点Pod,通过管道将RDB内容导入Redis:

    kubectl exec -it <B集群主节点Pod名称> -- bash
    cat /tmp/dump.rdb | redis-cli --pipe
    

    该命令会让Redis从标准输入读取RDB内容并增量导入,过程中不会阻塞服务(大文件可能会有短暂的CPU/IO峰值,但不影响请求处理)。导入完成后,客户端会输出类似All data transferred. Waiting for the last reply...的成功提示。

  4. 验证数据与从节点同步

    • 在B主节点执行redis-cli keys *或业务相关的key查询,确认数据已导入
    • 检查从节点同步状态,进入任意从节点Pod:
      redis-cli info replication | grep -E 'master_link_status|sync_full'
      
      确保master_link_status:up且sync_full:1,说明从节点已同步新数据

灾备流程优化建议

  • 不要手动将RDB复制到Redis的/data目录:Redis仅在启动时会加载该目录下的dump.rdb,运行中不会自动读取,所以你之前的操作无效
  • 可自动化灾备流程:定期从A集群拉取RDB文件,通过上述管道命令自动导入B集群,实现定时数据冗余
  • 若A集群故障前与B集群有网络连通,可考虑用Redis的增量同步(PSYNC)替代全量RDB导入,减少数据传输量

内容的提问来源于stack exchange,提问作者baris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:38:21