精华内容
下载资源
问答
  • 新老系统改造——亿级数据迁移方案
    2021-04-04 00:03:24

    前言

    在开发之后,相信很多同学都遇到过老系统改造成新系统的场景,本文讨论的是在这种场景下大数据量的数据迁移的解决方案,我们都知道系统的改造升级不仅是技术上的升级,更加是业务上的优化,但是同时也涉及到数据的迁移。


    一、数据迁移场景是什么?

    至于改造的场景我就单独举一个例子吧:

    场景:A系统要升级成A1系统,A系统需要下线。假设A系统有两个接口(用户注册和用户数据查询)迁移到A1系统,但是现在遇到很多问题:

    1.A系统下线之后,A1系统的查询接口如何能及时获取到A系统的历史数据?
    2.A系统数据用户数据过亿,如何在不锁表的情况下迁移到A1系统的数据库?
    3.过亿用户数据迁移时间如何把控和测算?
    4.用户的查询量如此大,如何能保证查询的时候还能插

    更多相关内容
  • 可编辑 资料编码 产品名称 使用对象 华为工程师合作工程师 产品版本 编写部门 存储数据迁移小组 资料版本 V200R001C00 数据迁移服务V200R100C00交付材料 VMware虚拟机数据迁移方案 华为技术有限公司 版权所有 侵权必...
  • 数据迁移方案

    千次阅读 2021-11-10 14:54:39
    双写迁移 简单来说,就是在线上系统里面,之前所有写库的地方,增删改操作,除了对老库增删改,都加上对新库的增删改,这就是所谓的双写,同时写俩库,老库和新库。  然后系统部署之后,新库数据差太远,用之前...

     一、数据迁移背景

    问题场景:

    现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?

    1.1 停机迁移方案

    我先给你说一个最 low 的方案,就是很简单,大家伙儿凌晨 12 点开始运维,网站或者 app 挂个公告,说 0 点到早上 6 点进行运维,无法访问。

    接着到 0 点停机,系统停掉,没有流量写入了,此时老的单库单表数据库静止了。然后你之前得写好一个导数的一次性工具,此时直接跑起来,

    然后将单库单表的数据哗哗哗读出来,写到分库分表里面去

    导数完了之后,就 ok 了,修改系统的数据库连接配置啥的,包括可能代码和 SQL 也许有修改,那你就用最新的代码,然后直接启动连到新的分库分表上去。

    验证一下,ok了,完美,大家伸个懒腰,看看看凌晨 4 点钟的北京夜景,打个滴滴回家吧。

    但是这个方案比较 low,谁都能干,我们来看看高大上一点的方案。

    1.2 双写迁移方案 

    简单来说,就是在线上系统里面,之前所有写库的地方,增删改操作,除了对老库增删改,都加上对新库的增删改,这就是所谓的双写,同时写俩库,老库和新库

    然后系统部署之后,新库数据差太远,用之前说的导数工具,跑起来读老库数据写新库,写的时候要根据 gmt_modified 这类字段判断这条数据最后修改的时间,

    除非是读出来的数据在新库里没有,或者是比新库的数据新才会写。简单来说,就是不允许用老数据覆盖新数据

    导完一轮之后,有可能数据还是存在不一致,那么就程序自动做一轮校验,比对新老库每个表的每条数据,接着如果有不一样的,就针对那些不一样的,从老库读数据再次写。

    反复循环,直到两个库每个表的数据都完全一致为止。

    接着当数据完全一致了,就 ok 了,基于仅仅使用分库分表的最新代码,重新部署一次,不就仅仅基于分库分表在操作了么,还没有几个小时的停机时间,很稳。

    所以现在基本玩儿数据迁移之类的,都是这么干的。

    二、数据迁移扩展

    项目初始,是单库,分了2个表 就可以满足业务数据需求。

    随着时间推移,多年后,数据越来越多,当前的数据库设计已经不能满足当前设计。

    于是,需要如上图一样,进行分库再分表。

     2.1 同步双写方案

     如上图所示

    1. 应用还是保持从旧库中读写数据

    2. 编写个应用,通过canal将增量数据通过新的分库分表规则也同时写入新库

    3. 同时 编写个旧数据的迁移的工具,通过新的分库分表规则写入新库。

    4. 旧数据迁移完成后,验证新旧库中数据是否一致,一致后,既可切换位新库。

    三、具体的迁移方案

    双写方案,也是一个高可用的平滑迁移方案,这个方案主要分为四个步骤。

    数据迁移前,上游业务应用通过旧的服务访问旧的数据

    3.1 步骤一

    双写,写旧库,同时写新库

    服务进行升级,对“旧库上的数据修改”(这里的修改,为数据的insert, delete, update),在新库上进行相同的修改操作,这就是所谓的“双写”

    主要修改操作包括:

    (1)旧库与新库的同时insert;

    (2)旧库与新库的同时delete;

    (3)旧库与新库的同时update;

    由于新库中此时是没有数据的,所以双写旧库与新库中的affect rows可能不一样,不过这完全不影响业务功能,只要不切库,依然是旧库提供业务服务

    这个服务升级风险较小:

    (1)写接口是少数接口,改动点较少;

    (2)新库的写操作执行成功与否,对业务功能没有任何影响

    3.2 步骤二

    数据迁移工具

    研发一个数据迁移工具,进行数据迁移。这个数据迁移工具,把旧库中的数据转移到新库中来。

    这个小工具的风险较小:

    1. 整个过程依然是旧库对线上提供服务;

    2. 小工具的复杂度较低;

    3. 任何时间发现问题,都可以把新库中的数据干掉重来;

    4. 可以限速慢慢迁移,技术同学没有时间压力;

    数据迁移完成之后,就能够切到新库提供服务了么?

    答案是肯定的,因为前置步骤进行了双写,所以理论上数据迁移完之后,新库与旧库的数据应该完全一致。

    由于迁移数据的过程中,旧库新库双写操作在同时进行,怎么证明数据迁移完成之后数据就完全一致了呢?

     

    如上图所示:

    1. 左侧是旧库中的数据,右侧是新库中的数据;

    2. 按照primary key从min到max的顺序,分段,限速进行数据的迁移,假设已经迁移到now这个数据段,

    数据迁移过程中的修改操作分别讨论:

    1. 假设迁移过程中进行了一个双insert操作,旧库新库都插入了数据,数据一致性没有被破坏

    2. 假设迁移过程中进行了一个双delete操作,这又分为两种情况

    情况一:假设这delete的数据属于[min,now]范围,即已经完成迁移,则旧库新库都删除了数据,数据一致性没有被破坏;

    情况二:假设这delete的数据属于[now,max]范围,即未完成迁移,则旧库中删除操作的affect rows为1,新库中删除操作的affect rows为0,

    但是数据迁移工具在后续数据迁移中,并不会将这条旧库中被删除的数据迁移到新库中,所以数据一致性仍没有被破坏;

    3. 假设迁移过程中进行了一个双update操作,可以认为update操作是一个delete加一个insert操作的复合操作,所以数据仍然是一致的。

    除非,在一种非常极限的情况下:

    1. 数据迁移工具刚好从旧库中将某一条数据X取出;

    2. 在X插入到新库中之前,旧库与新库中刚好对X进行了双delete操作;

    3. 数据迁移工具再将X插入到新库中;

    这样,会出现新库比旧库多出一条数据X。

    但无论如何,为了保证数据的一致性,切库之前,还是需要进行数据校验的

    3.3 步骤三

    数据校验工具

    在数据迁移完成之后,需要使用数据校验的小工具,将旧库和新库中的数据进行比对,完全一致则符合预期,如果出现步骤二中的极限不一致情况,则以旧库中的数据为准

    这个小工具的风险依旧很小:

    1. 整个过程依然是旧库对线上提供服务;

    2. 小工具的复杂度较低;

    3. 任何时间发现问题,大不了从步骤二开始重来;

    4. 可以限速慢慢比对数据,技术同学没有时间压力;

     3.4 步骤四

    切到新库

    数据完全一致之后,将流量切到新库,完成平滑数据迁移

    至此,升级完毕,整个过程能够持续对线上提供服务,不影响服务的可用性。

    3.5 总结

    双写方案,四个步骤:

    1. 服务进行升级,记录“对旧库上的数据修改”进行新库的双写;

    2. 研发一个数据迁移小工具,进行数据迁移;

    3. 研发一个数据比对小工具,校验数据一致性;

    4. 流量切到新库,完成平滑迁移;

    数据迁移方案同步双写方案数据迁移

    展开全文
  • 应用和数据迁移方案.doc
  • 这是一个电子银行数据迁移方案,我这个方案内容丰富,欢迎大家下载阅读,希望对你们有帮助。
  • 华胜天成为企业提供分级存储技术为各企业提供性能卓越存储解决方案,在HSM软件中带有介质管理的功能,通过此模块HSM软件可对磁带库、光盘库...同样他还提供自动的数据迁移时间按排,实现灵活方便的数据迁移日程控制。
  • 数据迁移服务V200R100C00----VMware虚拟机数据迁移方案.doc
  • HC1309142 基于AIX平台的数据迁移方案 v1.0.pptx
  • PAGE 39 从Oracle到GaussDB的数据迁移方案 目 录 TOC \o "1-3" \h \z \u 一背景 3 1环境信息 3 2SDR产品描述 5 二SDR的环境准备 5 1SDR工具准备 7 2SDR工具安装 9 三SDR配置 16 四SDR全量迁移 27 五SDR增量迁移正式...
  • 数据迁移方案模板 篇一软件系统数据迁移计划模板 附件十三 数据迁移计划 数据迁移的重要事件和里程碑日期 数据迁移前的备份要求 数据迁移测试结果清单 转换工作进度表 提示 ( 1)用 Microsoft Project 制作进度表 ...
  • HBase 四种数据迁移方案

    千次阅读 2020-08-15 20:30:00
    本文原文:http://ballwql.cnblogs.com/一、前言HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类:图1.HBase数据迁移方案从上面图中可...

    本文原文:http://ballwql.cnblogs.com/

    一、前言

    HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类:

    图1.HBase数据迁移方案

    从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类。下面分别介绍一下。

    二、Hadoop层数据迁移

    2.1 方案介绍

    Hadoop层的数据迁移主要用到DistCp(Distributed Copy), 官方描述是:DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。

    我们知道MR程序适合用来处理大批量数据, 其拷贝本质过程是启动一个MR作业,不过DisctCp只有map,没有reducer。在拷贝时,由于要保证文件块的有序性,转换的最小粒度是一个文件,而不像其它MR作业一样可以把文件拆分成多个块启动多个map并行处理。如果同时要拷贝多个文件,DisctCp会将文件分配给多个map,每个文件单独一个map任务。我们可以在执行同步时指定-m参数来设定要跑的map数量,默认设置是20。如果是集群间的数据同步,还需要考虑带宽问题,所以在跑任务时还需要设定 bandwitdh 参数,以防止一次同步过多的文件造成带宽过高影响其它业务。同时,由于我们HBase集群一般是不会开MR调度的,所以这里还需要用到单独的MR集群来作主备数据同步,即在跑任务时还需要指定mapreduce相关参数。

    简单的distcp参数形式如下:

    hadoop distcp hdfs://src-hadoop-address:9000/table_name  hdfs://dst-hadoop-address:9000/table_name

    如果是独立的MR集群来执行distcp,因为数据量很大,一般是按region目录粒度来传输,同时传输到目标集群时,我们先把文件传到临时目录,最后再目的集群上load表,我们用到的形式如下:

    hadoop distcp \
    -Dmapreduce.job.name=distcphbase \
    -Dyarn.resourcemanager.webapp.address=mr-master-ip:8088  \
    -Dyarn.resourcemanager.resource-tracker.address=mr-master-dns:8093   \
    -Dyarn.resourcemanager.scheduler.address=mr-master-dns:8091   \
    -Dyarn.resourcemanager.address=mr-master-dns:8090  \
    -Dmapreduce.jobhistory.done-dir=/history/done/  \
    -Dmapreduce.jobhistory.intermediate-done-dir=/history/log/ \
    -Dfs.defaultFS=hdfs://hbase-fs/ \
    -Dfs.default.name=hdfs://hbase-fs/ \
    -bandwidth 20 \
    -m 20 \
    hdfs://src-hadoop-address:9000/region-hdfs-path \
    hdfs://dst-hadoop-address:9000/tmp/region-hdfs-path

    在这个过程中,需要注意源端集群到目的端集群策略是通的,同时hadoop/hbase版本也要注意是否一致,如果版本不一致,最终load表时会报错。

    2.2 方案实施

    迁移方法如下:
    第一步,如果是迁移实时写的表,最好是停止集群对表的写入,迁移历史表的话就不用了,此处举例表名为test;
    第二步, flush表, 打开HBase Shell客户端,执行如下命令:

    hbase> flush 'test'

    第三步,拷贝表文件到目的路径,检查源集群到目标集群策略、版本等,确认没问题后,执行如上带MR参数的命令
    第四步, 检查目标集群表是否存在,如果不存在需要创建与原集群相同的表结构
    第五步,在目标集群上,Load表到线上,在官方Load是执行如下命令:

    hbase org.jruby.Main add_table.rb /hbase/data/default/test

    对于我们来说,因我们先把文件同步到了临时目录,并不在原表目录,所以我们采用的另一种形式的load,即以region的维度来Load数据到线上表,怎么做呢,这里用到的是org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles这个类,即以bulkload的形式来load数据。上面同步时我们将文件同步到了目的集群的/tmp/region-hdfs-path目录,那么我们在Load时,可以用如下命令来Load region文件:

    hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 hdfs://dst-hadoop-address:9000/tmp/region-hdfs-path/region-name   table_name

    这里还用到一个参数hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily, 这个表示在bulkload过程中,每个region列族的HFile数的上限,这里我们是限定了1024,也可以指定更少,根据实际需求来定。
    第六步,检查表数据是否OK,看bulkload过程是否有报错

    在同步过程中,我们为加块同步速度,还会开个多线程来并发同步文件,这个可根据实际数据量和文件数来决定是否需要使用并发同步。

    三、HBase层数据迁移

    3.1 copyTable方式

    copyTable也是属于HBase数据迁移的工具之一,以表级别进行数据迁移。copyTable的本质也是利用MapReduce进行同步的,与DistCp不同的时,它是利用MR去scan 原表的数据,然后把scan出来的数据写入到目标集群的表。这种方式也有很多局限,如一个表数据量达到T级,同时又在读写的情况下,全量scan表无疑会对集群性能造成影响。
    来看下copyTable的一些使用参数:

    Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] <tablename>
    
    Options:
     rs.class     hbase.regionserver.class of the peer cluster
                  specify if different from current cluster
     rs.impl      hbase.regionserver.impl of the peer cluster
     startrow     the start row
     stoprow      the stop row
     starttime    beginning of the time range (unixtime in millis)
                  without endtime means from starttime to forever
     endtime      end of the time range.  Ignored if no starttime specified.
     versions     number of cell versions to copy
     new.name     new table's name
     peer.adr     Address of the peer cluster given in the format
                  hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent
     families     comma-separated list of families to copy
                  To copy from cf1 to cf2, give sourceCfName:destCfName.
                  To keep the same name, just give "cfName"
     all.cells    also copy delete markers and deleted cells
    
    Args:
     tablename    Name of the table to copy
    
    Examples:
     To copy 'TestTable' to a cluster that uses replication for a 1 hour window:
     $ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable
    For performance consider the following general options:
    -Dhbase.client.scanner.caching=100
    -Dmapred.map.tasks.speculative.execution=false

    从上面参数,可以看出,copyTable支持设定需要复制的表的时间范围,cell的版本,也可以指定列簇,设定从集群的地址,起始/结束行键等。参数还是很灵活的。copyTable支持如下几个场景:
    1.表深度拷贝:相当于一个快照,不过这个快照是包含原表实际数据的,0.94.x版本之前是不支持snapshot快照命令的,所以用copyTable相当于可以实现对原表的拷贝, 使用方式如下:

    create 'table_snapshot',{NAME=>"i"}
    hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy table_snapshot

    2.集群间拷贝:在集群之间以表维度同步一个表数据,使用方式如下:

    create 'table_test',{NAME=>"i"}   #目的集群上先创建一个与原表结构相同的表
    hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=zk-addr1,zk-addr2,zk-addr3:2181:/hbase table_test

    3.增量备份:增量备份表数据,参数中支持timeRange,指定要备份的时间范围,使用方式如下:

    hbase org.apache.hadoop.hbase.mapreduce.CopyTable ... --starttime=start_timestamp --endtime=end_timestamp

    4.部分表备份:只备份其中某几个列族数据,比如一个表有很多列族,但我只想备份其中几个列族数据,CopyTable提供了families参数,同时还提供了copy列族到新列族形式,使用方式如下:

    hbase org.apache.hadoop.hbase.mapreduce.CopyTable ... --families=srcCf1,srcCf2 #copy cf1,cf2两个列族,不改变列族名字
    hbase  org.apache.hadoop.hbase.mapreduce.CopyTable ... --families=srcCf1:dstCf1, srcCf2:dstCf2 #copy srcCf1到目标dstCf1新列族

    总的来说,CopyTable支持的范围还是很多的,但因其涉及的是直接HBase层数据的拷贝,所以效率上会很低,同样需要在使用过程中限定扫描原表的速度和传输的带宽,这个工具实际上使用比较少,因为很难控制。

    3.2 Export/Import方式

    此方式与CopyTable类似,主要是将HBase表数据转换成Sequence File并dump到HDFS,也涉及Scan表数据,与CopyTable相比,还多支持不同版本数据的拷贝,同时它拷贝时不是将HBase数据直接Put到目标集群表,而是先转换成文件,把文件同步到目标集群后再通过Import到线上表。主要有两个阶段:

    Export阶段: 将原集群表数据Scan并转换成Sequence File到Hdfs上,因Export也是依赖于MR的,如果用到独立的MR集群的话,只要保证在MR集群上关于HBase的配置和原集群一样且能和原集群策略打通(master&regionserver策略),就可直接用Export命令,如果没有独立MR集群,则只能在HBase集群上开MR,若需要同步多个版本数据,可以指定versions参数,否则默认同步最新版本的数据,还可以指定数据起始结束时间,使用如下:

     #  output_hdfs_path可以直接是目标集群的hdfs路径,也可以是原集群的HDFS路径,如果需要指定版本号,起始结束时间
    hbase org.apache.hadoop.hbase.mapreduce.Export <tableName> <ouput_hdfs_path> <versions> <starttime> <endtime>

    Import阶段: 将原集群Export出的SequenceFile导到目标集群对应表,使用如下:

    #如果原数据是存在原集群HDFS,此处input_hdfs_path可以是原集群的HDFS路径,如果原数据存在目标集群HDFS,则为目标集群的HDFS路径
    hbase org.apache.hadoop.hbase.mapreduce.Import <tableName> <input_hdfs_path>


    3.3 Snapshot方式

    3.3.1 snapshot介绍

    此方式与上面几中方式有所区别,也是目前用得比较多的方案,snapshot字面意思即快照, 传统关系型数据库也有快照的概念,HBase中关于快照的概念定义如下:

    快照就是一份元信息的合集,允许管理员恢复到表的先前状态,快照不是表的复制而是一个文件名称列表,因而不会复制数据

    因不拷贝实际的数据,所以整个过程是比较快的,相当于对表当前元数据状态作一个克隆,snapshot的流程主要有三个步骤:

    图2.数据迁移图

    加锁: 加锁对象是regionserver的memstore,目的是禁止在创建snapshot过程中对数据进行insert,update,delete操作
    刷盘:刷盘是针对当前还在memstore中的数据刷到HDFS上,保证快照数据相对完整,此步也不是强制的,如果不刷会,快照中数据有不一致风险
    创建指针: snapshot过程不拷贝数据,但会创建对HDFS文件的指针,snapshot中存储的就是这些指标元数据

    3.3.2 snapshot内部原理

    snapshot实际内部是怎么做的呢,上面说到,snapshot只是对元数据信息克隆,不拷贝实际数据文件,我们以表test为例,这个表有三个region, 每个region分别有两个HFile,创建snapshot过程如下:

    图3.snapshot创建内部原理

    创建的snapshot放在目录/hbase/.hbase-snapshot/下, 元数据信息放在/hbase/.hbase-snapshot/data.manifest中, 如上图所示,snapshot中也分别包含对原表region HFile的引用,元数据信息具体包括哪哪些呢:

    1. snapshot元数据信息
    2. 表的元数据信息&schema,即原表的.tableinfo文件
    3. 对原表Hfile的引用信息

    由于我们表的数据在实时变化,涉及region的Hfile合并删除等操作,对于snapshot而言,这部分数据HBase会怎么处理呢,实际上,当发现spit/compact等操作时,HBase会将原表发生变化的HFile拷贝到/hbase/.archive目录,如上图中如果Region3的F31&F32发生变化,则F31和F32会被同步到.archive目录,这样发生修改的文件数据不至于失效,如下图所示:

    图4.snapshot文件迁移

    快照中还有一个命令就是clone_snapshot, 这个命令也很用,我们可以用它来重命名表,恢复表数据等。具体用法如下:

    hbase> clone_snapshot 'snapshot_src_table' , 'new_table_name'

    这个命令也是不涉及实际数据文件的拷贝,所以执行起来很快,那拷贝的是什么呢,与上面提到的引用文件不同,它所生成的是linkfile,这个文件不包含任何内容,和上面引用文件一样的是,在发生compact等操作时,会将原文件copy到/hbase/.archive目录。
    比如我们有一个表test, 有一个region原表信息如下:

    hbaseuser:~> hadoop fs -ls /hbase/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/*
    Found 1 items
    -rw-r--r--   1 hbaseuser supergroup         37 2017-12-01 11:44 /hbase/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/.regioninfo
    Found 1 items
    -rw-r--r--   1 hbaseuser supergroup        983 2017-12-01 12:13 /hbase/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i/55c5de40f58f4d07aed767c5d250191

    在创建一个snapshot之后:snapshot 'test', 'snapshot_test',在/hbase/.hbase-snapshot目录信息如下:

    hbaseuser~> hadoop fs -ls /hbase/.hbase-snapshot/snapshot_test
    Found 4 items
    -rw-r--r--   1 hbaseuser supergroup         32 2017-12-01 12:13 /hbase/.hbase-snapshot/snapshot_test/.snapshotinfo
    drwxr-xr-x   - hbaseuser supergroup          0 2017-12-01 12:13 /hbase/.hbase-snapshot/snapshot_test/.tabledesc
    drwxr-xr-x   - hbaseuser supergroup          0 2017-12-01 12:13 /hbase/.hbase-snapshot/snapshot_test/.tmp
    drwxr-xr-x   - hbaseuser supergroup          0 2017-12-01 12:13 /hbase/.hbase-snapshot/snapshot_test/d8340c61f5d77345b7fa55e0dfa9b492

    在clone_snapshot之后:clone_snapshot 'snapshot_test','new_test',在/hbase/archive/data/default目录,有对原表的link目录,目录名只是在原HFile的文件名基础上加了个links-前缀,这样我们可以通过这个来定位到原表的HFile,如下所示:

    hbaseuser:~> hadoop fs -ls /hbase/archive/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i
    Found 1 items
    drwxr-xr-x   - hbaseuser supergroup          0 2017-12-01 12:34 /hbase/archive/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i/.links-55c5de40f58f4d07

    此时,再执行合并操作:major_compact 'new_test',会发现/hbase/archive/data/default/目录已经变成了实际表的数据文件,上面图中/hbase/archive/data/default/test/d8340c61f5d77345b7fa55e0dfa9b492/i/.links-55c5de40f58f4d07这个已经不在了,取而代之的是如下所示文件:

    hbaseuser:~> hadoop fs -ls /hbase/archive/data/default/new_test/7e8636a768cd0c6141a3bb45b4098910/i
    Found 1 items
    -rw-r--r--   1 hbaseuser supergroup          0 2017-12-01 12:48 /hbase/archive/data/default/new_test/7e8636a768cd0c6141a3bb45b4098910/i/test=d8340c61f5d77345b7fa55e0dfa9b492-55c5de40f58f4d07aed767c5d250191c

    在实际的/hbase/data/default/new_test目录也是实际的原表的数据文件,这样完成了表数据的迁移。

    3.3.3 snapshot数据迁移

    snapshot的应用场景和上面CopyTable描述差不多,我们这里主要考虑的是数据迁移部分。数据迁移主要有以下几个步骤:

    A.创建快照:在原集群上,用snapshot命令创建快照,命令如下:

    hbase> snapshot  'src_table', 'snapshot_src_table'
    #查看创建的快照,可用list_snapshots命令
    hbase> list_snapshots
    #如果快照创建有问题,可以先删除,用delete_snapshot命令
    hbase >delete_snapshot 'snapshot_src_table'

    创建完快照后在/hbase根目录会产生一个目录:

    /hbase/.hbase-snapshot/snapshot_src_table
    #子目录下有如下几个文件
    /hbase/.hbase-snapshot/snapshot_src_table/.snapshotinfo
    /hbase/.hbase-snapshot/snapshot_src_table/data.manifest

    B.数据迁移: 在上面创建好快照后,使用ExportSnapshot命令进行数据迁移,ExportSnapshot也是HDFS层的操作,本质还是利用MR进行迁移,这个过程主要涉及IO操作并消耗网络带宽,在迁移时要指定下map数和带宽,不然容易造成机房其它业务问题,如果是单独的MR集群,可以在MR集群上使用如下命令:

    hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
    -snapshot snapshot_src_table \
    -copy-from hdfs://src-hbase-root-dir/hbase \
    -copy-to hdfs://dst-hbase-root-dir/hbase \
    -mappers 20 \
    -bandwidth 20

    上面这些流程网上很多资料都有提到,对于我们业务来说,还有一种场景是要同步的表是正在实时写的,虽然用上面的也可以解决,但考虑到我们表数据规模很大,几十个T级别,同时又有实时业务在查的情况下,直接在原表上就算只是拷贝HFile,也会影响原集群机器性能,由于我们机器性能IO/内存方面本身就比较差,很容易导致机器异常,所以我们采用的其它一种方案,流程图如下:

    图5.新的snapshot迁移方案

    为什么要采用这种方案呢,主要考虑的是直接对原表snapshot进行Export会影响集群性能,所以采用折中的方案,即先把老表clone成一个新表,再对新表进行迁移,这样可以避免直接对原表操作。

    四、总结

    上文把HBase数据迁移过程中常用的一些方法作了一个大概介绍,总结起来就四点:

    DistCp: 文件层的数据同步,也是我们常用的
    CopyTable: 这个涉及对原表数据Scan,然后直接Put到目标表,效率较低
    Export/Import: 类似CopyTable, Scan出数据放到文件,再把文件传输到目标集群作Import
    Snapshot: 比较常用 , 应用灵活,采用快照技术,效率比较高

    具体应用时,要结合自身表的特性,考虑数据规模、数据读写方式、实时数据&离线数据等方面,再选择使用哪种。

    参考:

    1 http://dongxicheng.org/hadoop-hdfs/hadoop-hdfs-distcp-fastcopy/
    2 http://www.cnblogs.com/foxmailed/p/3914117.html
    3 http://hbasefly.com/2017/09/17/hbase-snapshot

    展开全文
  • 国产化智能数据迁移方案.pptx
  • 国产化智能数据迁移方案.pdf
  • 范文范例指导参考 范文范例指导参考 word word版整理 数据迁移方案 N8000 到 AS13000 广东XX信息技术有限 2015年7月 系统拓扑图 中间服务器 文件服务 万兆交换机1 关 NAS网 华赛N8000 已有存储 成果存储 主 成果存储...
  • 范文 范例 指导 参考 1 应用及数据迁移方案 1.1 应用及数据迁移概述 本次的应用及数据迁移工作,新旧设备的数据迁移也将体现本次实施工作的 水准 原应用及数据迁移具有时间短系统结构复杂测试时间长设备繁多昂贵 人员...
  • 目前的办公自动化产品(以下简称OA)中,即将或已经面对的大量客户,存在将原Domino版本系统向JAVA版本系统升级的需求,势必包括Domino系统内数据向JAVA版本系统中的数据迁移的要求。数据迁移中,由于Domino系统使用...
  • 不同数据库之间的数据迁移方案设计及迁移工具选择.docx
  • 不同数据库之间的数据迁移方案设计及迁移工具选择.pdf
  • 核心应用数据迁移方案建议书.docx
  • 相对应的金融科技也在不断的更新和迭代,每次有新的软件系统出炉的时候,就是老的软件系统命运终结的开始,老的项目当然不会束手就擒,它也会做最后的挣扎,当你从它身上迁移用户或者商户的时候,它会给你带来很多...

    互联网金融行业发生了翻天覆地的变化,相对应的金融科技也在不断的更新和迭代,每次有新的软件系统出炉的时候,就是老的软件系统命运终结的开始,老的项目当然不会束手就擒,它也会做最后的挣扎,当你从它身上迁移用户或者商户的时候,它会给你带来很多麻烦,比如说,它会临时罢工、出现资金损失等等不可忽视的问题,因此,迁移是个大任务,有的时候迁移并不亚于开发一套新系统的难度,甚至可以说是有过之而无不及。

     

    哪些场景需要迁移

    我们总结了各种需要迁移的场景。

    字段迁移

    原来设计的字段大小不能满足现在业务的需求,直接在原表上扩容字段可能会影响线上跑的业务,因此,我们需要增加一个字段来替换原来的字段;字段的数据格式需要升级,通过新增字段来替换原有字段,例如:原有未加密的字段处于安全需求进行加密。

    表迁移

    用于数据库表设计重构的场景,原有表的结构不合理,新增合理的表来替换原有的表,这时候我们需要表迁移。

    数据库迁移

    把单库迁移到分库分表的多个库;从一种数据库迁移到另外一种数据库;分库分表的多个库需要扩容的时候,需要进行数据库迁移,迁移到一套能够容纳足够数据的数据库集群。

    数据库迁移到其他类型的库

    对数据库的选型发生了变化,例如:微博的粉丝库从原有的 MySQL 迁移到 HBase。

    系统迁移

    原有系统的技术已经过时了,不能满足新需求或者业务发展的需要,开发完成新系统来替换原有系统。

    通用的迁移方法论

    通用的迁移方法分为平滑迁移和停机迁移,平滑迁移一般采用双写的方案,不需要停机就可以完成迁移,类似飞机的空中加油,或者给运行的汽车换轮子。而停机迁移,则需要停止现有的业务服务,然后迁移数据,待数据迁移之后,再开启对外提供服务。

    这里讲解的方法论是一种通用的迁移方案,既适合字段迁移、表迁移,也适合库迁移以及应用迁移,既适合数据库的迁移也适合缓存的迁移,虽然在细节上有些不同,但是在方法论上则大同小异,我们以分片后的数据容量不能满足需求,需要对分片后的数据扩容为例,这里的扩容实际上是迁移的一种特殊案例,我们以扩容为例来说明相应的步骤和实现细节。

    平滑迁移

    平滑迁移适合对可用性要求较高的场景,例如,线上的交易服务对缓存或者数据库依赖较大,不能忍受停机带来的业务损失,也没有交易的低峰期,我们对此只能采用平滑迁移的方式。

    平滑迁移,是指将正在提供线上服务的数据,从一个地方数据存储到另一个数据存储,整个迁移过程中要求不停机,服务不受影响。根据数据所处层次,可以分为缓存迁移、数据库存储迁移、应用迁移等等;根据数据迁移前后的变化,又可以分为数据平移和数据转移。数据库对数据库的迁移属于平移,数据库对其他 NoSQL 库的迁移属于数据转移。

    数据平移是指迁移前后数据组织形式不变,比如 MySQL 数据库从1个实例扩展为4个实例,Redis 缓存从2个实例扩展到8个实例等等。

    如果在最初的设计里就为以后的扩容做好准备,也就是做了充分的容量评估(关于容量评估,请参考《分布式服务架构:原理、设计与实战》一书中第3章的内容),那么数据迁移工作就会简单很多,比如 MySQL 已经做了分库分表,扩展实例的时候,只需要多做几个从库,切换访问关系,最后将冗余的库表删除即可达到扩容的效果,当然,这需要短暂的停止服务。

    近年来出现很多支持自动可伸缩的数据库,在实现上已经做到全自动数据迁移,如 HBase、TiDB 等,那就更简单了,只要通过管理功能来添加机器,手工修改配置或者系统自动发现,就可完成数据库容,也就免去了复杂的数据迁移等工作。

    数据转移是指在数据迁移前后,数据组织形式发生了变化。比如将 MySQL 数据库迁移到 HBase 数据库,微博就经历过这样的过程。

    平滑迁移通常使用的是双写方案,方案分成4个步骤:双写、迁移历史数据、切读、下双写。

    这种方式如果应用于缓存扩容的迁移场景,则还有一个变种,就是不需要迁移旧数据,在第1步中双写后,在一定的时间里通过新规则对新缓存进行写入,新缓存已经有了足够的数据,这样我们就不用再迁移旧数据,直接进入第3步即可。

    首先,假设我们的应用现在使用了具有两个分片的数据集群,通过关键字哈希的方式进行路由,如下图所示。

    因为两个分片已经不能满足容量的需求,所以现在需要扩容到4个分片,达到原来两倍的总大小,因此我们需要迁移。

    迁移的具体过程如下。

    (1)双写

    按照新规则和旧规则同时往新旧数据系统中写数据,如下图所示。

    这里,我们仍然按照旧的规则,也就是关键字哈希除以2取余来路由分片,同时按照新的规则,也就是关键字哈希除以4取余来路由到新的4个分片上,来完成数据的双写。

    这个步骤有优化的空间,因为是在成倍扩容,其实,我们不需要准备4个全新的分片,对于新规则中的前两个分片的数据,其实是旧规则中的两个分片数据的子集,并且规则一致,所以我们可以重用前两个分片,也就是一共需要两个新的分片,用来处理关键字哈希取余后为2和3的情况,使用旧的数据分片来处理关键字哈希取余后0和1的情况即可。如下图所示。

    (2)迁移历史数据

    把旧缓存集群中的历史数据读取出来,按照新的规则写到新的数据集群中,如下图所示。

    在这个过程中,我们需要迁移历史数据,在迁移的过程中可能需要迁移工具,这也需要一部分开发工作量。在迁移后,我们还需要对迁移的数据进行验证,表明我们的数据迁移成功。

    在某些应用场景下,例如缓存数据,并不是应用强依赖的,在缓存里获取不到数据,可以回源到数据库获取,因此在这种场景下通过容量评估,数据库可以承受回源导致的压力增加,就可以避免迁移旧数据。

    在另一种场景下,数据一般是具有时效性的,应用在双写期间不断向新的集群中写入新数据,历史数据会逐渐过时,并被从旧的集群中删除,在一定的时间流逝后,新的集群中自然就有了最新的数据,就不再需要迁移历史数据了,但是这需要进行评估和验证。

    (3)切读

    把应用层所有的读操作路由到新的数据集群上,如下图所示。

    在这一步骤里,把应用中读取的操作的数据源转换成新的数据集群,这时应用的读写操作已经完全发生在新的数据库集群上了。这一步一般不需要上线代码,我们会在一开始上双写时就实现开关逻辑,这里只需要将读的开关切换到新的集群即可。

    (4)下线双写

    在这一步,我们把写入旧的集群的逻辑下线,如下图所示。

    这一步通常是在双写和切读后验证没有任何问题,并保证数据一致性的情况下,才把这部分代码下线。同时可以把旧的分片下线,如果是扩容的场景,并且重用了旧的分片1和分片2,则还可以清理分片1和分片2中的冗余数据。

    对于字段迁移来讲,我们除了新增字段,双写后替换原来字段,我们还可以采用原地替换的方法,对于新数据加密,加密后做标志,然后异步的将历史数据加密,让查询程序兼容加密的数据和非加密的数据。

    可以用“软着陆”来形容双写迁移方案,这和新领导上任后,一般先招心腹,慢慢的替代老下属的职责,慢慢淘汰老下属,慢慢实现软着陆如出一辙。

    停机迁移

    停机迁移的方法比较简单,通常分为停止应用、迁移旧数据、更改数据源文件、启动应用这4个步骤,如下图所示。

    具体的迁移步骤如下。

    1. 停机应用,先将应用停止服务。

    2. 迁移历史数据,按照新的规则把历史数据迁移到新的缓存集群中。

    3. 更改应用配置,指向新的缓存集群。

    4. 重新启动应用。

    这种方式的好处是实现比较简单、高效,能够有效避免数据的不一致,但是需要由业务方评估影响,一般在晚上交易量比较小或者非核心服务的场景下比较适用。

    如何验证迁移成功?

    迁移过程中最重要的一环就是如何验证迁移方案是成功的,我曾经给小伙伴们定了一个顺口溜。

    要明确什么样角色的什么人在什么时候到什么系统看到什么样的数据,才能确认迁移成功。

    虽然这是看似简单的一句话,但是信息量满满的,有了这句话作为指导,能够确保迁移方案的方向一定是正确的,一定不会导致太大的问题。

    这句话具体包括几个要素:谁、什么时候、什么样的数据,这些必须在迁移方案中都要事先明确,具体执行的人必须了解清楚这些条款,假设我们在迁移支付行业中的计费模板,那么迁移切量后,我们就需要计费的运营在切量后的第一时间到计费系统中查看计费的准确性,并且明确什么样的计费结果是准确的,什么样的计费结果是不准确的。

    有的时候只靠人来确定数据是否正确恐怕还不够,我们通常需要工具自动化的进行比对,同样我们以计费模板迁移为例,我们从一套计费模板迁移到另外一套计费模板中,通常在初期我们不会真正的以新模板为准,我们会在程序中实现“双计”,既使用老的计费模板计费,也使用新的计费模板计费,在初期我们以老的计费模板为准,新的计费模板计费的结果只用于比对,并且计入日志,这样通过程序自动比对一段时间以后,发现新的计费模板确实没有问题,我们才真的开启开关,以新的计费模板为准。

    当然,有的时候数据量巨大,我们比对每一个流量产生的数据不太现实,也会严重影响性能,这个时候我们需要对数据比对进行抽样,只对一些比较有代表性的数据进行比对。

    系统迁移后数据清洗?

    系统迁移过程中,上了双写以后,历史数据仍然保留在老系统,因此,我们需要将历史数据迁移到新系统,因为,有些时候我们需要读取或者修改历史数据,例如支付行业的退款等。

    我们把迁移历史数据的过程称为洗数据,通常使用如下的步骤来实现。

    1. 先清洗历史数据,将清洗后的数据写入新系统。

    2. 做全量对比,如果数据太多,没法全量对比,就抽样对比,看看有没有不一致的数据。

    3. 在数据量巨大的情况下,线上系统复杂,出现少量的不一致是正常的,这时候不一致的数据进行分析,这时候可能需要参考线上服务系统的交易日志,查明造成不一致的原因,并进行修复。

    这里,有读者会对上面第2步有疑问,为什么会产生不一致的数据呢,这有很多原因。下面我们来仔细分析。

    对于增加记录,到迁移历史数据这一阶段,我们使用的是双写,因此,数据在新老数据库中都会存在,即使双写有问题,导致一方不存在,我们也可以通过比对来补齐。

    对于更新数据,则容易产生不一致,导致新老数据库的数据不一致,假设在迁移某条历史数据的过程中,线上的交易系统正好修改了这条数据,在双写系统还没有更新历史数据的时候,迁移工具已经把这条数据拿到了应用系统中,这时数据在新老库中都更新了,但是迁移工具后续又把老版本的这条数据更新到新系统中,就导致数据不一致。

    对于删除数据,和上面更新数据有一样的问题,也会导致不一致的问题,这时候以谁为准,怎么保证一致性是个难题,我们需要借助修改的 timestamp 或者版本来区分哪一个是最新的版本,然后对数据进行修复。还有另外一个更好的方法,对于某些业务,数据是有一定时效性的,超过一定时间的数据就不再更改,因此,我们可以让双写的时间拉长,要长于数据更新的时间段,这样在历史数据完全不被更新的时候,我们再进行洗数据,就不会因为迁移而产生不一致了。

    迁移失败怎么办?

    这里探讨,迁移失败了,迁移后验证迁移有问题了,怎么办?其实,迁移失败了没有什么好的办法,只有两个途径可以走,一个就是迁移失败了就在新系统中修复,但是有些时候这可能会导致更多不可用时间,另外一个方案就是迁移失败了,需要迁移回来,但是迁移回来迁移过程中产生的数据怎么办?

    这是唯一能用的两个办法,没有更好的办法能解决迁移失败的问题,因此,在这个问题上我们不能奢求完美的解决方案,我们只能退而求其次,提前做好应对方案。

    如果我们决定了迁移失败了就在新系统中修复,而不再切回老的系统,我们就要充分的做好应急方案,一旦这种事情出现了,我们要预测可能产生的问题,针对问题做相应的解决方案,甚至我们提前做好工具,在问题出现的时候,我们要快速发现和快速恢复。

    如果我们决定了迁移失败后要迁移回来老系统,我们也要提前做好应急方案,应急方案中要包含如何发现问题,如何迁移回老系统,将流量迁移回老系统之后,还要考虑在新系统中遗留的数据怎么办,通常来讲,我们有两个方法,一种方法是通过工具把这些数据迁移回老系统,另外一种方法是让老系统兼容新数据。

    迁移方案的评审?

    这里我们详细阐述作为架构师应该如何评审迁移方案。

    首先,需要有人牵头写即将要评审的迁移方案,迁移方案的内容要包括具体的迁移产品,迁移的目的是什么,描述为什么要进行此次迁移,以及要达到什么效果,迁移任务的时间点,迁移方案什么时候在系统上实施,什么时候真正的进行切量,什么时候进行验证,什么时候结束,迁移过程中有什么原则,迁移会影响多少用户和商户,影响到什么程度,这次迁移的主要负责人是谁,参与人是谁,这些都需要落实到纸质的文档。

    然后,我们最需要考虑的就是这次迁移的影响范围,都对哪些角色的人会产生影响,以及对哪些人是透明的,这要评估是否对商户、用户、运营人员等有感知,如果对任何人有感知,需要制定提前通知的方案,要通知哪些人,什么时候通知,以什么形式通知,是否需要被通知人回复认可等。

    接下来需要确认迁移用户和商户的选择、顺序、批次,一般选择不重要的用户和商户先迁移,验证迁移过程没问题,再迁移重要的用户和商户,要综合考虑用户和商户的等级、交易类型、迁移复杂度等,以此确定用户和商户迁移顺序和批次。

    通常,在全量切换之前,我们需要进行多次验证,我们需要在准生产测试迁移变更逻辑和开关逻辑,或者通过 TCPCopy 环境来验证代码变更的正确性,然后,通过少量的内部用户在线上验证逻辑的正确性,最后,会按照我们选定的用户和商户的批量,逐渐的放量、观察和验证,最后再全量切换。

    然后,要确定迁移过程中对系统的变更内容,要确定变更的关键内容,然后做测试方案,要测试到所有的场景,包括迁移开关的开和关,要测试迁移失败后迁移回老系统的情况,不要抱着侥幸态度就忽略这部分的测试。

    最后,进入迁移方案的关键内容,要对迁移的过程识别风险,这包括交易风险、业务风险、系统风险、技术风险和政策风向等,要对迁移过程中更改的信息流和资金流进行详细评估,对识别的风险要给出应对方案。

    迁移开关和迁移工具

    在迁移的过程中,除了要配合迁移开发系统,还有两个比较特殊的工作。

    一个就是迁移开关的设计,在迁移的过程中,双写、切流量、有问题了切回流量,这些都需要使用迁移开关,迁移开关的设计非常的重要,如果迁移开关设计的不合理会产生很大问题,甚至会导致资金损失,在我经历过的金融系统中,曾经经历过迁移开关设计在统一的共享缓存上,由于网络原因重试导致请求流量重复,请求流量走到了不同的应用节点上,不同应用节点读取共享缓存有时差,导致两个流量一个走了开的逻辑,一个走了关的逻辑,如果后端系统没有做幂等,这会导致资金损失。因此,我们对迁移开关的设计,制定了如下的最佳实践。

    1. 迁移开关要做在订单上,在订单上标记是否迁移新系统。

    2. 迁移开关要有不同的维度,可在订单上,可在商户或者用户上,可在系统级别。

    3. 迁移开关要能开能关,也就是流量要能切到新系统,也要能切到老系统。

    另外一个重要的任务是开发迁移工具,比如说迁移后校验数据,对比数据等,这都需要开发专业的工具,靠运营对比大量的数据很容易产生误差,如果想做好迁移,就要舍得成本来投入到这些关键任务上。

    迁移过程中的政治因素

    迁移是个费力不讨好的工作,因此,很多人其实不愿意干这个活,迁移做得好,那是应该做的事情,迁移出现了问题,那全是工作没做好,况且迁移总不会顺顺利利的,这就是为什么大家不愿意做,越是有挑战的任务,其实,它的内在价值就越大。

    但是要真的想做一次彻底的迁移,替换掉老的系统,这需要一定的激励措施,要与迁移负责人和参与人明确迁移的目标和价值,一旦按照计划迁移成功除了迁移过程中给大家带来的经验,还有什么样的奖励,否则,只是作为一个常规任务,那么参与者必然失去兴趣,迁移也就成了挠痒痒,基本就变成今天迁移一点流量,明天迁移一点流量,最后就新老系统并存,不伦不类的。

    迁移一定要由架构组来把关

    数据迁移并不是一项需要高大上的技术工作,它需要的是对业务逻辑的把控,对操作流程的理解,对新旧系统特性和环境的掌握,以及对细节的掌控,要深入骨髓般的理解系统才能做好,因此迁移是需要架构组来把关的。

    但是,迁移的事情也不是那么简单的,也不能由运营单独搞定的,这涉及到迁移工具的开发,迁移后的验证,迁移失败如何迁回,脏数据如何处理,迁移过程中如何平滑过度,例如迁移计费模板的过程,应该开发工具进行对比结果后,才能真正的使用新的计费系统,这些都是必须有业务人员和技术人员来共同完成的,因此,迁移工作最好由架构组牵头,由产品、运营、技术等一起来实施。

    如何汇报迁移技术方案

    由于迁移是个非常大的任务,设计的部门和角色比较多,由于出了问题产生的影响比较大,因此,很多老板都会关注迁移的方案,这里,对于迁移负责人和架构师,要负责给不同角色的人汇报迁移方案,这里我总结的一个最佳实践是不同角色的人关注不同的内容。

    1. 销售的老板会关注迁移后带来的价值,带来哪些系统能力的提升,能够带来多少毛利的增长。

    2. 业务的老板关注的是业务的风险,关注迁移以后是否带来产品能力的提升等等。也会关注成本的降低;还会关注迁移的里程碑,时间点等。

    3. 运营的老板更会关注迁移的实施方案,包括如何通知商户、如何选择商户等。

    4. 而技术的老板会关注具体的迁移设计方案本身。

    因此,在给不同的老板做汇报的时候,我们汇报内容的侧重点要有所不同。

    展开全文
  • 去年年底做了不少系统的数据迁移,大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,有一些心得体会,与大家分享。  首先说说迁移流程,在迁移之前,写好方案,特别是实施的方案步骤一定...
  • 系统历史数据迁移方案.doc
  • 不停服数据迁移方案

    千次阅读 2020-02-26 11:28:16
    沉淀下来的数据需要得到良好的梳理和传承,对于非流水的属性类数据,需要随着系统的重构重新迁移、组合,但是在线的系统不允许大规模的停服来配合迁移,这个时候需要一套热迁移或者准热迁移方案,下面我们来讨论下...
  • Fastdfs数据迁移方案

    2021-03-09 16:07:02
    环境迁移,需要迁移旧环境的fastdfs集群的数据到新环境,由于之前数据迁移仅仅是针对mysql和mongodb,对fastdfs数据的迁移了解甚少,本文档主要是针对fastdfs数据迁移和恢复的几种方式以及具体操作流程做详细阐述。...
  • 带有oracle数据库的数据迁移方案.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 180,391
精华内容 72,156
关键字:

数据迁移方案