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

本文涉及的产品
对象存储 OSS,20GB 3个月
文件存储 NAS,50GB 3个月
云备份 Cloud Backup,100GB 3个月
简介: 背景 由于我们的数据在MySQL中的数据已经快接近亿级别,在访问MySQL并发读写的时候遇到了很大的瓶颈,严重的Block了我们的业务发展,主要从白天十点到晚上十点之前,并发访问的用户比较多,我们在写的前面加上了队列,系统后台自动同步。但是读上没有很好的办法解决,所以我们急需一个有较高吞吐量的实时

背景

由于我们的数据在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账户

样例配置

{
    "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转义
目录
相关文章
|
22天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
125 0
|
4天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
104 10
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
4天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
33 14
|
7天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
36 9
|
19天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
15天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
35 1
|
16天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
|
3月前
|
数据采集 DataWorks 监控
DataWorks产品使用合集之数据集成并发数不支持批量修改,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
29天前
|
数据采集 DataWorks 数据管理
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第10天】随着大数据技术的发展,企业对数据处理的需求日益增长。阿里云推出的DataWorks是一款强大的数据集成和管理平台,提供从数据采集、清洗、加工到应用的一站式解决方案。本文通过电商平台案例,详细介绍了DataWorks的核心功能和优势,展示了如何高效处理大规模数据,帮助企业挖掘数据价值。
79 1
|
1月前
|
数据采集 SQL DataWorks
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第5天】本文通过一家电商平台的案例,详细介绍了阿里云DataWorks在数据处理全流程中的应用。从多源数据采集、清洗加工到分析可视化,DataWorks提供了强大的一站式解决方案,显著提升了数据分析效率和质量。通过具体SQL示例,展示了如何构建高效的数据处理流程,突显了DataWorks相较于传统工具如Excel的优势,为企业决策提供了有力支持。
87 3