首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

基于 MySQL Binlog 实现可配置的异构数据同步

2020-05-21

点击上方“马蜂窝技能”,重视订阅更多优质内容

跟着马蜂窝的逐步开展,咱们的事务数据越来越多,单纯运用 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 等,主要是依据查询来获取数据源,这会存在怎么承认增量和轮询频率的问题。而咱们一些事务场景关于数据同步的实时性要求比较高。

为了处理上述问题,咱们提出了一种依据 MySQL Binlog 来进行 MySQL 数据同步到 Elasticsearch 的思路。Binlog 是 MySQL 经过 Replication 协议用来做主从数据同步的数据,所以它有咱们需求写入 Elasticsearch 的数据,并契合对数据同步时效性的要求。

运用 Binlog 数据同步 Elasticsearch,事务方就能够专心于事务逻辑对 MySQL 的操作,不必再关怀数据向 Elasticsearch 同步的问题,减少了不必要的同步代码,避免了扩展中心表列的长耗时问题。

经过调研后,咱们选用开源项目 go-mysql-elasticsearch 完成数据同步,并针对马蜂窝技能栈和实践的事务环境进行了一些定制化开发。

2. 数据同步正确性确保

公司的一切表的 Binlog 数据归于秘要数据,不能直接获取,为了满意各事务线的运用需求,选用接入 Kafka 的方法提供给运用方,而且需求运用方请求相应的 Binlog 数据运用权限。获取运用权限后,运用方以 Consumer Group 的方法读取。

这种办法确保了 Binglog 数据的安全性,可是对确保数据同步的正确性带来了应战。因而咱们规划了一些机制,来确保数据源的获取有序、完好。

经过 Kafka 获取 Binlog 数据,首要需求确保获取数据的次序性。严厉说,Kafka 是无法确保大局音讯有序的,只能部分有序,所以无法确保一切 Binlog 数据都能够有序抵达 Consumer。

可是每个 Partition 上的数据是有序的。为了能够按次序拿到每一行 MySQL 记载的 Binglog,咱们把每条 Binlog 依照其 Primary Key,Hash 到各个 Partition 上,确保同一条 MySQL 记载的一切 Binlog 数据都发送到同一个 Partition。

假如是多 Consumer 的状况,一个 Partition 只会分配给一个 Consumer,相同能够确保 Partition 内的数据能够有序的 Update 到 Elasticsearch 中。

考虑到同步程序或许面对各种正常或反常的退出,以及 Consumer 数量变化时的 Rebalance,咱们需求确保在任何状况下不能丢掉 Binlog 数据。

运用 Kafka 的 Offset 机制,在承认一条 Message 数据成功写入 Elasticsearch 后,才 Commit 该条 Message 的 Offset,这样就确保了数据的完好性。而关于数据同步的运用场景,在确保了数据次序性和完好性的状况下,重复消费是不会有影响的。

Part.3

技能完成

整个架构由五大要害模块组成: 装备解析模块、规矩模块、 Kafka  相关模 块、Binlog 数据 解析模块 及   Elasticsearch 相关模块。

黄色箭头表明依靠,蓝色箭头表明数据流向

1. 功用模块

装备解析模块

担任解析装备文件,或在装备中心装备的 json 字符串。包含 Kafka 集群装备、Elasticsearch 地址装备、日志记载办法装备、MySQL 库表及字段与 Elasticsearch 的 Index 和 Mapping 对应联系装备等。

规矩模块

规矩模块决议了一条 Binlog 数据应该写入到哪个 Elasticsearch 索引、文档_id 对应的 MySQL 字段、Binlog 中的各个 MySQL 字段与索引 Mapping 的对应联系和写入类型等。

在本地化过程中,依据咱们的事务场景,添加了对 MySQL 表各字段的 where 条件判别,来过滤掉不需求的 Binlog 数据。

Kafka 相关模块

该模块担任衔接 Kafka 集群,获取 Binlog 数据。

在本地化过程中,该模块的大部分功用现已封装成了一个通用的 Golang Kafka Consumer Client。包含 DBA Binlog 订阅渠道要求的 SASL 认证,以及从指定时刻点的 Offset 开端消费数据。

Binlog 数据解析模块

原项目中的 Binlog 数据解析针对的是原始 Binlog 数据,包含了解析 Replication 协议的完成。在咱们的运用场景中,Binlog 数据现已是由 Canal 解析成的 json 字符串,所以对该模块的功用进行了简化。

binlog json字符串示例 :

上面是一个简化的 binlog json 字符串,经过该条 binlog 的 database 和 table 能够射中一条装备规矩,依据该装备规矩,把 Data 中的 key-value 构形成一个与对应 Elasticsearch 索引相匹配的 key-value map,一起包含一些数据类型的转化:

热门文章

随机推荐

推荐文章