Redis百万级别数据迁移
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan
【前言】
我们是做的国外的项目,最开始的时候调研在国外亚马逊云在可靠性等方面还是具有很大优势,于是我们的项目都部署在亚马逊云上;
我们业务发展十分不错,随着项目越来越大,用到的机器越来越多,同时亚马逊的成本也在不断攀升;最近一段时间我们又针对国外市场进行了各方面(成本,可靠性等)进行调研,最终决定将所有业务及数据从亚马逊云迁移至阿里云;当然迁移也是个有挑战的事情;要做到不能出任何差错,各个技术团队配合(运维负责进行环境搭建,数据迁移;开发负责各个工程的检查;测试负责回归测试.....)
今天与大家分享的是我们数据迁移其中的一部分Redis数据迁移的一种备用方案;
【迁移方法】
一、数据量:
数据条数:550万+,数据大小:450MB
二、迁移:
1、亚马逊自带redis--->阿里云自带redis
2、自带redis和自建redis区别:自带redis是云服务器上本身应用,自建redis是在云服务器上自己安装redis服务;自带redis的优点:可靠,省事,出故障后恢复快;自建redis优点:可控;
3、Redis迁移标准:(1)数据不能丢失错乱;(2)迁移时间必须够快(按照整体迁移的进度来看,redis迁移必须控制在一个半小时以内);
三、两种方案及实现:
1、两种方案:
(1)Redis自带备份恢复策略---rdb(具体实现大家可以参考(《Cash Loan(十):查看redis的Value值大小》))
(2)通过程序(python 版本2.x,如果是3.x版本可以参考《使用python3自带工具2to3.py 转换 python2.x 代码 到python3》)
#!/usr/bin/env python
# -*- coding:utf-8 -*-# 把redis里面一个数据库的东西,迁移到另外一个数据库里面
# 建立两个redis连接
# 获取到所有的key .keys()
# 判断key的类型 string\hash\list\setimport redis
#redis_from源数据,redis_to目标数据 redis_from——>redis_to
redis_from = redis.StrictRedis(host='ip',port=6379,password='',db=10)
redis_to = redis.StrictRedis(host='ip',port=6379,password='',db=10)if __name__ == '__main__':cnt = 0scnt = 0lcnt = 0setcnt = 0hcnt = 0for k in redis_from.keys():# 循环keys里面每一个keydata_type = redis_from.type(k)# 判断key的类型 string\hash\list\setif data_type == 'string':v = redis_from.get(k)t = redis_from.ttl(k)redis_to.set(k, v)if int(t) > 0:redis_to.expire(k,t)scnt = scnt + 1elif data_type == 'list':values = redis_from.lrange(k, 0, -1)t = redis_from.ttl(k) redis_to.lpush(k, values)if int(t) > 0:redis_to.expire(k,t)lcnt = lcnt + 1elif data_type == 'set':values = redis_from.smembers(k)t = redis_from.ttl(k)redis_to.sadd(k, values)if int(t) > 0:redis_to.expire(k,t)setcnt = setcnt + 1elif data_type == 'hash':hcnt = hcnt + 1keys = redis_from.hkeys(k) for key in keys:value = redis_from.hget(k, key)t = redis_from.ttl(k)redis_to.hset(k, key, value)if int(t) > 0:redis_to.expire(k,t)else:print 'not known type'print data_typefile_object = open('/data/thefile.txt','a+')file_object.write(data_type)file_object.write('\n')file_object.close( )cnt = cnt + 1print 'total', cntprint 'string', scntprint 'list', lcntprint 'set', setcntprint 'hash', hcnt
(3)两种方案各自优点:
①rdb方案:简单,速度快,可靠性高
②程序方案:rdb不能用的情况下备胎
2、最终方案确认
(1)考虑到各个方面肯定是rdb方案是首选,遇到问题:
当时运维初步研究发现亚马逊自带Redis不支持导出rdb文件,而且阿里云自带的redis不支持rdb文件导入;
(2)直接用程序将亚马逊云的自带redis数据读到阿里云自带redis中,遇到问题:
数据量大,时时刻刻需要跨网传输,需要时间长;
(3)经过和运维一起沟通,确定一种解决方案:
①在亚马逊上搭一个自建redis;
②通过程序将生产自带redis值读到自建redis;
③备份亚马逊自建redis的rdb文件,拷贝并恢复到阿里云的自建redis上;
④通过阿里云自带redis-sync-manager工具将阿里云的自建redis数据迁移至阿里云自带redis;
(4)最终多次用最终方案做实验,发现将550W+线上数据从亚马逊云自带redis同步到阿里云自带redis中用时1.2小时左右符合预期目标;
(5)实验中的个小疑惑:同步完后在阿里云自带redis中查看发现总少几万个key;通过将redis同步前后的key值导出来(参考《Cash Loan(十):查看redis的Value值大小》)对比发现少的这几万个key正好是失效时间在1.2小时内的。
(6)后来运维进行深入研究后发现亚马逊云自带redis和阿里云自带redis都支持rdb文件的导入和导出,所以我们最终的方案是第一种方案用rdb方案进行备份和恢复,以上说的方案则为第二备用方案。
【总结】
1、大数据时代已然来临,处理大数据量越来越成为我们程序员必须面对;
2、不断迎接新的挑战,增加自身能力。
Redis百万级别数据迁移相关推荐
- easyexcel导出百万级数据_百万级别数据Excel导出优化
这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出. 笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现了服务 ...
- JAVA使用POI如何导出百万级别数据
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...
- 如何优化百万级别数据导出(excel 文件)
如何优化百万级别数据导出(excel 文件) 背景 未优化前存在的问题 业务接口流程 优化后 业务接口流程(优化版v1) 业务接口流程(优化版v2) 优化效果 复盘 宏观层面 遇到的困难 收获 代码实 ...
- 基于easyexcel的MySQL百万级别数据的excel导出功能
前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在U ...
- redis集群数据迁移方式、宕机
数据迁移方式 转载:https://blog.csdn.net/tianpeng341204/article/details/78963850 Redis Cluster数据分片机制 基础概念 集群: ...
- redis 版本升级及数据迁移
https://github.com/redis/redis/security/advisories/GHSA-3qpw-7686-5984 Redis版本升级的新功能优化 - 米扑博客 redis ...
- Redis中的数据迁移
因为key 和slot 的关系是永远不会变的,当新增了节点的时候,需要把原有的slot分配给新的节点负责,并且把相关的数据迁移过来. 添加新节点(新增一个7297): redis-cli --clus ...
- oracle删除重复数据-百万级别数据以上情况
1.先创建临时表,把重复数据的分组条件,rowid添加到临时表 create table tb1 as select tb.c1,tb.c2 ,max(ROWID) dataid FROM tb ...
- 爬取贝壳和房天下——北京二手房在售和已成交百万级别数据(附详细思路和部分源码)
前言 在港校做RA期间,本周老师安排了爬取国内二手房的交易网站,我先调研对比了各平台,之后选取了房天下和贝壳的数据进行爬取 贝壳 房天下 贝壳需要注册登录才能访问,房天下不需要 因课题保密的要求,数据 ...
最新文章
- 如何优雅地保留两位有效数字,又规避末尾出现多余的“0”?
- PHP获取客户端和服务器IP地址
- FM之NUMERIC_CHECK
- eclipse取消空格补全
- linux 文件同步脚本,Linux rsync同步文件脚本
- PHP工具箱无法启动Mysql问题
- 拔丝芋头的Java学习日记--Day6
- oppo小布机器人_看这一篇就够了,1分钟带你了解OPPO小布的隐藏玩法!
- mysql添加索引报错1170 -BLOB/TEXT column ‘xx‘ used in key specification without a key length分析及解决
- 如何写好 5000 行的 SQL 代码
- 【Linux命令】ip addr、ip link、ifconfig 用法 二
- 思迈特Smartbi数据填报功能
- 计算机专业的学生答辩稿,计算机专业毕业论文答辩自述稿范文
- 既没有定义JAVA_HOME,也没有定义JRE_HOME环境变量 运行该程序至少需要这些环境变量中一个
- DophinScheduler ui部分 核心代码详细解析续集——前端组件的代码综合分析
- linux mint安装金山快盘
- 蓝桥杯算法提高 高精度除高精度
- java学习笔记:全部,txt版本
- 为什么航班停在远机位?
- 英语口语259之每日十句口语
热门文章
- 五年烧光 3.5 亿美金,互联网独角兽是如何把自己玩死的?
- 女生,到底能不能当程序员?
- Windows 10 终于干掉了 Windows 7!
- 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?
- 曾经的 Java IDE 王者 Eclipse 真的没落了?21 款插件让它强大起来!
- java四大模块_Spring框架七大模块
- java数组存入mysql_将数组存入数据库的解决方法及用VC与数据库交互
- JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)
- python注册登录+mysql_Flask+MySql实现用户登录注册
- oracle 错误 28002,Oracle下ORA-28002错误处理