实时需求功能开发,两表实时增量同步——datax

现在需要mysql几张表实时同步到一个地方,考虑到增量、性能问题,做出以下重要文档。

 

 

 

某几张表实时同步


实时需求开发

一、技术组件调研

1.sqoop方式
无法实时


2.flume方式。
可以参考文章:
https://blog.csdn.net/wzy0623/article/details/73650053

方案优缺点
        利用Flume采集关系数据库表数据最大的优点是配置简单,不用编程。相比tungsten-replicator的复杂性,Flume只要在flume.conf文件中配置source、channel及sink的相关属性,已经没什么难度了。而与现在很火的canal比较,虽然不够灵活,但毕竟一行代码也不用写。再有该方案采用普通SQL轮询的方式实现,具有通用性,适用于所有关系库数据源。
        这种方案的缺点与其优点一样突出,主要体现在以下几方面。
在源库上执行了查询,具有入侵性。
通过轮询的方式实现增量,只能做到准实时,而且轮询间隔越短,对源库的影响越大。
只能识别新增数据,检测不到删除与更新。
要求源库必须有用于表示增量的字段。
        即便有诸多局限,但用Flume抽取关系库数据的方案还是有一定的价值,特别是在要求快速部署、简化编程,又能满足需求的应用场景,对传统的Sqoop方式也不失为一种有效的补充。


3.触发器方式
这个方案在非高并发情况下可行,如果并发较高,可以考虑中间表并且记录版本号,来应对同条记录的多次操作。
https://blog.csdn.net/qq_22543991/article/details/82344282
维护成本高

4.曾经使用起来不是很友好的kettle

5.Otter&Canal
阿里开源,otter的node自带集成cannal
缺点。
在极端情况下:依赖的是binlog进行同步的,但是阿里云RDS对于binlog是有做定时清理操作的。所以如果用canal去通过binlog同步的话 一旦RDS的binlog 清理了 将无法同步,并且无法找回之前的数据。
如果考虑到只是同步极少数的表,就用了mysql的触发器。


6.datax

先从这篇文章了解一下。
https://www.codercto.com/a/45069.html

缺点:必须用python2,原因:因为后面执行datax.py的时候,里面的python的print会执行不了,导致运行不成功,会提示你print语法要加括号,python2中加不加都行 python3中必须要加,否则报语法错
阿里开源
调研下来这个组件简单容易!
https://blog.csdn.net/qq_37552993/article/details/80235010


如何优雅的实现增量?
参考文章:
https://blog.csdn.net/u010429286/article/details/82356121
请参考:
"writer":{
    "name": "mysqlwriter",
    "parameter": {
        "writeMode": "insert",  // 写入模式可以选择insert/replace/update
        "username": "root",
        "password": "root",
        "column": [
            "id",
            "name"
        ],
        "session": [
            "set session sql_mode='ANSI'"
        ],
        "preSql": [
            "delete from test" // 预执行SQL,可以选择一个delete语句
        ],
        "connection": [
            {
                "jdbcUrl": "jdbc:mysql://127.0.0.1:3306/datax?useUnicode=true&characterEncoding=gbk",
                "table": [
                    "test"
                ]
            }
        ]
    }
}


其中parameter中的writeMode可以选择insert,update,replace。并且有preSql选项,也就是在导入之前可以执行一些SQL,对我们全量数据和增量数据提供了有效的方案。

全量数据导入:通过preSql传入一条delete语句,然后writerMode选择insert执行导入(甚至如果有比较高的权限,可以直接用truncate语句,但是一般dba才有的这样权限),在delete的时候需要注意,如果数据量太大的情况下,一条delete就足以让dba找上门拉,所以添加索引就有必要拉,根据索引删除就会快一些。

增量数据导入:选择writeMode使用update,这里dataX是通过on duplicate key update语句来实现数据的增量实现,也就是说表里面有唯一键或者主键冲突时,覆盖原来的数据,这就很容易理解了,比如订单数据,订单号肯定是一个唯一键,如果导入一个已存在的订单,数据肯定会覆盖原来的数据。


二、关于otter、canal搭建与使用

    1.认识otter、canal
    https://blog.csdn.net/liupeifeng3514/article/details/79687130

    2.环境搭建详细版本。
    https://www.cnblogs.com/zhjh256/p/9261725.html

    3.cannal简单使用
    https://www.cnblogs.com/java-spring/p/8930740.html


    4.我们开始搭建,并且记录报错问题。一步步将此技术落实成功

三、关于datax的分钟级人物铺设


1.下载与安装。
下载页面地址:https://github.com/alibaba/DataX 在页面中【Quick Start】--->【Download DataX下载地址】进行下载。下载后的包名:datax.tar.gz。解压后{datax}目录下有{bin conf job lib log log_perf plugin script tmp}几个目录。
解压缩
tar -zxvf 文件名

然后我们配置json文件了

 python /root/lsz/datax/bin/datax.py /root/lsz/datax/job/mysql2mysql.json
 
 
 
 2.mysql 与hive表互相导入的文档:
 
 https://blog.csdn.net/dr_guo/article/details/82222151
 
 本文纯属原创,仅提供学习作用,请勿复制和转载。
 
 

 

3.压力测试明天进行,先截图一下目前的测试虚拟机。

实时需求功能开发,两表实时增量同步——datax_第1张图片

 

 

此外,参考这篇文章,对于增量更加的有体会。

 

 

听说生成服务器会很快很快。

你可能感兴趣的:(大数据,azkaban)