在不同的数据库系统之间做数据同步是大数据领域里常见的需求。一个典型的场景是,业务系统因为需要事务和随机查询,一般会使用 MySQL 这种数据库;数据仓库使用 Hive;ETL 之后的结果再放到 MySQL、AWS Redshift 等系统给 BI 和报表工具使用。 首先梳理一下需求和目标: 实时性:非实时,离线同步,一般为 T+1,或最细到小时粒度 扩展性:需要支持多种异构数据源,如 MySQL, Hive, ElasticSearch 等 性能要求:因为是离线系统,对性能要求无严格要求,但最好尽可能快,并有可能调优 复杂度:复杂度低,依赖少,易使用,易运维 功能要求:要满足全量同步和增量数据同步 解决方案 数据同步并不是一个特殊的问题,简化一下其实就是两个操作:读和写。与之类似的是数据库备份和恢复,很多数据库系统都自带这种工具,比如 MySQL 的 mysqldump 和 mysqlimport ,MongoDB 的 mongodump 和 mongorestore 等。这些工具一般为了性能而使用特殊的编码格式,不会考虑通用性。但一个通用的数据同步系统,可以采用同样的思路来实现。 上图描述的就是本文的解决方案,即把读写拆分,通过 CSV 文件来过度。 扩展性 这种设计的核心是把数据同步抽象成导出(读)和导入(写)两个过程,完全解耦,因此具有很好的扩展性。每种数据源只需要实现读写两种操作即可。以常见的数据源为例,看看分别如何实现从 CSV 导入数据(导出到 CSV 很容易,使用任意编程语言都可实现)。 数据源 导入 CSV MySQL 使用 LOAD DATA LOCAL INFILE 批量加载,或读取文件运行 INSERT 语句 AWS Redshift 以 AWS S3 为中转,使用 COPY 命令批量加载 Hive 建表时指定 Serde 为 org.apache.hadoop.hive.serde2.OpenCSVSerde ,或者在导入前把 CSV 先转换成默认的 TEXTFILE 格式;然后使用 LOAD DATA [LOCAL] INPATH 批量加载。 ElasticSearch 读取文件,批量插入 FTP, AWS S...
评论