RedisShake数据同步全量+增量
创作时间:
作者:
@小白创作中心
RedisShake数据同步全量+增量
引用
CSDN
1.
https://blog.csdn.net/weixin_45385457/article/details/137471210
redis-shake数据同步
redis-shake是基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。以下主要介绍同步sync。
- 恢复restore:将RDB文件恢复到目的redis数据库。
- 备份dump:将源redis的全量数据通过RDB文件备份起来。
- 解析decode:对RDB文件进行读取,并以json格式解析存储。
- 同步sync:支持源redis和目的redis的数据同步,支持全量和增量数据的迁移,支持从云下到阿里云云- 上的同步,也支持云下到云下不同环境的同步,支持单节点、主从版、集群版之间的互相同步。需要注意- 的是,如果源端是集群版,可以启动一个RedisShake,从不同的db结点进行拉取,同时源端不能开启- move slot功能;对于目的端,如果是集群版,写入可以是1个或者多个db结点。
- 同步rump:支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移。
基本原理
redis-shake 的基本原理就是模拟一个从节点加入源redis集群,首先进行全量拉取并回放,然后进行增量的拉取(通过psync命令)。
注意事项
- 如果目标库的数据逐出策略(maxmemory-policy)配置为noeviction以外的值,可能导致目标库的数据与源库不一致。关于数据逐出策略详情,请参见Redis数据逐出策略介绍。
- 如果源库中的某些Key使用了过期(expire)机制,由于可能存在Key已过期但未被及时删除的情形,所以在目标库中查看(如通过info命令)到的Key数量会比源库的Key数量少。
- 不要在同一个目录运行两个 RedisShake 进程,因为运行时产生的临时文件可能会被覆盖,导致异常行为。
- 不要降低 Redis 版本,比如从 6.0 降到 5.0,因为 RedisShake 每个大版本都会引入一些新的命令和新的编码方式,如果降低版本,可能会导致不兼容。
说明:源和目标库中,未设置过期机制或未过期的Key数量是一致的。
安装 redis-shake
wget https://github.com/alibaba/RedisShake/releases/download/v3.1.2/redis-shake.tar.gz
mkdir redis-shake
tar xf redis-shake.tar.gz -C redis-shake
创建迁移配置文件
注意:需要找一个磁盘空间大的目录进行迁移
cat >redis-shake.toml<<'EOF'
type = "sync"
[source]
address = "10.10.8.203:6379" # 来源实例的ip及端口
username = "" # 如果不使用ACL,请保持为空
password = "Passw0rd" # 如果不需要密码,请保持为空
tls = false
elasticache_psync = "" # using when source is ElastiCache. ref: https://github.com/alibaba/RedisShake/issues/373
[target]
type = "standalone" # 单机或哨兵写:"standalone",集群写:"cluster"
address = "10.10.8.204:6379" # 新实例的ip及端口
username = "" # 如果不使用ACL,请保持为空
password = "Passw0rd" # 如果不需要密码,请保持为空
tls = false
[advanced]
dir = "data"
ncpu = 4
pprof_port = 0
metrics_port = 0
log_file = "redis-shake.log"
log_level = "info" # debug, info or warn
log_interval = 5 # in seconds
rdb_restore_command_behavior = "rewrite" # panic, rewrite or skip
pipeline_count_limit = 1024
target_redis_client_max_querybuf_len = 1024_000_000
target_redis_proto_max_bulk_len = 512_000_000
EOF
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
注意非单机请参阅官方文档进行配置:https://github.com/alibaba/RedisShake/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%EF%BC%9A%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB
执行redis数据库迁移
nohup ./redis-shake-linux-amd64 redis-shake.toml &
同步完成后停止写入
# 单实例开启只读模式
slaveof 127.0.0.1 6379
# 单实例关闭只读模式
slaveof no one
对比数据
127.0.0.1:6379> select 0
127.0.0.1:6379> DBSIZE
127.0.0.1:6379> select 1
127.0.0.1:6379> DBSIZE
127.0.0.1:6379> select 2
······
127.0.0.1:6379> select 16
127.0.0.1:6379> DBSIZE
切换应用即可
过滤同步
结束运行
单库同步
将0库的数据同步到其他实例的15库
单库同步只需要修改db_id == 0(0代表0库) 和 return 0, 15(15代表15库,这里的0不要修改)即可。
vim /root/redis-shake/filters/swap_db.lua
function filter(id, is_base, group, cmd_name, keys, slots, db_id, timestamp_ms)
if db_id == 0 then
return 0, 15
else
return 1, db_id
end
end
多库同步
将0库同步到14库,将1库同步到15库
多库同步只是在后面加 elseif 条件就可以了,具体操作同单库。
vim /root/redis-shake/filters/swap_db.lua
function filter(id, is_base, group, cmd_name, keys, slots, db_id, timestamp_ms)
if db_id == 0 then
return 0, 14
elseif db_id == 1 then
return 0, 15
else
return 1, db_id
end
end
运行
./redis-shake-linux-amd64 redis-shake.toml /root/redis-shake/filters/swap_db.lua
迁移 redis 流程:
- 开启同步
- 验证同步数据
- 停止应用
- 确认数据一致性
- 应用修改 redis 连接信息
- 开启应用
- 完成迁移
热门推荐
中国移动话费余额与套餐选择的关系及优化策略
查询适马镜头生产日期软件
肺大疱:定义、成因、症状与检查方法全解析
茶香四溢,工作烦恼全抛弃:茶文化与现代办公的完美融合
王者荣耀鲁班七号背景故事深度解析-借用你的身体实验背后的历史演变与悬念
大数据管理与应用:挑战、机遇与实践探索
高瓴资本张磊的 27 条投资理念:选择与谁同行,比终点更重要
员工培训场地布置方案的设计与优化
手机拍照不清晰怎么办?全方位解析原因与解决方案
大学请假制度怎么申请?
室内高尔夫模拟器与室外高尔夫区别在哪儿?模拟高尔夫设备与真实高尔夫一样吗?
躺下高血压,站立低血压?省名中医提醒注意“三个半分钟”
3000玄甲破窦建德十万大军?从史料细节,分析李世民如何打赢虎牢关之战
从"上帝不掷骰子"到量子计算:百年量子理论的悖论与突破
2025北京中考时间已定,本学期还有哪些热点大事?
奥斯卡经典《英国病人》:一部超越了世俗,像诗歌一样唯美的电影
标准解读 | 汽车芯片功能安全GB/T 34590《道路车辆 功能安全》标准解读
中上协发布可持续信息披露指引系列对比分析报告
新速腾雨刷器的更换步骤是怎样的?更换雨刷器时如何选择合适的产品?
商品房交房流程以及如何验房法律法规
小女孩没钱看不起《哪吒2》,电影票价全球大揭秘!
掌握三角形面积计算的四种方法
小学面积难题的关窍,无外乎“等积变换”这四个字
征途手游鬼谷子技巧详解:从定位到技能全攻略
二战的“无条件投降”为何此时提出来?又为何如此重要?
华池县:中央彩票公益金助力革命老区乡村振兴
一针一线绣出香囊新潮流
“捶胸顿足”真能消解胸闷吗?
山水画的艺术风格探析
“如果全球形成中美两国主导的芯片体系,恐怕是一个巨大悲哀”|硅基世界