NAS数据迁移初探

阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。相比于传统的存储设备,NAS所具有的高容量、高可靠、多共享等特性是现在诸多企业迫切需要的,能够解决他们对现有系统在性能、扩展性方面的需求。传统解决方案如何上云,第一步就是原始数据的搬迁问题,如何做到不停服无缝搬迁,在很多场景下是非常棘手的问题,下面做简单介绍。

具体的场景是用户的数据在某种存储设备上,我们要将数据搬迁至NAS文件系统。这里还分为静态迁移和动态迁移,静态迁移是指原始数据在迁移期间不会改变,而动态迁移是原始数据一直在更新。相对来说,静态迁移要比动态迁移容易很多。
静态迁移的主要步骤如下:
1. 将原始数据拷贝到NAS。
2. 分别计算原始数据和NAS上数据每个文件的MD5值,全部匹配就结束,如果哪些文件不匹配,重新拷贝之后再进行第2步。

动态迁移的主要步骤如下:
1. 设定一个时间点T1,一般为当前之间。把最后修改时间在T1之前的数据全部拷贝到NAS。
2. 像静态迁移一样,计算MD5值,确保T1之前的文件全部迁移完毕。第二步完工的时间点为T2。根据搬迁的复杂性,T1和T2间隔可能几小时,长的可能数天。
3. 获取最后修改时间在T1和T2之间的所有文件,将这部分文件拷贝到NAS,并做MD5校验。这步完工的时间点为T3。

理想的状态,如果上述动态迁移T2和T3之间的时间非常短的话(比如10分钟),可以考虑在凌晨业务量比较小的时候把业务迁移上云。但在一些特殊场景下,比如原始数据文件特别多(几千万,上亿的小文件),这个时候遍历扫描所有文件的meta信息,获取T1之后修改过的文件就很慢了,比较差的情形T2和T3的差距会有两三天。

如何解决这个问题呢?linux内核从2.6.13版本开始提供一个叫inotify的功能,可以监控文件系统目录级别的改动。在centos下面直接安装inotify-tool这个工具就好了,yum install inotify-tools。要想监控/aaa/bbb目录下面所有的文件改动只需要执行inotifywait -rm /aaa/bbb/ 就可以了,所有的改动都会打印出来。 不过这个又引入了另外一个问题,inotify的内核支持是非常消耗资源的,在64bit系统下面,监控一个目录需要消耗1kB的内存资源,也就是监听1000万的目录就需要10GB的内存。因此在目录特别多的情况下,要合理的控制inotify的监控目录数,必要情况下需要综合运用inotify+目录文件扫描的方法来缩短T2和T3的时间间隔。

下面针对NAS的特性讲讲具体应该怎么拷贝数据。NAS目前支持NFSv3、NFSv4.0和SMB协议(最后一个目前正在公测中),这些协议都是标准的文件访问协议,即只要用上述协议挂载上了NAS之后,就和读写本地盘没有差别了。NAS和本地盘最大的区别在于支持高并发、多共享,所以如果条件允许,数据上传需要做到多线程、多机并发拷贝。

下面通过几个例子,简单介绍在目前的条件限制下如何快速迁移数据到NAS:
Case 1: 原始数据在ECS的云盘上
这种情况是所有数据搬迁中最简单的,由于数据已经在云上,只不过是把他们从云盘搬到NAS。第一步挂载NAS文件系统,第二步多线程并发拷贝。SSD云盘的读取速度能够到300MB/s,NAS根据所购买的存储包和实际使用容量,带宽从100MB/s到560MB/s不等。具体参考这里

Case 2: 原始数据在阿里云OSS上
这种情况需要借助OSS提供的SDK,移步这里。主要思路也是并发拷贝,一个线程把oss一个bucket下面的object的key列出来,然后同时起多个线程读取oss的object写入nas。

Case 3: 数据在客户IDC,NAS在阿里云VPC
这种情况下IDC的服务器跟阿里云vpc内的ecs是网络不通的,而且目前NAS还不支持http协议的访问。因此解决方案一种方式是拉专线,直接连通IDC服务器和阿里云ECS服务器,先把数据上传ECS,再上传到NAS。第二种方案,不用专线直接走公网,中间转接用OSS,用户先把数据通过http推到阿里云OSS上,再把OSS上的数据拷贝到NAS。参考case2.

以上是数据迁移中几个简单的例子,实际的情况要更复杂一些,比如如何实现断点续传,流量控制,文件名编码问题,权限问题等。如果对这些问题有兴趣或者对文章有疑问,欢迎联系王俊俏(巨馍)探讨。

时间: 2024-11-30 07:00:02

NAS数据迁移初探的相关文章

从用户Windows系统到阿里云NAS SMB服务:常用数据迁移备份工具

本文介绍如何由本地(on-premises) 或阿里云的虚拟机Windows系统向阿里云NAS SMB服务上传和备份数据. 阿里云文件系统SMB协议服务介绍 阿里云文件存储服务NAS(阿里云NAS)是阿里云在2016年正式推出的公有云上的网络文件系统实现.阿里云NAS主要面向阿里云 ECS 实例.HPC.Docker.弹性Web和BatchCompute 等计算节点提供文件存储服务.通过标准的文件访问协议,用户无需对现有应用做任何修改,即可在云上使用具备无限容量及性能扩展.单一命名空间.多共享.

ORACLE与SQL之间的数据迁移

oracle|数据 高级数据迁移        很多时间,要在异构数据库之间进行数据迁移或抽取,如果在SQL中提取ORACLE的数据,可以通过ODBC.OLEDB等多种方式,要从ORACLE提取SQL中的数据,大都是通过透明网关来实现的.        在异构数据抽取过程中,最好采用SQL92标准的语法编写SQL代码,同时要注意不同数据库之间数据类型的转换关系,如ORACLE的日期类型用DATE.SQL用Datetime等.   一 关于ORACLE的透明网关配置        ORACLE安装

使用Kettle数据迁移添加主键和索引

Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,主要用于数据抽取.转换.装载.kettle兼容了市面上几十种数据库,故用kettle来做数据库的迁移视乎是个不错的选择. kettle的数据抽取主要在于抽取数据,而没有考虑数据库的函数.存储过程.视图.表结构以及索引.约束等等,而这些东西恰恰都是数据迁移需要考虑的事情.当然,如果在不考虑数据库中的函数.存储过程.视图的情况下,使用kettle进行数据的迁移还算是一个可行的方案. 这篇文章主要是讲述在使用kettle进行数据库的

使用热备份进行分时恢复----怎样通过归档逐步恢复以缩短数据迁移时间

备份|恢复|热备份|数据 使用热备份进行分时恢复 ----怎样通过归档逐步恢复以缩短数据迁移时间 Last Updated: Monday, 2004-11-15 10:32 Eygle         很多时候你可能遇到这样的情况:一个大型数据库的迁移,但是只有很少的停机时间,这看起来充满困难.可是我们可以通过各种方法来缩短停机时间. 本例适用于同平台.同版本数据库迁移. 在此情况下,我们可以通过一个热备份,应用归档恢复数据库到一个一致的状态,此时数据库可以被只读(read only)打开.之

.net2.0中使用SqlBulkCopy进行大批量数据迁移

sql|数据 在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据.数据源可以来自关系数据库或者XML文件,甚至WebService返回结果.其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数据迁移到目标数据库中.下面我们先通过一个简单的例子说明这个类的使用:

SQL Server 7.0 的数据迁移到MySQL上的一种方法

mysql|server|数据 Microsoft SQL Server 7.0 的数据迁移到MySQL上的方法 Zhbforce   想必大家都很喜欢用Word打字,用Excel进行计算和规划,用PowerPoint作幻灯片进行展示-,但是这只用到了Office系列产品的很少的一部分功能.据调查,绝大部分用户只用到了Office产品的20%的功能,很少有人注意到Visual Basic for Application.实际上,熟悉掌握VBA的功能可以使你的工作事半功倍,尤其对会计.金融等专业来

FreeBSD系统的数据迁移方法

相信一些朋友也曾经想过如何快捷安全迁移数据,迁移数据可能有多种原因,一种是想增加一块硬盘,把原来一些空间不够的分区迁移过来:另一种是硬盘复制,旧的硬盘容量可能太小了,又或者已经出现了问题,想用新的硬盘代替.葱头就分别举例说明怎样迁移数据,具体方法可能和你的硬盘的实际情况有所不同,这里只是作一个指引. 无论是那种方法,都必须先将新硬盘装上并让系统正确识别.为了不用设硬盘跳线(硬盘缺省为Master),这里举例安装一个新的IDE硬盘到IDE1接口,即与旧硬盘使用不同的数据线,系统识别为ad2:如果你

教你实现MySQL表数据迁移自动化

一.背景 之前我写过关于SQL Server的数据迁移自动化的文章:SQL Server 数据库迁移偏方,在上篇文章中设计了一张临时表,这个临时表记录搬迁的配置信息,用一个存储过程读取这张表进行数据的迁移,再由一个Job进行迭代调用这个存储过程. 在这次MySQL的实战中,我的数据库已经做了4个分片,分布在不同的4台机器上,每台机器上的数据量有1.7亿(1.7*4=6.8亿),占用空间260G(260*4=1040G),这次迁移的目的就是删除掉一些历史记录,减轻数据库压力,有人说这为什么不使用表

如何将SQL Server数据迁移到MySQL

一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应表并导入数据: 上网找了些资料,如:将ACCESS和MSSQL导入MYSQL中.MySQL Migration 实现 MSSQL 到 MySQL数据迁移,虽然不知道里面的做法是否可以成功转移,但是里面的过程比较复杂,没有去尝试,后来自己找到了方法,最重要就是简单和准确(暂时没发现明显的BUG),这里