Redis开发与运维:数据迁移

问题

最近项目重构,提前想把一台上的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()
        {
            // 源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 不是原子操作

原文地址:https://www.cnblogs.com/sunchong/p/11656285.html

时间: 2024-10-24 15:35:11

Redis开发与运维:数据迁移的相关文章

Redis开发与运维 (数据库技术丛书) PDF 下载,深度剖析Hadoop HDFS PDF 下载

1.Redis开发与运维 (数据库技术丛书) PDF 下载 2.深度剖析Hadoop HDFS (大数据技术丛书) PDF 下载 关注微信公众号:职业开发者之路,百度云免费 下载 PDF 电子书籍,或直接访问:问风网:askwinds.com请添加链接描述,免费资源下载模块下载,问风@程序员部落,更多资源分享等你获取关注微信公众号:职业开发者之路,?更多免费资源分享 原文地址:http://blog.51cto.com/2058005/2350798

《Redis开发与运维》

第1章 初识Redis 1. Redis介绍: Redis是一种基于键值对(key-value)的NoSQL数据库. 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).hash(哈希).list(列表).set(集合).zset(有序集合)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景. 而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人. 不仅如此,Redis还可以将内存的数据利用快照(RDB)和日志(AOF)的形式保存到硬盘上,这

redis 开发与运维 学习心得

第一章 初识Redis 1.redis是基于键值对的NoSQL. 2.redis的值可以是 string, hash, list, set, zset, bitmaps, hyperloglog, geo 3.redis的值不仅可以是字符串海鸥可以是具体的数据结构 4.redis的2种持久方案:rdb和aof. 5.redis-server XXX.conf可以以conf的配置启动redis. 6.redis-cli shutdown可以关闭redis. 不要使用kill -9 杀死redis进

Redis开发与运维

常用命令 redis-server启动redis redis-server /opt/redis/redis.conf    配置启动 redis-server --port 6379 --dir /usr/local/data(存放持久化文件和日志文件的目录)   按照参数启动其他配置默认 redis-cli命令行客户端 redis-cli -v  查看redis的版本信息 redis-cli -h {host} -p {port}   交互式方式连接 redis-cli -h {host}

Redis开发与运维:SDS与44字节深入理解

对于上一篇文章,我又自己总结归纳并补充了一下,有了第二篇. 概览 <<左移 开始之前,我们先准备点东西:位运算 i<<n 总结为 i*2^n 所以 1<<5 = 2^5 1<<8 = 2^8 1<<16 = 2^16 1<<32 = 2^32 1<<64 = 2^64 SDS 5种数据类型 Redis 3.2 以后SDS数据类型有5个 #define SDS_TYPE_5 0 #define SDS_TYPE_8 1 #d

Redis开发与运维:linux安装

Linux 安装 我的系统是inux 系统,官网下载 https://redis.io/download redis-5.0.5.tar.gz 解压: 编译安装: 官网和文档说得已经很清楚了,现在就执行编译安装. 安装完成后,验证一下: [email protected]:~$ redis-cli -v redis-cli 5.0.5 因为现在安装后,执行文件直接放到了 /usr/local/bin一份,这样在任何目录下都可以执行命令 现在我们就先关注两个:redis-server(服务端).r

Java架构师成长之道之RabbitMQ开发与运维-基础篇(CSDN版)

Java架构师成长之道之RabbitMQ开发与运维-基础篇(CSDN版) Java架构师成长之道 消息中间件概述 消息是指在不同语言实现的应用间传递的数据,消息可以是文本字符串.JSON,也可以是复杂的内前对象. 消息中间件是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通讯来进行分布式系统集成. 通过提供消息传递和消息排队模型,使得在分布式环境下扩展进程间的通讯. 消息中间件一般有两种传递模式:点对点模式和发布/订阅模式. 点对点是基于队列的,消息生产者将消息发送到消息队列,

Open edX 学习、开发、运维相关链接整理

http://edustack.org/manual/edx/ Open edX 学习.开发.运维相关链接整理 http://edustack.org/manual/edx/open-edx-%E5%AD%A6%E4%B9%A0%E3%80%81%E5%BC%80%E5%8F%91%E3%80%81%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3%E9%93%BE%E6%8E%A5%E6%95%B4%E7%90%86/

近千节点的Redis集群运维经验总结

分享一篇好文章 redis越来越实用了 服务器宕机并恢复后,需要重启Redis实例,因为集群采用主从结构并且宕机时间比较长,此时宕机上的节点对应的节点都是主节点,宕掉的节点重启后都应该是从节点.启动Redis实例,我们通过日志发现节点一直从不断的进行主从同步.我们称这种现象为主从重同步. 主从同步机制 为了分析以上问题,我们首先应该搞清楚Redis的主从同步机制.以下是从节点正常的主从同步流程日志: 17:22:49.763 * MASTER <-> SLAVE sync started17: