Redis开发与运维:数据迁移
2019-10-11 19:28
1116 查看
问题
最近项目重构,提前想把一台上的redis实例转移到另一台redis实例上。
源redis数据库:阿里云Redis、VPC网络、Server版本2.8.19 目标数据库:阿里云Redis、VPC网络、Server版本4.0.11
前提:
当前我们使用Redis作为我们的数据库(永久+ 临时缓存)
目标:
把当前永久性数据导入到目标数据库,临时缓存数据不做处理
方案
设置主从复制,这个应该是比较稳妥的方案,但是支持主从必须3.0以上 -- 这个方案否掉了 那就使用键迁移命令,查了一下三种方式:move 、dump + restore 、migrate
自测
Windows服务器,下载了源数据库 redis2.8.19 分别启用了两个实例分别是 6999和7999 源数据 6999,目标数据 7999
move
这个命令是做实例内,db迁移的,对于当前实例间同步是不满足的。
但也不妨尝试一下:
db5中的键移到db6,
localhost:6999[5]> get QianBiTou:VC:Config "0x001,1,2,3" localhost:6999[5]> move QianBiTou:VC:Config 6 (integer) 1 localhost:6999[5]> get QianBiTou:VC:Config (nil)
移动嘛所以db5的键就没了,db6才能获取到
localhost:6999[5]> SELECT 6 OK localhost:6999[6]> get QianBiTou:VC:Config "0x001,1,2,3"
dump + restore
1、源数据库上:dump 相当于把这个键按照协议序列化
localhost:6999[6]> get QianBiTou:VC:Config "0x001,1,2,3" localhost:6999[6]> DUMP QianBiTou:VC:Config "\x00\x0b0x001,1,2,3\x06\x00\xfb\x06ZUn\xde\xb5\x95"
2、目标数据库上:restore 进行初始化这个键
127.0.0.1:7999[2]> RESTORE QianBiTou:VC:Config 0 "\x00\x0b0x001,1,2,3\x06\x00\xfb\x06ZUn\xde\xb5\x95" OK 127.0.0.1:7999[2]> GET QianBiTou:VC:Config "0x001,1,2,3"
这个方案呢,可行但是看了一下第三个,感觉第3个是2的改进版本
migrate
localhost:6999[6]> help migrate MIGRATE host port key destination-db timeout [COPY] [REPLACE] summary: Atomically transfer a key from a Redis instance to another one. since: 2.6.0 group: generic
从这到那:127.0.0.1:6999 -> 127.0.0.1:7999 key=QianBiTou:VC:Config
1、看看源数据库6999,db6这个key的值。嗯,有值。
localhost:6999[6]> get QianBiTou:VC:Config "0x001,1,2,3"
2.、再看看目标数据库,把这个key清场.
127.0.0.1:7999[2]> GET QianBiTou:VC:Config "0x001,1,2,3" 127.0.0.1:7999[2]> DEL QianBiTou:VC:Config (integer) 1 127.0.0.1:7999[2]> GET QianBiTou:VC:Config (nil)
3.、准备好了,那就开始转吧,走你
localhost:6999[6]> get QianBiTou:VC:Config "0x001,1,2,3" localhost:6999[6]> MIGRATE 127.0.0.1 7999 QianBiTou:VC:Config 2 5000 OK
4、看看目标机器上过来了木有
en, 过来了
127.0.0.1:7999[2]> GET QianBiTou:VC:Config "0x001,1,2,3"
5.、再看看源数据库
e...没啦?
localhost:6999[6]> get QianBiTou:VC:Config (nil)
再进一步
查阅资料发现,MIGRATE = dump + restore + del ,因为它是原子性的所以推荐使用这个方法。 但是会把原来的数据删掉,类似于跨实例move。文档中 加上copy和replace 参数就不会删除源数据了。
copy 复制
replcae 复制并替换
1.、再试试,数据重新加回去
localhost:6999[6]> set QianBiTou:VC:Config 0x001,1,2,3 OK localhost:6999[6]> MIGRATE 127.0.0.1 7999 QianBiTou:VC:Config 2 5000 replace (error) ERR wrong number of arguments for 'migrate' command
2.、报错了,再查查官方资料。好吧,还是版本不支持:
COPY and REPLACE are available only in 3.0 and above. KEYS is available starting with Redis 3.0.6. AUTH is available starting with Redis 4.0.7.
最终方案
1、主从 --不行,版本低了
2、MOVE-- 不行,实例内,数据没了
3、 MIGRATE --不行,实例间,版本不行+数据没了
4、 dump + restore 这个算是最终方案
方案可行性:因为不涉及缓存数据,是永久数据的导出导入,所以不存在原子性问题,还有忘记了一点数据量非常小
执行方案
[TestMethod] public async Task RestoreToOtherRedis_Test() 1961 { // 源redis string sourceRedis = "r-xxxxxxxxxxxpd.redis.rds.aliyuncs.com:6379,password=uuuuuu,defaultDatabase=5,prefix="; //目标redis string targetRedis = "r-xxxxxxxxxxxxpd.redis.rds.aliyuncs.com:6379,password=uuuuuu,defaultDatabase=5,prefix="; List<string> keys = new List<string>(); try { using (var sourceClient = new CSRedis.CSRedisClient(sourceRedis)) { // key 很少的时候使用cmd: keys * // 建议使用 scan keys = sourceClient.Keys("*").ToList(); using (var targetClient = new CSRedis.CSRedisClient(targetRedis)) { foreach (var key in keys) { if (key.StartsWith("RedisCach")) continue; // 序列化数据 var dump = sourceClient.Dump(key); // 初始化数据 var ok = targetClient.Restore(key, dump); } } } } catch (Exception ex) { string msg = ex.ToString(); } finally { }
验证
事后验证了一下,确实数据过来了
注意点
MOVE 实例内 MIGRATE 原子操作。最好使用copy和replace 参数源数据不删除。 DUMP + RESTORE 不是原子操作
相关文章推荐
- Redis开发与运维 (数据库技术丛书) PDF 下载,深度剖析Hadoop HDFS (大数据技术丛书) PDF 下载
- 电商平台技术架构 多用户商城 仿天猫 淘宝 亚马逊 当当 阿里巴巴 大数据模块 低成本运维 高效开发
- Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?
- 将MySQL数据迁移到Redis
- MySQL数据库数据迁移到Redis的具体操作
- 迁移数据到Redis Cluster
- 初学乍练redis:使用redis-migrate-tool做redis在线数据迁移
- 《Oracle DBA工作笔记:运维、数据迁移与性能调优》 PDF 下载
- Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?
- CrazyWing:Python自动化运维开发实战 七、Python数据类型之数字
- CrazyWing:Python自动化运维开发实战 九、Python数据类型之列表
- Devops-运维效率之数据迁移自动化
- DTS开发记录(9)-- 数据迁移任务 DataTask
- 大数据架构开发 挖掘分析 Hadoop HBase Hive Flume ZooKeeper Storm Kafka Redis MongoDB Scala Spark 机器学习 Docker 虚拟化
- JAVAWEB开发之redis学习(十一)——redis运维相关(主从复制以及AOF、RDB的配置、后台运维命令)
- APP后台开发运维与架构实践 7 :Redis---App后台高性能的缓存系统
- Python运维项目中用到的redis经验及数据类型 推荐
- Django开发运维后台(三):利用ListView分页显示数据
- Java - 采用redis缓存数据[redis客户端开发]
- PgSQL · 内核开发 · 利用一致性快照迁移你的数据