TableStore: 使用Datax将实例A的数据迁移到实例B中

背景

现在我们需要将数据从一个老的实例A迁移到实例B上面,做一下备份,我们打算使用Datax作为我们的数据传输工具,其中用到了otsreader和otswriter。

将数据从A实例备份到B实例

  • 第一步,TableStore环境准备,当前Datax不支持自动建表的功能,所以我们需要在B中创建迁移对应的表。创建表的时候有两个选择,第一是使用 ots cli,第二是使用table store的SDK。我们建议使用SDK。
 ots cli : https://market.aliyun.com/products/53690006/cmgj000264.html?spm=5176.730005.0.0.CEf1EF
 sdk: https://www.aliyun.com/product/ots
于此同时获取A和B的相关信息。后面的配置都要使用下面的信息,所以提前准备好。信息如下:
## 实例A
## endpoint:http://a.cn-hangzhou.ots.aliyuncs.com
## ak(秘钥): ******
## 实例:A
## Table: person_info
## 主键:uid(string), pid(int)
## 属性列:length(int),address(string),country(string),description(string)

## 实例B
## endpoint:http://b.cn-hangzhou.ots.aliyuncs.com
## ak(秘钥): ******
## 实例:B
## Table: person_info
## 主键:uid(string), pid(int)
  • 第二步,Datax环境准备,找一台机器两边都能联通的ECS,在ECS上面部署Datax
git clone https://github.com/red-chen/one_key_install_datax.git
cd one_key_install_datax
sh datax.sh install
  • 第三步,编辑Datax Job的配置
# 我们这里会使用到两个插件,分别是otsreader和otswriter,
# otsreader的帮助文档:https://github.com/alibaba/DataX/blob/master/otsreader/doc/otsreader.md 
# otswriter的帮助文档:https://github.com/alibaba/DataX/blob/master/otswriter/doc/otswriter.md 
# 配置如下:

vim ots_to_ots.json

{
    "job": {
        "setting": {
            "speed": {
                "channel": "1"
            }
        },
        "content": [
            {
                "reader": {
                    "name": "otsreader",    
                    "parameter": {
                        "endpoint":"http://a.cn-hangzhou.ots.aliyuncs.com",
                        "accessId":"*********",
                        "accessKey":"*********",
                        "instanceName":"A",
                        "table":"person_info",
                        "column" : [
                            {"name":"uid"},
                            {"name":"pid"},
                            {"name":"length"},
                            {"name":"address"},
                            {"name":"country"},
                            {"name":"description"}
                        ],
                       "range": {
                            "begin":[{"type": "INF_MIN"},{"type": "INF_MIN"}],
                            "end":[{"type":"INF_MAX"},{"type": "INF_MAX"}],
                           "split":[]      
                       }
                    }
                },
               "writer": {
                    "name": "otswriter",
                    "parameter": {
                        "endpoint":"http://b.cn-hangzhou.ots.aliyuncs.com",
                        "accessId":"*********",
                        "accessKey":"*********",
                        "instanceName":"B",
                        "table":"person_info",
                        "primaryKey" : [
                            {"name":"uid", "type":"string"},
                            {"name":"pid", "type":"int"}
                        ],
                        "column" : [
                            {"name":"length", "type":"int"},
                            {"name":"address", "type":"string"},
                            {"name":"country", "type":"string"},
                            {"name":"description", "type":"string"}
                        ],
                        "writeMode" : "PutRow"
                    }
                }
            }
        ]
    }
}
  • 第四步,启动Datax
# datax会每10秒打印一次速率,可以根据这个速率评估大体的迁移时间
sh datax.sh run ots_to_ots.json


# 等待执行完毕,结束的样例如下:
任务启动时刻                    : 2016-06-30 00:00:00
任务结束时刻                    : 2016-06-30 16:00:00
任务总计耗时                    :              57600s
任务平均流量                    :               1.2M/s
记录写入速度                    :            1736rec/s
读出记录总数                    :           100000000
读写失败总数                    :                   0

高级选项

由于很多时候数据量会非常大,但是全量迁移(备份)的时间因为业务的原因受到了限制,需要很快的将数据备份过去。这个时候需要开启高级选项。插件支持并发的的迁移数据,这里需要利用到otsreader的range并发读功能。其实原理很简单,就是讲表拆分成多份,并发的读取数据。步骤如下

# 第一步,环境准备,创建要目标表

# 第二步,计算Range的个数,可以先简单跑一下迁移任务,看看当个Range(没有配置Split,默认就是一个Range)的速率是多少,一般是1M~10M之间,具体的大小和单行的大小有一定关系,比如我们要1000秒跑完,单个Range只有5M/s,数据量为10GB,所以可以得到Range:10GB / 5M / 1000秒 = 2,需要两个Range任务。

# 第三步,发送工单,要求阿里的工程师将源表和目标表,分为2个分区,并提供一下分区的分区点。如我们的表,第一列是Int类型的,数据范围是0~10000,且数据是均匀在这个范围内分布。所以分区之后,第一个分区的数据范围是0~5000,第二个是5000~10000,所以可以得到的迁移范围是[0, 5000), [5000, 10000),分区点(split)就是5000

# 第四步,修改配置,修改reader的的range配置在split中添加一个切分点,如下配置:


    "split":[
        {"type":"int", "value":"5000"}
    ]

同时修改channel为2,如下:

"speed": {
        "channel": "2"
 }

# 上面配置的意思就是将导入任务拆分一次,拆分点就是5000。这样配置之后,datax任务将会被拆分为2个并发线程,第一个线程导的数据范围就是无限小到5000,第二个就是5000到无限大。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值