精华内容
下载资源
问答
  • 数据迁移的四种方法
    千次阅读
    2020-07-20 15:37:57

    方法一:离线迁移
    通过RDB或者aof文件
    RDB:
       快
       目的库必须开启才能用
    步骤:
        1.源库 执行  BGSAVE 
        2.copy 源库的.rdb文件至目标库
        3.重启目标库
    AOF:
       慢
       源库和目的库必须都开启才能用
    步骤:
        1.将源库的aof文件拷贝到目标库的数据目录中
       (两种方法)
        1.redis-cli  -p 6380  --pipe < ./appendonly.aof 
        2.重启
    建议采用RDB
    方法二:
    单库–>单库
    脚本,性能差,不建议使用

    #coding=utf-8
    import redis
    redis_from = redis.StrictRedis(host='127.0.0.1', port=6379, db=10)
    redis_to = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
    if __name__ == '__main__':
        cnt = 0
        for k in redis_from.keys():
            data_type = redis_from.type(k)
            if data_type == 'string':
                v = redis_from.get(k)
                redis_to.set(k, v)
            elif data_type == 'list':
                values = redis_from.lrange(k, 0, -1)
                redis_to.lpush(k, values)
            elif data_type == 'set':
                values = redis_from.smembers(k)
                redis_to.sadd(k, values)
            elif data_type == 'hash':
                keys = redis_from.hkeys(k)
                for key in keys:
                    value = redis_from.hget(k, key)
                    redis_to.hset(k, key, value)
            else:
                print 'not known type'
            cnt = cnt + 1
        print 'total', cnt

    **方法三:**
    阿里开源redis-shake工具
    解析、恢复、备份、同步
    参考另一篇文章:

    **方法四:**
    主从同步迁移
    步骤:
    1.redis-cli 进入客户端
    2.连接主
          >  slaveof ip port   
    3.info查看是否复制成功
    4.断开主
        > slavof no one
     

    更多相关内容
  • 数据库迁移常见的四种方法

    万次阅读 2019-10-20 23:09:46
    数据的迁移就像搬家,基本每个用过手机的人都做过数据迁移,将旧智能手机中的电话号码、照片、微信聊天记录导入到另一台新的智能手机。...今天我们来讲三常用的云数据库迁移方法。 一、为什么做云迁...

            数据的迁移就像搬家,基本每个用过手机的人都做过数据迁移,将旧智能手机中的电话号码、照片、微信聊天记录导入到另一台新的智能手机。因此数据迁移并不神秘。在上云的过程中,因数据的量更大、数据重要性更大、专业性更强,因此在公有云上诞生了“云迁移”这项目服务,在公有云市场也有上百个云服务商专业做“云迁移”服务。今天我们来讲三种常用的云数据库迁移方法。

     

            一、为什么做云迁移?

            1、更换服务器、更换云服务商。如,某台服务器故障,需要更换为新服务器;从私有云环境更换为公有云环境。

            2、应用的数据器升级、更换类型。如,将oracle更换为mysql。

            可以说做云迁移,就像更换手机一样,发生的概率还是挺高的,我们有必须要掌握必要的迁移技能。

     

            二、云迁移里面最重要的是数据迁移

            1、数据价值最高,不能丢失。应用服务器里不带有价值的数据,可以直接采用重新安装或整盘拷贝的方式迁移,难度不大。但数据库服务器的数据可以说是整个企业的财产关键。

            2、数据迁移的难度最大。数据库的版本升级将可以带来应用的不可用,因此迁移至新服务器,如果使用了云服务商的RDS,版本不一致,应用无法使用的概率挺大。

     

            三、数据库迁移总体有三种方法

            我们今天以mysql为例,讲讲数据库迁移的四种方法。

            1、将数据库倒出为sql文件,再重新导入(推荐)

            首先将mysql数据库锁定,并将内存中的数据写入磁盘。

            用mysqldump将test数据库导出为sql文件。

            在新的数据库服务器上,新建test数据库,再将sql文件导入。

            该方法因采用sql命令进行数据库迁移,兼容性最好,准确性最高,但速率最慢。

     

            2、将数据库的文件存档目录直接拷贝至新主机

            可以直接将mysql存储数据的目录copy下来,用ftp等方式上传至新主机的对应存储数据的目录下。该操作需要关闭两端的数据库服务,否则将产生错误。

            该方法只支持myql的MyIASM的表引擎。该方法迁移速度快,但因Mysql默认采用inno引擎,适用场景少,且数据库版本升级后出错率高。

     

            3、使用第三方数据库迁移工具

            mysql有很多第三方的数据库迁移工具,如mysqlhotcopy。此类工具一般支持热迁移(不中断业务,实时写数据),支持物理copy。

            该方法迁移速度快,对业务中断时间短,但建议迁移多进行模拟测试,避免意外事件。

            甚至有一些第三方的迁移工具支持异构数据库的迁移。

     

            4、使用整盘迁移工具

            采用云主机的第三方迁移工具,将整个磁盘文件直接进行迁移。

            该方法迁移速度快,对业务中断时间短,但成本高,一般为收费工具。

     

            四、小结

            迁移就像搬家,如何保证搬家时间短、搬家途中不损坏或遗失物品、搬家过程更安全,产生了不同的迁移方法。

            根据你家里资产的情况,根据不同场景选择搬家的方法,迁移也就是这回事。大家感觉如何?

     

       更多内容实时更新,请访问公众号。    

     

    展开全文
  • Mysql数据迁移方法

    千次阅读 2021-01-18 18:19:38
    MySQL迁移通常使用的有三种方法:1、数据库直接导出,拷贝文件到新服务器,在新服务器上导入。2、使用第三方迁移工具。3、数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。第一方案的...

    MySQL迁移通常使用的有三种方法:

    1、数据库直接导出,拷贝文件到新服务器,在新服务器上导入。

    2、使用第三方迁移工具。

    3、数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。

    第一种方案的优点:会重建数据文件,减少数据文件的占用空间,兼容性最好,导出导入很少发生问题,需求灵活。缺点:使用传统导出导入时间占用长。

    第二种方案的优点:设置完成后传输无人值守,自动完成。缺点:不够灵活,设置繁琐,传输时间长,异常后很难从异常的位置继续传输。

    第三种方案的优点:时间占用短,文件可断点传输,操作步骤少。缺点:新旧服务器中MySQL版本及配置必须相同,可能引起未知问题。

    假如数据库迁移是因为业务瓶颈或项目改造等需要变动数据表结构的(比如分区分表),我们便只能使用第一种方法了。

    我一般使用MySQL的 SELECT INTO OUTFILE 、LOAD DATA INFILE 快速导出导入数据

    【导出导出工作准备】

    导出前关闭日志,避免数据备份过程中频繁记录日志

    删除主键,关闭自动增长。在该表中主键其实作用不大,自动增长是需要的(mysql中自动增长的一列一定要为key,所以设置为主键),等待数据转移结束后重新设置回来

    删除表中索引。在插入数据时索引的存在会很大程度上影响速度,所以先关闭,转移后重新建立

    Mysql系统参数调优,如下:(具体含义后面给出)

    innodb_data_file_path           = ibdata1:1G:autoextend

    innodb_file_per_table           = 1

    innodb_thread_concurrency       = 20

    innodb_flush_log_at_trx_commit  = 1

    innodb_log_file_size            = 256M

    innodb_log_files_in_group       = 3

    innodb_max_dirty_pages_pct      = 50

    innodb_lock_wait_timeout        = 120

    key_buffer_size=400M

    innodb_buffer_pool_size=4G

    innodb_additional_mem_pool_size=20M

    innodb_log_buffer_size=20M

    query_cache_size=40M

    read_buffer_size=4M

    read_rnd_buffer_size=8M

    tmp_table_size=16M

    max_allowed_packet = 32M

    【操作方法及结果】

    (1)create table t2 as select * from t1

    CREATE TABLE dn_location3

    PARTITION BY RANGE (UNIX_TIMESTAMP(UPLOADTIME))

    (   PARTITION p141109 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-09 00:00:00')),

    PARTITION p141110 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-10 00:00:00')),

    PARTITION p141111 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-11 00:00:00')),

    PARTITION p141112 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-12 00:00:00'))

    )

    as select * from dn_location

    where uploadtime > '2014-08-04';

    create table t2 as select * from dn_location2;

    as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引。

    此方法效率较高,在前面的实验环境下,42min内将一张表内4600W的数据转到一张新的表中,在create新表时我添加了分区的操作,因此新表成功创建为分区表,这样一步到位的既转移了数据又创建了分区表。此方法平均速度:6570W条/h ,至于该方法其他需要注意的地方,暂时没有去了解。

    (2)使用MySQL的 SELECT INTO OUTFILE、LOAD DATA INFILE

    LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。当用户一前一后地使用SELECT ... INTO OUTFILE 和LOAD DATA INFILE 将数据从一个数据库写到一个文件中,然后再从文件中将它读入数据库中时,两个命令的字段和行处理选项必须匹配。否则,LOAD DATA INFILE 将不能正确地解释文件内容。

    假设用户使用SELECT ... INTO OUTFILE 以逗号分隔字段的方式将数据写入到一个文件中:

    SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM table2;

    为了将由逗号分隔的文件读回时,正确的语句应该是:

    LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';

    如果用户试图用下面所示的语句读取文件,它将不会工作,因为命令LOAD DATA INFILE 以定位符区分字段值:

    LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY '\t';

    下面是我用来导入导出的命令:

    select * into outfile 'ddd.txt' fields terminated by ',' from dn_location;

    load data infile 'ddd.txt' into table dn_location2  FIELDS TERMINATED BY ',';

    通过该方法导出的数据,是将各字段(只有数据,不导出表结构)数据存在一个文件中,中间以逗号分隔,因为文件中并不包含数据库名或者表名,因此需要在导入导出的时候些明确。该方法在18分钟内导出1.6亿条记录,46min内导入6472W条记录,平均速度:8442W条/h。mysql官方文档也说明了,该方法比一次性插入一条数据性能快20倍

    转自:

    https://www.jianshu.com/p/e9f0fea97bc3

    展开全文
  • 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

    展开全文
  • 数据迁移的几方式 - MySQL数据库

    万次阅读 多人点赞 2020-05-12 00:16:34
    本文关键字:MySQL、数据库、数据迁移、导入、导出。开始和数据库玩耍以后,我们将一直与SQL和数据打交道。在日常的操作中,我们只需要对指定的数据库进行操作,执行增删改查,权限管理等。但有些时候由于项目的升级...
  • 数据迁移常用方法

    万次阅读 2018-08-24 15:21:13
    SQL SERVER几种数据迁移/导出导入的实践 SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel、数据库与文本文件、数据库与数据库之间的导出导入)。 (一)数据库与Excel...
  • redis数据迁移方法

    千次阅读 2022-04-22 11:46:49
    方法一:离线迁移 通过RDB或者aof文件 RDB: 快 目的库必须开启才能用 步骤: 1.源库 执行 BGSAVE 2.copy 源库的.rdb文件至目标库 3.重启目标库 AOF: 慢 源库和目的库必须都开启才能用 步骤: 1.将源库的aof...
  • 下面小编就给大家描述一下电脑之间数据迁移方法。 首先,我们需要在新旧电脑上分别安装一款数据迁移软件——易我电脑迁移。然后按照以下步骤操作: 立即下载 适用于 Windows 10/8/7/Vista/XP .
  • 数据库数据迁移方法

    万次阅读 2019-05-14 10:55:47
    1.从旧数据库中将数据迁移到全新的数据库 2.有两个数据库A和B,A中需迁移表的结构和B一样,A和B中都有各自的数据,现在要同步两个数据库 方法: 通过单表查询插入SQL语句 通过写数据库存储过程 通过写程序(...
  • 数据迁移的几方式 - MySQL数据库 本文关键字:MySQL、数据库、数据迁移、导入、导出 文章目录 数据迁移的几方式 - MySQL数据库 一、数据迁移 1. 数据的生命周期 2. 数据迁移的发生 二、数据导出 1. ...
  • Elastic数据迁移方法及注意事项 需求 ES集群Cluster_A里的数据(某个索引或某几个索引),需要迁移到另外一个ES集群Cluster_B中。 环境 Linux:Centos7 / Centos6.5/ Centos6.4 Elastic:5.2.0 总结的方法 ...
  • 更换服务器时,数据迁移方法

    千次阅读 2021-08-04 08:39:44
    有时我们需要更换系统所在的服务器, 这时,我们需要数据库迁移数据, 这里我们介绍数据迁移方法迁移数据前,先要用企业管理器连接上数据库, 并且设置不要显示系统对象.如下图.进入数据库后,记下数据表所有者然后建立...
  • 数据迁移方案

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

    千次阅读 2019-11-15 20:44:21
    文章目录O、简介一、使用elasticdump工具迁移0.安装nodejs(如果已安装请忽略)1.升级nodejs2.安装elasticdump工具3.迁移指定索引的settings,...创建快照(快照备份数据)3.移动源ES集群snapshot至目标ES集群的仓库...
  • K8S数据迁移方法

    千次阅读 2019-11-29 15:13:49
    我们同样也需要改变现代应用程序存储数据的方式。企业越来越多地依赖数字服务来接触客户,传统企业正在Kubernetes上重新部署它们的IT应用和服务。容器的可移植性和Kubernetes自动化的好处意味着在整个IT开发/测试和...
  • 关于Redis的数据迁移(三种方法

    千次阅读 2020-05-20 11:26:39
    1、使用宝塔进行数据迁移 1.1、找到Redis的文件存储路径 点击首页软件的redis打开配置界面。 点击下面箭头指向地方就是对应的文件存储地方 其中还要RDB持久化,多久会插入一次,正常是不需要人为去保存一次。...
  • 数据库数据迁移的3方案学习

    千次阅读 2021-05-18 22:11:54
    1 背景 日常我们开发工作中,随着业务需求的变更,重构系统是很常见的事情。重构系统常见的一个场景是变更底层数据模型与存储结构。这种情况下就要对数据进行迁移,从而使业务能...数据迁移 数据导出 分库分表工具,
  • 企业云之旅的第一步通常是将数据迁移到云上。 AWS提供多种数据存储服务,并提供...通过本次在线研讨会,你将对AWS提供的6种数据迁移服务有个大致的了解,主要包括每迁移方法的优势和不足,以及他们之间的互补策略。
  • harbor数据迁移

    千次阅读 2022-01-25 20:02:15
    在某些情况下运行的harbor占用的磁盘过大或安装的默认位置磁盘过小,导致磁盘空间不足,需要将数据迁移到空间足够的磁盘上。 文章目录1、关闭harbor服务2、迁移数据3、修改Harbor配置文件harbor.yml4、启动Harbor...
  • 科普数据迁移技术和方法

    千次阅读 2017-07-05 22:27:33
    各种迁移方案的光环下隐藏着专业工程师的汗水,每个数据迁移项目和任务都是一次未知的挑战,只要凭借丰富的经验和不断的演练才能保障客户的数据在生命周期管理期间有更好的明天。
  • kafka数据和日志目录迁移教程

    千次阅读 2022-04-16 19:25:59
    Kafka在运行的过程中,存储在磁盘上的数据会逐渐扩大,甚至会撑爆系统盘,在线上环境我们通常会把kafka的数据存储目录和日志存储目录迁移到磁盘中,或者扩容kafka的存储磁盘。本文将一站式解决kafka的磁盘存储或扩容...
  • mysql8.0.20数据目录迁移方法

    千次阅读 2021-03-03 23:43:46
    本文使用mysql8.0.20版本,与mysql8.0.11版本不同,8.0.11版本的数据迁移请看另一篇博客:1.先停止mysql服务:service mysqld stop2.创建需要存放的目录位置并赋予权限:mkdir -p /bak/mysql_datachmod 766 /bak/mysql_...
  • 这篇文章分享下如何使用 DataGrip 实现数据库迁移
  • 在Hbase使用过程中,使用的Hbase集群经常会因为某些原因需要数据迁移。大多数情况下,可以跟用户协商用离线的方式进行迁移,迁移离线数据的方式就比较容易了,将整个Hbase的data存储目录进行搬迁就行,但是当集群...
  • Google Chrome浏览器用户数据迁移

    千次阅读 2022-03-15 03:51:10
    将Google Chrome迁移到其他盘,迁移后Chrome竟然无法启动,即是手工将目录恢复也不打开。在这里分享自己的填坑过程
  • 文章目录先从缓存击穿说起MySQL数据同步Canal工作原理搭建本地Canal中间件进行数据迁移 先从缓存击穿说起 所谓缓存击穿,就是热点数据在缓存中没有数据,大量用户请求直接打在数据库上,这是一非常危险的情况,...
  • 数据库迁移方法

    千次阅读 2021-06-10 16:14:18
    我们今天以mysql为例,讲讲数据库迁移四种方法。 1、将数据库倒出为sql文件,再重新导入(推荐)。 首先将mysql数据库锁定,并将内存中的数据写入磁盘。 flush tables with read lock ; 用mysqldump将test数据库...
  • 相对应的金融科技也在不断的更新和迭代,每次有新的软件系统出炉的时候,就是老的软件系统命运终结的开始,老的项目当然不会束手就擒,它也会做最后的挣扎,当你从它身上迁移用户或者商户的时候,它会给你带来很多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475,368
精华内容 190,147
关键字:

数据迁移的四种方法

友情链接: ExtremeDumper.rar