背景
现在我们需要将数据从一个老的实例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到无限大。