目前业务中需要进行数据同步, 考虑使用datax数据同步方式替换掉现有的同步方式

业务场景:

即将业务中每天生成的日志表中的数据部分字段同步到自己的库中,进行后台数据的查询

起因:

  之前“大神”写的逻辑中使用每三分钟更新一次的策略进行数据同步,在redis中进行计数和打标记的方式进行数据的增量同步,但是最近发现经常数据会发生丢失的问题,于是进行问题的修复

解决:

了解到运营对于这些数据的查询实时性并没有这么高,今天查询昨天的数据这种场景比较多,于是打算使用datax凌晨同步昨天的数据到本地即可,节省资源,减少调用业务的数据库频次

DataX: https://github.com/alibaba/DataX

基于java的同步开源项目,基本使用起来较为容易,简单配置即可,完成之后 3万多的数据 只需要不到10秒中就完成了数据同步工作

数据库-mysql相关的reader和writer相关配置参考:

  • https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md
  • https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md

当然他还支持很多的数据库

安装)

1)下载源码包

wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz

基于java, 保证已经安装了Java,推荐8版本,安装方式,可见本博客,

cd /usr/local/src/

wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gz
tar -zxvf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201 /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=${JAVA_HOME}/bin:${PATH} source /etc/profile
java -version 查看版本

2)解压datax

tar -zxvf datax.tar.gz

执行一个demo
python datax/bin/datax.py datax/job/job.json 注意:这里使用的是python2 版本

2)示例

  1.MySQL同步到MySQL

{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"connection": [
{
"querySql": [
"select player_id,UNIX_TIMESTAMP(create_time) AS create_time from t_player_log__20210422"
],
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/demo"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password":"123456",
"column": [
"player_id",
"create_time"
],
"session": [
"set names utf8mb4"
],
"connection": [
{
"encoding": "UTF-8",
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/test",
"table": [
"tt_player_log"
]
}
]
}
}
}
]
}
}

  还支持传入参数的方式动态的配置(python bin/datax.py 支持的参数:-p),例如:

{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "${username}",
"password": "${password}",
"connection": [
{
"querySql": [
"select player_id,UNIX_TIMESTAMP(create_time) AS create_time from t_player_log__${dateNum}"
],
"jdbcUrl": [
"jdbc:mysql://${ip}:${port}/${db}"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password":"123456",
"column": [
"player_id",
"create_time"
],
"session": [
"set names utf8mb4"
],
"connection": [
{
"encoding": "UTF-8",
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/test",
"table": [
"${table}"
]
}
]
}
}
}
]
}
}

  同步命令:

/bin/python /opt/datax/bin/datax.py /opt/datax/job/game_job.json -p"-Dusername=xxxx -Dpassword=xxx -Dip=xx.xx.xx.xx -Dport=3306 -Ddb=xx -Dtable=xx -DdateNum=20210423"

注意:如果密码中有特殊字符,需要使用单引号将其引起来

相关的job任务会放到job目录下, 新建一个shell脚本放到script下, run_jobs.sh,将相关数据库连接配置到一个数据表中, 添加上定时任务即可

#!/bin/bash

#说明:
# 执行同步游戏库玩家日志表数据 day_num=`date -d "-1 day" +%Y%m%d`
#day_num=`date +%Y%m%d` main(){
mysql -hxx.xx.xx -Pxx -uxx -pxx -N -e "select game_name,app_id,ip,port,username,password,db_name,player_log_table from t
xx.tt_game_db where type=2 and status=1" | while read game_name app_id ip port username password db_name player_log_table
do
echo "当前游戏:$game_name[$app_id] 数据库信息:$username:$password@$ip:$port/$db_name 目标表:$player_log_table"
#echo "-Dusername=$username -Dpassword=$password -Dip=$ip -Dport=$port -Ddb=$db_name -Dtable=$player_log_table -DdateNum=$day_num"
/bin/python /opt/datax/bin/datax.py /opt/datax/job/game_job.json -p"-Dusername=$username -Dpassword=$password -Dip=$ip -Dport=$port -Ddb=
$db_name -Dtable=$player_log_table -DdateNum=$day_num" done
} main

  2)MongoDB同步到MySQL

{
"job": {
"setting": {
"speed": {
"channel": 2
}
},
"content": [
{
"reader": {
"name": "mongodbreader",
"parameter": {
"address": ["127.0.0.1:27017"],
"userName": "dataxUser1",
"userPassword": "xxxxx",
"dbName": "log_1",
"collectionName": "20210101",
"column": [
{
"name": "uid",
"type": "int"
},
{
"name": "match_id",
"type": "string"
}
],
"query": { // 添加筛选条件
"func_name":"play",
"play_type": {
"$in": [2,3]
}
}
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "gameUser",
"password": "xxxxx",
"column": [
"player_index",
"table_id"
],
"session": [
"set names utf8mb4"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/game_log",
"table": [
"game_record_log"
]
}
]
}
}
}
]
}
}

注意点: 这里的MongoDB的用户名和密码 要开一个这个库的所属人的权限
db.createUser({user:"dataxUser1",pwd:"xxxx",roles:[{role:"dbOwner", db:"log_1"}]})

后面为了通用, 需要将这里配置的MongoDB的信息和MySQL的信息都通过变量的方式传递进来

在script目录下添加shell执行脚本,例如:run_jobs_for_mongo2mysql.sh

#!/bin/bash
## 传入开始和结束时间将MongoDB(10十个库)中每个库指定日期范围内的数据同步到MySQL
begin_date=$1
end_date=$2
begin_time=$begin_date mongo_user_prefix="dataxUser"
mongo_pwd=xxxx
mongo_db_name_prefix="log_"
mongo_table_name_prefix="game_" mysql_user="mysqlUser"
mysql_pwd="xxx"
mysql_host="127.0.0.1"
mysql_port=3306
mysql_db_name="game_log"
mysql_table_name="game_record_log" main(){
for n in $(seq 1 10)
do
while [ "$begin_date" != "$end_date" ]
do
echo $begin_date
mongo_user=$mongo_user_prefix$n
mongo_db_name=$mongo_db_name_prefix$n
mongo_table_name=$mongo_table_name_prefix$begin_date
echo "-Dmongo_user=$mongo_user -Dmongo_pwd=$mongo_pwd -Dmongo_db_name=$mongo_db_name -Dmongo_table_name=$mongo_table_name -Dmysql_user=$mysql_user -Dmysql_pwd=$mysql_pwd -Dmysql_host=$mysql_host -Dmysql_port=$mysql_port -Dmysql_db_name=$mysql_db_name -Dmysql_table_name=$mysql_table_name"
/bin/python /opt/data/datax/bin/datax.py /opt/data/datax/job/game_mongo2mysql_job.json -p"-Dmongo_user=$mongo_user -Dmongo_pwd=$mongo_pwd -Dmongo_db_name=$mongo_db_name -Dmongo_table_name=$mongo_table_name -Dmysql_user=$mysql_user -Dmysql_pwd='$mysql_pwd' -Dmysql_host=$mysql_host -Dmysql_port=$mysql_port -Dmysql_db_name=$mysql_db_name -Dmysql_table_name=$mysql_table_name"
let begin_date=`date -d "-1 days ago ${begin_date}" +%Y%m%d`
done
begin_date=$begin_time
echo $end_date
done
}
main

常见问题:

1.如果数据表中有特殊表情的时候, 可能会出现字符错误的报错信息, 这个时候需要进行设置

"session": [
"set names utf8mb4"
],

更多同步工具:

  • canal
  • CloudCanal(https://www.clougence.com/)

数据同步之DataX的更多相关文章

  1. 环境篇:数据同步工具DataX

    环境篇:数据同步工具DataX 1 概述 https://github.com/alibaba/DataX DataX是什么? DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 ...

  2. 比Sqoop功能更加强大开源数据同步工具DataX实战

    @ 目录 概述 定义 与Sqoop对比 框架设计 支持插件 核心架构 核心优势 部署 基础环境 安装 从stream读取数据并打印到控制台 读取MySQL写入HDFS 读取HDFS写入MySQL 执行 ...

  3. 数据同步DataX

    数据同步那些事儿(优化过程分享)   简介 很久之前就想写这篇文章了,主要是介绍一下我做数据同步的过程中遇到的一些有意思的内容,和提升效率的过程. 当前在数据处理的过程中,数据同步如同血液一般充满全过 ...

  4. Spark记录-阿里巴巴开源工具DataX数据同步工具使用

    1.官网下载 下载地址:https://github.com/alibaba/DataX DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlSe ...

  5. 基于datax的数据同步平台

    一.需求 由于公司各个部门对业务数据的需求,比如进行数据分析.报表展示等等,且公司没有相应的系统.数据仓库满足这些需求,最原始的办法就是把数据提取出来生成excel表发给各个部门,这个功能已经由脚本转 ...

  6. 数据同步工具Sqoop和DataX

    在日常大数据生产环境中,经常会有集群数据集和关系型数据库互相转换的需求,在需求选择的初期解决问题的方法----数据同步工具就应运而生了.此次我们选择两款生产环境常用的数据同步工具进行讨论 Sqoop ...

  7. 数据同步Datax与Datax_web的部署以及使用说明

    一.DataX3.0概述 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高 ...

  8. 执行 dataX 数据同步命令

    :: 执行 dataX 数据同步命令 @echo off set day_interval=7@echo =========开始执行dataX数据同步========= @echo 时间周期为最近%d ...

  9. 淘宝异构数据源数据交换工具 DataX

    淘宝异构数据源数据交换工具 DataX 阅读目录 DataX是什么? DataX用来解决什么? DataX特点? DataX结构模式(框架+插件) DataX在淘宝的运用 DataX是什么? Data ...

  10. 大数据 --> 淘宝异构数据源数据交换工具 DataX

    淘宝异构数据源数据交换工具 DataX DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesys ...

随机推荐

  1. musl libc 与 glibc 在 .NET 应用程序中的兼容性

    musl Linux 和 glibc 是两种不同的 C 标准库实现,它们在多个方面存在显著差异. 历史和使用情况: glibc 是较早且广泛使用的 C 标准库实现,具有较长的开发历史和广泛的社区支持. ...

  2. springboot 集成 onlyoffice 实现文档预览、编辑、pdf转化、缩略图生成

    开源地址 https://gitee.com/lboot/lucy-onlyoffice 介绍 lucy-onlyoffice是依赖于onlyoffice的springboot文档预览编辑集成解决方案 ...

  3. opencv colors

    """ 在利用python进行画图时,我们可能常常用的颜色就是'k'黑色,'r'红色,'b'蓝色,'g'绿色等,这些颜色分别代表常见的 几种颜色.但是当我们画图比较多时, ...

  4. 低代码 + BI 数字化转型如何助力制造业供应链协同?

    引言 在当今快速变化的商业环境中,制造业面临着前所未有的挑战和机遇.全球化竞争.消费者需求的快速变化.技术创新的加速以及不断增加的成本压力,都要求制造企业不断提高其供应链的效率和灵活性.供应链协同作为 ...

  5. Identity – Options

    前言 上一篇已经有写到一些配置了, 但不完整, 这里专门写一篇吧. 防暴力登入 services.Configure<IdentityOptions>(options => { // ...

  6. C# 中的 AEAD_AES_256_GCM

    注意:AEAD_AES_256_GCM Key的长度必须是32位,nonce的长度必须是12位,附加数据有可能为空值.AEAD_AES_128_GCM Key的长度必须是16位,nonce的长度必须是 ...

  7. PTA甲级—树

    1.树的遍历 1004 Counting Leaves (30分) 基本的数据结构--树,复习了链式前向星,bfs遍历判断即可 #include <cstdio> #include < ...

  8. Go runtime 调度器精讲(七):案例分析

    0. 前言 前面用了六讲介绍 Go runtime 调度器,这一讲我们看一个关于调度 goroutine 的程序案例分析下调度器做了什么.需要说明的是,这个程序和抢占有关,抢占目前为止还没有介绍到,如 ...

  9. SpringMVC —— RESTful案例

    案例:基于RESTful页面数据交互            

  10. huge 发在家长群的图片