使用Datax将MySQL中的数据导入到TableStore中

背景

由于我们的数据在MySQL中的数据已经快接近亿级别,在访问MySQL并发读写的时候遇到了很大的瓶颈,严重的Block了我们的业务发展,主要从白天十点到晚上十点之前,并发访问的用户比较多,我们在写的前面加上了队列,系统后台自动同步。但是读上没有很好的办法解决,所以我们急需一个有较高吞吐量的实时存储系统。

本来准备自己搭建Hbase集群,但是考虑到运维代价和成本,最终放弃了这个方案。后面给阿里云发工单,了解到阿里云有一个类似于Hbase的产品,叫做TableStore,简单看了一下,总结一下优势:高并发、低延迟、按量计费、全托管。经历了一段时间的调研和使用之后,发现能满足我们业务需求,最终决定选用TableStore。

业务代码改造完成之后,需要将历史数据同步过去,使用了阿里开源的Datax插件,因此把整个迁移流程记录下来,分享给大家。

使用一键部署工具迁移数据

# 简单的5步实现数据迁移
# 下载包

# 第一步,下载一键部署包
git clone https://github.com/red-chen/one_key_install_datax.git

# 第二步,安装Datax
cd one_key_install_datax
sh datax.sh install

# 第三步,修改配置 (可以参考下面的样例进行配置,如果需要更高级的特性,请直接查看插件的帮助文档)
vim mysql_to_ots.json

# 第四步,运行
sh datax.sh run mysql_to_ots.json

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

准备插件

配置模板

  • 请自行修改{}中的内容
{
    "job": {
        "setting": {
            "speed": {
                "channel": "1"
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "{username}",
                        "password": "{passwd}",
                        "checkSlave":true,
                        "column": [
                            "{column_name}"
                        ],
                        "splitPk": "{pk}",
                        "connection": [
                            {
                                "table": [
                                    "{table_name}"
                                ],
                                "jdbcUrl": ["jdbc:mysql://{MySQL_HOST}:{MySQL_PORT}/{Database}"]
                            }
                        ]
                    }
                },
               "writer": {
                    "name": "otswriter",
                    "parameter": {
                        "endpoint":"{endpointnt}",
                        "accessId":"{accessId}",
                        "accessKey":"{accessKey}",
                        "instanceName":"{instanceName}",
                        "table":"{table}",
                        "primaryKey" : [
                            {"name":"{column_name}", "type":"{column_type}"}
                        ],
                        "column" : [
                            {"name":"{column_name}", "type":"{column_type}"}
                        ],
                        "writeMode" : "PutRow"
                    }
                }
            }
        ]
    }
}

样例

MySQL中的表

user_id type desc instance_count create_time
12009091 persion 李渊博 3 1467258591
12009092 company 北京天启传播有限公司 45 1460253572
*
*
*
*
  • 字段描述:

    • user_id 字符串
    • type 字符串
    • desc 字符串
    • instance_count 数值
    • create_time 数值

TableStore中的表

因为user_id是全局唯一的,所以我们只需要在TableStore创建一个PK为user_id的表即可,属性列不用创建,写入的时候直接创建

user_id

MySQL账户

  • host: tudou-user-rds.rds.cn-beiging.aliyun.com
  • port: 3163
  • user: root
  • passwd: 123456
  • db: meta
  • table: user_info

TableStore账户

  • endpoint: http://tudou-user.ots.cn-beiging.aliyun.com
  • accessId: testaccessid
  • accessKey: testaccesskey
  • instanceName: tudou-user
  • table: user_info

样例配置

{
    "job": {
        "setting": {
            "speed": {
                "channel": "1"
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "123456",
                        "checkSlave":true,
                        "column": [
                            "user_id", "type", "desc", "instance_count", "create_time"
                        ],
                        "splitPk": "user_id",
                        "connection": [
                            {
                                "table": [
                                    "user_info"
                                ],
                                "jdbcUrl": ["jdbc:mysql://tudou-user-rds.rds.cn-beiging.aliyun.com:3163/meta"]
                            }
                        ]
                    }
                },
               "writer": {
                    "name": "otswriter",
                    "parameter": {
                        "endpoint":"http://tudou-user.ots.cn-beiging.aliyun.com",
                        "accessId":"testaccessid",
                        "accessKey":"testaccesskey",
                        "instanceName":"tudou-user",
                        "table":"user_info",
                        "primaryKey" : [
                            {"name":"user_id", "type":"string"}
                        ],
                        "column" : [
                            {"name":"type", "type":"string"},
                            {"name":"desc", "type":"string"},
                            {"name":"instance_count", "type":"int"},
                            {"name":"create_time", "type":"int"}
                        ],
                        "writeMode" : "PutRow"
                    }
                }
            }
        ]
    }
}

性能调优

  • 前期工作和注意点

    • 因为我们数据量比较大,所以在启动迁移之前,我们通过工单主动联系了TableStore的工程师,帮我们把表按照第一列的数据范围拆分了多个分区,加快了数据的导入速度。
    • 在测试的时候,切记不要构造大量的数据,我们在测试的时候没有太注意,测试工程师搞了1千万的数据导入到TableStore中,因为TableStore是按量计费的,导致多交了很多钱!!
  • 在迁移的数据的时候,怎么调整速度?
    • 如果觉得导入速度太慢,可以适当的加大Channel数目,Channel的意义表示启动Datax的并发任务数目
  • 我在源DB上的数据类型是string,到目标源是否能强转为Int?
    • Datax使用了标准的Java转义方式,细节可以参考Java转义
时间: 2024-09-19 23:58:23

使用Datax将MySQL中的数据导入到TableStore中的相关文章

ASP.NET中如何用程序将excel中的数据导入到数据库中(C#)

问题描述 ASP.NET中如何用程序将excel中的数据导入到数据库中(C#),比较不同的时,excel只有一个表,里面是全部的详细信息,导入到sqlserver中的是多个表,这个如何实现?希望有具体的例子! 解决方案 解决方案二:大致原理:先将EXCEL导入GridView,然后再操作GridView中的数据存入数据库相应表中!在这里不能给你提供原码了,但你可以在Google内收到很多!解决方案三:用的是vs.net2003啊,应该如何?解决方案四:以下是我的一个真实的例子,供参考!<tr>

导入excel-php环境下把html页面table中的数据导入到Excel中

问题描述 php环境下把html页面table中的数据导入到Excel中 如题的问题,我看过网上一些解决方案,使用html5对象的方法可以忽略,因为我们的系统环境暂不支持html5:使用ActiveXObject方法的需要客户端支持,也不符合我们的设计思想.有没有更好解决办法,求详细方案. 解决方案 如果是客户端的,我也不知道怎么回答 如果是服务端导入的,我知道以下方案: 方案1,参考excel的openxml规范,生成对应的文件然后把这个文件打包为zip格式,这种方案最完美,然而我只有CLR下

c++-vc中用struct来将txt文件中的数据导入到数组中

问题描述 vc中用struct来将txt文件中的数据导入到数组中 我用的是struct来做的,但是显示的数据和原来数据不符,数据发生了变化,这是为什么?? 解决方案 是不是没有进行字节对其呢 如果没有字节对其 TA在解析的时候 可能会自动字节对齐了 解决方案二: 和struct没关系,你所谓的不一样:小数位数不一样.使用了科学计数法.列没对齐,都可以使用printf函数解决. cout默认输入当然不会给你做这些处理.

oracle9i中的数据导入到oracle10g中?

问题描述 oracle9i中的数据导入到oracle10g中? 系统是2003 64位系统中安装了oracle10g,怎么把原本oracle9i中的数据导入oracle10g中? 解决方案 如何用Oracle10g客户端导出Oracle9i数据,并将其导入到Oracle10g 解决方案二: 很简单,从原来的9i中exp出dmp然后在10g中imp 当然你没讲清楚服务器是同一台还是不同的两台,如果是同一台,需要分别到对应版本的目录下执行exp和imp 64位系统没有什么不同,唯一的问题,如果需要用

用java语言将Excel中的数据导入到SqlServer2000中

问题描述 怎样用java语言将Excel中的数据导入到SqlServer2000中? 解决方案 解决方案二:sqlserver本身就支持导入excel数据解决方案三:需要借助POI

通过vb.net开发的web将一个excel文件中的数据导入到oracle中 出错

问题描述 通过vb.net开发的web将一个excel文件中的数据导入到oracle中又什么别的比较好的办法吗?我试过了:先用FileUpload.SaveAs方法将文件保存在服务器的一个文件夹下在用OleDbDataAdapter.Fill方法将excel读入到dataset最后循环dataset将数据写入oracle出现了在我本地机器上好用,但是在上传到服务器上后能够保存,但是用oledb访问不了,OleDbConnection一open就出现未定义的错误2147467259 解决方案 解决

如何将oracle中的数据导入到excle中

由于需要将oracle中的数据导入到excle中,分享一下,^-^ 1,建立一个emp.sql文件我的是在F :\SQL\EMP.SQL set line 120set pagesize 100set feedback off --关闭类似于"已选11行"这样的输出反馈,以保证spool输出定义的--文件中只有我 --们想要的数据spool f:\excels\empselect * from emp;spool off 2 以scott用户登录, 执行  1中建立的emp.sql 在

怎么将datagridview中的数据导入到datatable中,并且批量存入数据库

问题描述 //从datagridview中获取数据,导入到datatable中privatevoidbutton3_Click(objectsender,EventArgse){DataTabledt=newDataTable();for(inti=0;i<dataGridView2.Rows.Count;i++){DataRowdr=dt.NewRow();for(intj=0;j<dataGridView2.Columns.Count;j++){dr[j]=dataGridView2.Ro

将Excel中的数据导入至MsSQLSERVER中(示例)

'/*************************************************************************/'/* EXCEL数据证书导入程序 */'/* 2003-6-13 yinxiang www.ykce.com */'/*************************************************************************/'/* dataIntoSqlServer_ceritificate(strFi