1.前提介绍
公司最近有个项目要做数据库之间的数据离线同步,经过调研在git上发现了袋鼠云的flinkx插件,感觉很好用,我们可以理解flnkx就是封装了同步操作的jar包,调用起来也很方便,我们只需要关注一个json文件,里面定义好reader和writer,就能够进行数据库数据同步,当前我们的需求只需要到离线的,其实选用flinkx也是考虑到以后拓展,毕竟flink本身支持实时同步,虽然我用的程度只是基本的mysql到mysql的操作,但以后有实时需求的时候,感觉flinkx应该也会有解决方案
2.实现成果
将flinkx插件的任务放在flink单节点集群上运行,mysql和mysql之间做数据离线同步
3.版本介绍
1.flinkx 1.10
2.flink1.11
3.centos7.6
4.顺序介绍
1.git上下载flinkx的源码:https://github.com/DTStack/flinkx ,需要自己编译, 编译过程可以完全参考袋鼠云的快速开始文档:https://github.com/DTStack/flinkx/blob/1.10_release/docs/quickstart.md
2.当你编译完成后,你只需要关注的只是lib,syncplugins,docs文件夹下的内容
lib(flinkx插件的main方法入口类所在,里面只有一个jar)
syncplugins(这个就是插件真正用的各种同步jar)
docs (你需要同步的reader和writer的json文件所在位置)
注意:后面我们需要将这三个文件夹下的文件拷贝到flink的解压路径下
3.下载flink1.11 ,直接去官网下载tar.gz直接在linux下解压即可
上面我们说过我们要将三个文件夹下的内容拷贝到flink的根目录下的某些路径下,我的flink下的结构最终是下面这个样子的
在这个里我先贴一下在flink上运行flinkx插件任务的命令,这样估计你就理解了这些路径下都是做啥的
1.先启动flink
bin/start-cluster.sh
2.将flinkx插件同步任务提交到flinkx
bin/flink run -c com.dtstack.flinkx.launcher.Launcher /dsg/dsg-flink.1.11/flink-1.11.3/opt/flinkx-launcher-1.6.jar -mode standalone -jobid taskName28714e8d8-8223-4842-aeab-ccb764607bc1 -job /dsg/dsg- flink.1.11/flink-1.11.3/docs/flink_input_flink_output_a9ba3e6f-43f6-429a-9a0f-f1587e13e671.json -pluginRoot /dsg/dsg-flink.1.11/flink-1.11.3/lib/syncplugins -flinkconf /dsg/dsg-flink.1.11/flink-1.11.3/conf/
上面的代码是为了方便你复制,下面我把它每个参数分别解释一下
./flink run -c com.dtstack.flinkx.launcher.Launcher /dsg/dsg-flink.1.11/flink-1.11.3/opt/flinkx-launcher-1.6.jar (这个就是类似于java启动命令指定启动类及jar所在位置)
-mode standalone (启动模式为standalone)
-jobid taskName28714e8d8-8223-4842-aeab-ccb764607bc1 (flinkx向flink集群提交的任务名称,这是flinkx中的一个定义,虽然这个参数在这里叫做jobId,它实际对应着flink任务的jobName)
-job /dsg/dsg-flink.1.11/flink-1.11.3/docs/flink_input_flink_output_a9ba3e6f-43f6-429a-9a0f-f1587e13e671.json (这个就是你指定的那个json,json里包含着reader和writer信息)
-pluginRoot /dsg/dsg-flink.1.11/flink-1.11.3/lib/syncplugins (flinkx打包后的插件包)
-flinkconf /dsg/dsg-flink.1.11/flink-1.11.3/conf/ (flink集群启动配置)
须知:flinkx我们操作的核心实际上就是那个json文件,在我这里我的json文件都在flink的根路径下的docs下,flinkx会读取json文件并且将数据按照里面的reader和writer进行同步,
{
"job": {
"content": [
{
"reader": {
"parameter": {
"username": "root",
"password": "mysql123",
"connection": [{
"jdbcUrl": ["jdbc:mysql://192.168.23.133:3306/test_zy?useUnicode=true&characterEncoding=utf8&useSSL=false"],
"table": ["flinkx_input"]
}],
"column": ["*"],
"customSql": "",
"splitPk": "",
"queryTimeOut": 1000,
"requestAccumulatorInterval": 2
},
"name": "mysqlreader"
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "mysql123",
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.23.133:3306/test_zy?useSSL=false",
"table": ["flinkx_output"]
}
],
"writeMode": "insert",
"column": ["id","name"],
"batchSize": 1024
}
}
}
],
"setting": {
"speed": {
"channel": 1,
"bytes": 0
},
"errorLimit": {
"record": 100
},
"restore": {
"maxRowNumForCheckpoint": 0,
"isRestore": false,
"restoreColumnName": "",
"restoreColumnIndex": 0
},
"log" : {
"isLogger": false,
"level" : "debug",
"path" : "",
"pattern":""
}
}
}
}
相信你通过读取这个json文件应该会知道都代表何种意思,官方文档有详细介绍