背景
在大部分场景下,业务数据都是存放在MySQL中的,有一天老板想要每天查看一下昨天的数据,比如说想看看昨天一共成交了多少订单,销售额是多少,差评率等等数据应该怎么实现呢。
我们当然可以写个接口直接查MySQL的数据实现,但是这么做完你会发现,老板可能又要对研发部门降本增效了,原因是每天访问个数据要加载半天 ,连领导都敢糊弄,看来还是得提升下人效!
出现这种接口慢问题都不用想,肯定是执行查询SQL慢,订单相关的表就算分了库分了表没有个千万级也得有大几百万级,在这么大的数据量上再去聚合再去计算,整不好还得来几个联表查,虽然你知道咋回事,但是老板管你那些呢,八股文背给下一家面试官听吧~
所以我们最好把昨天的数据在今天的凌晨同步到专门用作数据分析场景的DB里,要说OLAP场景下名气最大的还得是ClickHouse,当你把数据灌入ck中再去运行查询SQL你会发现,报表查询像呼吸一样顺畅。
那么如何做到每天定时将MySQL数据同步到ClickHouse中呢。
数据脚本
一般这种需求最简单肯定是写脚本,总共分两步
- JDBC连接MySQL执行查询
- JDBC连接ClickHouse执行插入
咔咔就是一顿增删改查,如何做到定时呢,放服务器上编辑下crontab完事,听起来一点毛病没有。但仔细一想却又端倪。
- 如果数据量过大,比如昨天有10w单订单数据,同步到5w失败了,要不要从0开始同步
- 如何保证程序稳定呢
- 怎么进步啊,工作这么久不还是增删改查嘛、
- 如何扩展?今天从MySQL同步到CK,明天从MYSQL同步到Doirs呢,现改代码吗?
我们如果有一个异构数据源同步系统,这些需求不就迎刃而解了吗,不论是从mysql到ck还是到doirs、es等等等都能支持。
如何实现一个异构数据源之间的数据同步系统呢。
数据同步工具
市面上针对异构数据源数据同步的框架有很多,比较出名的有阿里的datax、apache seatunnel、字节的bitsail、袋鼠云的chunjun。
我们拿最经典的datax代码来举个例子。

可以看到datax基本上支持了大部分的数据源的读写,datax通过抽象执行脚本运行同步任务,这样的话就算改变同步的数据源也不需要去修改程序,只需要修改datax的执行脚本即可。
定时调度
有了数据同步框架,如何做到定时调度呢,现在市面上比较受欢迎的定时调度框架非xxl-job莫属,现在思路就比较清晰了。
搞一个spring的项目,引入xxl-job依赖,根据定时配置调度构造datax的执行脚本交给datax运行。
断点续传
datax并没有依赖大数据引擎,如果想要使用断点续传特性的话可以使用seatunnel或chunjun,他们都通过使用大数据引擎来实现断点续传。
数据同步组件的启动方式大同小异,切换起来也不麻烦。
总结
- 构造一个springboot项目
- 引入xxl-job做调度组件
- 选择数据同步框架做底层支撑,datax、seatunnel、chunjun
- 如果开启断点续传,适配底层引擎