Redis不停机数据迁移:基于 redis-shake 的跨实例 / 跨集群同步方案

Redis 不停机数据迁移实战:基于 redis-shake 的跨实例 / 跨集群同步方案

前言

本文介绍使用阿里云开源的redis-shake工具,实现Redis的不停机数据迁移。该工具支持多种部署架构(单机、主从、集群、Sentinel集群),并能自动同步增量数据,最大程度降低迁移风险。

对比使用主从复制等其他方式来做数据迁移,用redis-shake会方便简单很多。

https://github.com/tair-opensource/RedisShake

1. 方案概述

1.1 工具简介

redis-shake是阿里云开源的一款Redis数据同步工具,支持数据迁移、数据同步、数据校验等功能。它通过模拟Redis复制协议,从源实例读取数据并写入目标实例,实现全量+增量同步。

1.2 适用场景

  • 新Redis版本 >= 旧Redis版本
  • 新旧Redis实例地址不同(跨实例/跨集群迁移)
  • 需要不停机迁移,保证业务连续性
  • 数据量从中等到大型(GB到TB级别)
  • 支持单机、主从、集群、Sentinel集群等多种部署架构

1.3 方案优点

  • 自动同步增量数据:全量同步完成后,自动进入增量同步状态,持续监听源实例变更
  • 风险最低:迁移过程不影响源实例服务,仅在最终切流时有秒级延迟
  • 支持数据校验:可配置数据一致性校验(需额外配置)
  • 简单易用:配置清晰,操作步骤少

2. 前置准备

  1. 环境要求 :确保已准备好源Redis目标Redis实例
  2. 网络互通:确保同步机器可同时访问源和目标实例(默认端口6379,Sentinel为26379)
  3. 权限准备:确保有访问Redis的权限(密码、ACL等)
  4. 资源评估:根据数据量评估同步时间,确保目标实例有足够存储空间

3. 迁移步骤详解

3.1 下载并解压redis-shake

在可同时访问源和目标实例的机器上执行:

bash 复制代码
# 下载redis-shake(版本可根据需要调整)
wget https://github.com/tair-opensource/RedisShake/releases/download/v4.4.2/redis-shake-v4.4.2-linux-amd64.tar.gz

# 解压
tar -zxvf redis-shake-v4.4.2-linux-amd64.tar.gz

3.2 编辑配置文件

配置文件shake.toml包含源和目标实例的连接信息。根据架构不同,配置有所差异。

3.2.1 场景一:迁移Sentinel管理的Redis集群

如果Redis由Sentinel管理,需从Sentinel获取主节点信息。

步骤1:获取Sentinel信息

源集群目标集群的任意Sentinel节点执行:

bash 复制代码
# 查看Sentinel进程
ps aux | grep redis-sentinel

# 连接Sentinel,查看master信息(命令需要看你们自己安装的目录是什么,我这里的仅供参考)
/opt/redis/bin/redis-cli -h <sentinel_ip> -p 26379
SENTINEL masters

name下面的就是名称,我这里是mymaster

记录master_name和Sentinel地址(如172.10.10.207:26379)。

步骤2:编辑配置文件

bash 复制代码
vi shake.toml
toml 复制代码
[sync_reader]
cluster = false
address = "" # 源端 Redis 的地址会从 Sentinel 中获取
#username = ""
#password = ""
tls = false
[sync_reader.sentinel]
master_name = "mymaster" # master_name
address = "172.10.10.207:26379" # Sentinel地址
username = ""
password = ""
tls = false

[redis_writer]
cluster = false
address = "" # 目标端 Redis 的地址会从 Sentinel 中获取
#username = ""
#password = ""
tls = false
[redis_writer.sentinel]
master_name = "mymaster" # master_name
address = "172.10.10.128:26379" # Sentinel地址
username = ""
password = ""
tls = false
3.2.2 场景二:迁移单节点/主从节点

直接连接Redis主节点配置(如果配置了主从,则填写的是各自的主节点地址):

bash 复制代码
vi shake.toml
toml 复制代码
[sync_reader]
cluster = false
address = "源Redis地址:6379"         # 示例:"127.0.0.1:6379"
#username = "admin"                  # 如启用ACL
#password = "123456"                 # 认证密码

[redis_writer]
cluster = false
address = "目标Redis地址:6379"       # 示例:"172.10.10.128:6379"
#username = "admin"
#password = "123456"

3.3 启动同步任务

配置完成后,启动同步:

bash 复制代码
./redis-shake shake.toml

说明

  • 该命令在前台运行,输出同步日志
  • 先进行全量数据同步 ,完成后自动进入增量同步状态
  • 增量阶段会持续同步源实例的写入操作
  • 准备切流时,可手动停止进程(Ctrl+C)

3.4 验证迁移结果

3.4.1 连接Redis实例
bash 复制代码
# 连接Redis(如配置主从,连接主节点)
/opt/redis/bin/redis-cli -h <host> -p <port> -a <password>

# 查看主从信息
info replication
3.4.2 写入测试数据(源实例)
bash 复制代码
# 生成测试数据
SADD friends "张三" "李四" "王五"
EVAL "for i=1,100 do redis.call('SET', 'key:'..i, 'value'..i) end" 0
EVAL "for i=1,50 do redis.call('HSET', 'product:'..i, 'name', '商品'..i, 'price', i*10, 'stock', 100) end" 0
3.4.3 验证数据同步(目标实例)
bash 复制代码
# 查看key数量
dbsize

# 抽样检查(避免使用 keys *,大数据量会阻塞)
GET key:1
HGETALL product:1
SMEMBERS friends

# 查看keyspace信息
info keyspace

4. 注意事项与排查建议

4.1 关键注意事项

  1. 网络与带宽:同步过程会占用网络带宽,建议在业务低峰期进行
  2. 资源监控:监控源和目标实例的CPU、内存使用率
  3. 数据一致性:可在业务低峰期进行数据校验
  4. 版本兼容:确保redis-shake版本与Redis版本兼容(本文使用Redis 7.0.4 + redis-shake v4.4.2)
  5. 切流流程
    • 保持增量同步一段时间(如24小时)
    • 暂停写入源实例
    • 等待增量数据完全同步
    • 将业务连接切换到目标实例

4.2 常见问题排查

问题 可能原因 解决方案
连接失败 网络不通/防火墙限制 检查端口连通性,确保6379/26379开放
认证失败 密码错误/ACL配置问题 确认用户名密码,检查requirepass配置
同步缓慢 网络带宽不足/数据量大 监控网络流量,评估同步时间
数据不一致 同步过程中有大量写入 在业务低峰期执行,或启用校验功能

5. 总结

通过redis-shake工具,我们可以实现Redis实例之间的不停机数据迁移,支持从单机到集群、跨集群等多种场景。该工具具有以下优势:

  • 简单易用:配置清晰,上手快速
  • 安全可靠:支持增量同步,最小化业务影响
  • 兼容性好:支持多种Redis部署架构
  • 功能完善:支持数据校验,确保一致性
相关推荐
未羽出衫2 小时前
DB-GPT本地模型+tuGragh安装使用
数据库·gpt
VekiSon2 小时前
数据库——基础概念与 SQLite 实践
数据库·sqlite
点云SLAM2 小时前
Boost中Graph模块中boost::edge_capacity和boost::edge_capacity_t
数据库·算法·edge·图论·最大团·最大流算法·boost库使用
五阿哥永琪2 小时前
Redis的常用数据结构
数据结构·数据库·redis
吃螺丝粉2 小时前
zookeeper权限设置
linux·运维·服务器
代码游侠2 小时前
学习笔记——HTML网页开发基础
运维·服务器·开发语言·笔记·学习·html
猴子年华、2 小时前
【每日一技】:SQL 常用函数实战速查表(函数 + 场景版)
java·数据库·sql·mysql
乾元2 小时前
数据中心流量工程(TE)优化:当 AI 成为解决“维度诅咒”的唯一操纵杆
运维·服务器·网络·人工智能·架构·自动化
java1234_小锋2 小时前
ZooKeeper集群中服务器之间是怎样通信的?
分布式·zookeeper·云原生