大数据常用数据同步工具
背景
如果公司要搞数据平台,首当其冲的是把旧库的数据导入到新库中,原本各种数据库大部分都提供了导入导出的工具,但是数据存储到 (mongdb,hbase,mysql,oracle) 等多种不同的数据库,同步起来头都大,这时候就可以用到一些数据同步工具了。
离线导入导出
DataX
阿里的 Datax 是比较优秀的产品,基于 python,提供各种数据村塾的读写插件,多线程执行,使用起来也很简单,定义好配置 json 文件执行脚本就可以了,非常适合离线数据,增量数据可以使用一些编码的方式实现,但是也仅仅针对 insert 数据比较有效,update 数据就不适合。
github 地址:https://github.com/alibaba/DataX
Sqoop
Sqoop 是针对大数据而生的,专注于 Hadoop(Hive) 与传统的数据库数据的传递,是 Hadoop 生态的一员。在数据库的支持的丰富性上不如 DataX,但是如果你用 hadoop,用 sqoop 是更好的选择,因为做 Apache 的顶级项目,他背后的支持远远比阿里一家公司靠谱的多。
Sqoop(发音:skup)是一款开源的工具,主要用于在 Hadoop(Hive)与传统的数据库 (mysql、postgresql…) 间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres 等)中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。
Kettle
Kettle 作为传统 ETL 工具,目前也都已经有了 nosql 数据库的支持,而且 kettle 还有图形界面可以用,使用起来简单多了。而且本来就是专门做 ETL 的,是 Pentaho 指定的 ETL 组件,对于数据清洗等处理数据的环节支持更好。但是数据效率一般,而且在生产环境也很少弄台 windows 机器,适合小项目,数据量比较小的同步。
Kettle 是一款国外开源的 ETL 工具,纯 java 编写,可以在 Window、Linux、Unix 上运行,数据抽取高效稳定。
Kettle 中文名称叫水壶,该项目的主程序员 MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。
实时同步
实时同步最灵活的还是用 kafka 做中间转发,当数据发生变化时,记录变化到 kafka,需要同步数据的程序订阅消息即可,需要研发编码支持。这里说个 mysql 数据库的同步组件,阿里的 canal 和 otter
canal
canal 是基于 mysql 的 binlog 进行数据同步的中间件。简单来说,Canal 会将自己伪装成 MySQL 从节点(Slave),并从主节点(Master)获取 Binlog,解析和贮存后供下游消费端使用。Canal 包含两个组成部分:服务端和客户端。服务端负责连接至不同的 MySQL 实例,并为每个实例维护一个事件消息队列;客户端则可以订阅这些队列中的数据变更事件,处理并存储到数据仓库中。
github 地址:https://github.com/alibaba/canal
使用的话,安装好 canal,配置好数据库参数,再编写一个客户端消费 canal 传过来的数据就可以了。详情查看官网。
otter
github 地址:https://github.com/alibaba/otter
otter 是在 canal 基础上又重新实现了可配置的消费者,使用 otter 的话,刚才说过的消费者就不需要写了,而 otter 提供了一个 web 界面,可以自定义同步任务及 map 表。非常适合 mysql 库之间的同步。
而且通过 retl_buff 表的监控,也可以实现一些全量数据的同步。
但是 otter 也有一些不好的地方,比如界面上的参数并不是所有的都有用,文档写的一般,不是很清晰。但是想想省了好多事,还是非常好的一款中间件。
详细查看官网,安装部署研究下问题不大。
全量与增量
数据同步一般分为两种方式:全量和增量。
全量
全量,这个很好理解。就是每天定时(避开业务高峰期)或者周期性全量把数据从一个地方拷贝到另外一个地方;
全量的话,可以采用直接全部覆盖(使用“新”数据覆盖“旧”数据);或者走更新逻辑(覆盖前判断下,如果新旧不一致,就更新);
这里面有一个隐藏的问题:如果采用异步写,主数据物理删除了,怎么直接通过全量数据同步?这就需要借助一些中间操作日志文件,或者其他手段,把这些“看不到”的数据记录起来。
增量
增量,就是指抓取某个时刻(更新时间)或者检查点(checkpoint)以后的数据来同步,不是无规律的全量同步。
这里引入一个关键性的前提:副本一端要记录或者知道(通过查询更新日志或者订阅更新)哪些更新了。