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

MySQL 数据实时同步实践

2019-12-18

MySQL 由于本身简略、高效、牢靠的特色,成为小米内部运用最广泛的数据库,可是当数据量到达千万 / 亿级其他时分,MySQL 的相关操作会变的十分缓慢;假如这时还有实时 BI 展现的需求,关于 mysql 来说是一种灾祸。

为了处理 sql 查询慢,查不了的事务痛点,咱们探究出一套完好的实时同步,即席查询的处理方案,本文首要从实时同步的视点介绍相关作业。

前期事务凭借 Sqoop 将 Mysql 中的数据同步到 Hive 来进行数据剖析,运用进程中也带来了一些问题:

尽管 Sqoop 支撑增量同步但还归于粗粒度的离线同步,无法满意实时性的需求

每次同步 Sqoop 以 sql 的方法向 Mysql 宣布数据恳求也在必定程度上对 Mysql 带来必定的压力

一同 Hive 对数据更新的支撑也相对较弱

为了更有效地衔接前端事务数据体系和后端统计剖析体系,咱们需求一套实时同步 MySQL 数据的处理方案。

怎么可以做到数据的实时同步呢?咱们想到了 MySQL 主从复制时运用的 binlog 日志,它记载了一切的 DDL 和 DML 句子,以事情方法记载,还包括句子所履行的耗费时刻。

下面来看一下 MySQL 主从复制的原理,首要有以下几个进程:

master在每次预备提交事务完结数据更新前,将改动记载到二进制日志 中

slave建议衔接,衔接到 master,恳求获取指定方位的 binlog 文件

master 创立 dump 线程,推送 binlog 的 slave

slave 发动一个 I/O 线程来读取主库上 binary log 中的事情,并记载到 slave 自己的中继日志 中

slave 还会起动一个 SQL 线程,该线程从 relay log 中读取事情并在备库履行,完结数据同步

slave 记载自己的 binlog

binlog 记载了 Mysql 数据的实时改变,是数据同步的根底,服务需求做的便是恪守 Mysql 的协议,将自己伪装成 Mysql 的 slave 来监听事务从库,完结数据实时同步。

结合小米内部体系特色,构建了 Mysql 数据同步服务–-LCSBinlog,作为一种独立的数据接入方法整合在 Talos Platform 中,Talos Platform 作为大数据集成的根底处理方案,以自研音讯行列 Talos 为数据总线,衔接各种体系为首要方针,供给丰厚的数据 Source 输入和数据 Sink 输出,而且 Talos 天然支撑流式核算,因而事务可以充分运用 Talos Platform 互联互通的特性,并结合本身的事务需求完结愈加高阶的事务场景。

上图是 Talos Platform 中的全体流程架构,其中标红部分是现在 LCSBinlog 在小米内部运用最广泛的一条链路:Mysql — Talos — Kudu — BI,数据同步到 kudu 后凭借 Sparksql 查询引擎为上层 BI 体系供给即席查询服务,Kudu 和 Sparksql 的整合细节可以拜见往期内容:离别”纷纷扰扰”—小米 OLAP 服务架构演进

服务一共有两种人物

在 Worker 上运转两种作业:

BinlogSyncJob:每一个 mysql 库都会对应这样一个 Job,将 binlog 日志完好地写入到服务创立的 Talos topic 中

MysqlSyncJob:同步历史数据,消费 binlog 数据,过滤特定库表数据实时同步至用户装备的 topic 中

服务全体依赖于 Zookeeper 来同步服务状况,记载作业调度信息和符号作业运转状况;在 kudu 表中记载作业同步进展

操控流程如下:

Worker 节点经过在 Zookeeper 上注册奉告自己可以被调度

经过在 Zookeeper 上抢占 EPHEMERAL 暂时节点完结 Master 的 HA

用户在交融云上注册 BinlogSource 同步使命

Master 周期性从装备服务读取 Binlog 同步作业装备

Master 更新 Zookeeper 中的调度信息

Worker 节点 依据 Zookeeper 上的调度信息发动新分配使命,中止装备失效使命;作业发动后完结数据实时同步并周期性将同步进展记载在 kudu 中

服务上报监控信息到 Falcon 渠道,作业反常退出发送报警邮件

次序性

用户装备的每一个 BinlogSource 都会绑定一个 Talos 的 topic,在进行消费的时分需求保证同一条 mysql 记载操作的次序性,音讯行列 Talos 是无法保证大局音讯有序的,只能保证 partition 内部有序。

关于装备分库分表或许多库同步使命的 BinlogSource,服务会依据库表信息进行 hash,将数据写入相应的 partiton,保证同一张表的数据在一个 partition 中,使得下流消费数据的次序性;

关于单表同步的作业现在运用一个 partition 保证其数据有序。

一致性

怎么保证在作业反常退出后,作业重新发动可以完好地将 mysql 中的数据同步到下流体系,首要依赖于以下三点

服务会记载作业同步的 offset,重启后从前次 commit 的 offset 持续消费

Binlog 数据的次序性保证了即使数据被重复消费,也能对同一条记载的操作以相同的次序履行

下流存储体系 kudu,Es ,Redis 依据主键的操作可以保证 binlog 重复回放后数据的终究一致性

有了这份数据咱们可以做些什么事情呢,本节例举了几种常见的运用场景

实时更新缓存

事务查询类服务往往会在 mysql 之上架起一个缓存,削减对底层数据库的拜访;当 mysql 库数据改变时,假如缓存还没有过期那么就会拿到过期的数据,事务期望可以实时更新缓存;

运用 binlog 服务,依据战略实时将数据同步到 redis 中,这样就可以保证了缓存中数据有效性,削减了对数据库的调用,然后进步全体功能。

异步处理,体系解耦

跟着事务的开展,同一份数据可能有不同的剖析用处,数据成功写入到 mysql 的一同也需求被同步到其他体系;假如用同步的方法处理,一方面拉长了一次事务整个流程,另一方面体系间也会相互影响

数据在 mysql 中操作成功后才会记载在 binlog 中,保证下流处理届时的一致性;运用 binlog 服务完结数据的下发,有助于体系的解耦。

关于异步处理,体系解耦在《 音讯行列在企业架构中扮演着什么人物? 》一文中有更深化的解读 。

即席查询的 BI 体系

就如文章开篇说到的,mysql 在必定场景下的功能瓶颈,mysql 数据同步到 kudu 后可以凭借 sparksql 完结功能的提高

由于同样是 sql 接口,对运用者的切换本钱也是较低的,数据同步到更适合的存储中进行查询,也可以防止因大查询而对原 mysql 库其他查询的影响

现在小米内部安稳运转 3000+ 的同步作业,运用 binlog 服务同步数据到 kudu 中;小米内部 BI 明星产品 XDATA 凭借整套同步流程很好地支撑了运营、sql 剖析同学日常统计剖析的需求

用户接入数据的时分要求 mysql 库敞开 binlog 日志格局有必要为 Row 形式:记载的是每一行记载的每个字段改变前后的值,尽管会形成 binlog 数据量的增多,可是可以保证每一条记载准确性,防止数据同步不一致状况的呈现

终究经过监听 binlog 日志,LCSBinlog 服务将数据转换成如下的数据结构,写入用户注册的 Topic 中, 现在 Sink 服务运用 SparkStreaming 实时转储数据到 kudu 中,后续也将逐渐迁移到 Flink 上以提高资源运用、下降推迟

事务用户也可以依据咱们供给的数据格局,实时消费 Talos 数据以完结更杂乱的事务逻辑,下表为每一种数据操作,是否保存修正前后的列表

下面共享 2 个上线后遇到的风趣问题

事务接入一段时刻后, 发现部分表会偶然存在 kudu 表的数据条目数多于同步的 mysql 表的数据条目数,咱们将多出来的数据与 mysql 发生的 binlog 日志经过逐个比照,发现用户在 mysql 表中设置了仅有索引,经过仅有索引修正了主键,而 kudu 中的数据是经过主键标识或更新一条记载的,所以 update 操作变成了 insert 操作,这就形成了本来的 1 条记载变成了 2 条。

处理办法:关于这种类型的表,LCSBinlog 服务会把一次 Update 操作转换成一条 Delete 数据和一条 Insert 数据

服务刚上线的时分,经过 jdbc 履行 sql 的方法完结全量历史数据的同步,在同步的进程中会发现 dump 使命会卡顿很长时刻才会回来成果,当数据量很大会呈现超时同步失利的状况,会形成数据的推迟。调研后发现运用 mysql 官方 jdbc 在客户端查询数据的时分,默以为从服务器一次取出一切数据放在客户端内存中,fetch size 参数不起作用,当一条 SQL 回来数据量较大时可能会呈现 OOM

处理办法:当 statement 设置以下特点时,选用的是流数据接纳方法,每次只从服务器接纳部份数据,直到一切数据处理完毕。优化后历史数据同步安稳运转,对 mysql 端的压力也很小

MySQL 以 Binlog 日志的方法记载数据改变,依据流式数据的 Change Data Caputre 机制完结了 LCSBinlog 服务。本文首要对 LCSBinlog 的服务架构、运用场景以及在小米内部的实践经验进行了介绍,也和咱们共享了咱们实践中遇到的问题和处理方案,期望可以协助到咱们了解服务的原理,带来启示,也欢迎咱们和咱们一同沟通。

热门文章

随机推荐

推荐文章