
点击上方“马蜂窝技术”,关注订阅更多优质内容
随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。
使用 Elasticsearch 存储业务数据可以很好的解决我们在业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。
Part.1
现有方案及问题
对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上一次读取时间的所有数据,即该段时间内的增量,写入Elasticsearch。
所以,一旦业务逻辑中有相应字段的数据变更,需要同时顾及 MySQL 中间表的变更;如果需要 Elasticsearch 中的数据即时性较高,还需要同时写入 Elasticsearch。
随着业务数据越来越多,MySQL 中间表的数据量越来越大。当需要在 Elasticsearch 的索引中新增 Mapping 字段时,相应的 MySQL 中间表也需要新增列,在数据量庞大的表中,扩展列的耗时是难以忍受的。而且 Elasticsearch 索引中的 Mapping 字段随着业务发展增多,需要由业务方增加相应的写入 MySQL 中间表方法,这也带来一部分开发成本。
Part.2
基于Binlog的数据同步
1. 整体思路
现有的一些开源数据同步工具,如 DataX 等,主要是基于查询来获取数据源,这会存在如何确定增量(比如使用 utime 字段解决等)和轮询频率的问题。而我们一些业务场景对于数据同步的实时性要求比较高。
为了解决上述问题,我们提出了一种基于 MySQL Binlog 来进行 MySQL 数据同步到 Elasticsearch 的思路。Binlog 是 MySQL 通过 Replication 协议用来做主从数据同步的数据,所以它有我们需要写入 Elasticsearch 的数据,并符合对数据同步时效性的要求。
使用 Binlog 数据同步 Elasticsearch,业务方就可以专注于业务逻辑对 MySQL 的操作,不用再关心数据向 Elasticsearch 同步的问题,减少了不必要的同步代码,避免了扩展中间表列的长耗时问题。
经过调研后,我们采用开源项目 go-mysql-elasticsearch 实现数据同步,并针对马蜂窝技术栈和实际的业务环境进行了一些定制化开发。
2. 数据同步正确性保证
公司的所有表的 Binlog 数据属于机密数据,不能直接获取,为了满足各业务线的使用需求,采用接入 Kafka 的形式提供给使用方,并且需

本文介绍了马蜂窝技术团队基于MySQL Binlog实现可配置的异构数据同步方案,解决了数据中间表扩展性和即时性问题。通过接入Kafka确保数据安全和顺序性,使用go-mysql-elasticsearch并进行定制化开发,实现了数据同步的正确性和完整性。该方案已应用于订单索引,数据同步延时稳定在1秒左右。
最低0.47元/天 解锁文章
891

被折叠的 条评论
为什么被折叠?



