Mysql数据实时同步实践

article/2025/10/9 17:06:48


  关于小米内部使用的数据库你知道多少?(文末有福利)

往期文章回顾:Flink流式计算在节省资源方面的简单分析

背景

MySQL由于自身简单、高效、可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓;如果这时还有实时BI展示的需求,对于mysql来说是一种灾难。
为了解决sql查询慢,查不了的业务痛点,我们探索出一套完整的实时同步,即席查询的解决方案,本文主要从实时同步的角度介绍相关工作。

早期业务借助Sqoop将Mysql中的数据同步到Hive来进行数据分析,使用过程中也带来了一些问题:

  • 虽然Sqoop支持增量同步但还属于粗粒度的离线同步,无法满足实时性的需求

  • 每次同步Sqoop以sql的方式向Mysql发出数据请求也在一定程度上对Mysql带来一定的压力

  • 同时Hive对数据更新的支持也相对较弱

为了更有效地连接前端业务数据系统(MySQL)和后端统计分析系统(查询分析引擎),我们需要一套实时同步MySQL数据的解决方案。

小米内部实践

如何能够做到数据的实时同步呢?我们想到了MySQL主从复制时使用的binlog日志,它记录了所有的 DDL 和 DML 语句(除了数据查询语句select、show等),以事件形式记录,还包含语句所执行的消耗时间

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

  1. master(主库)在每次准备提交事务完成数据更新前,将改变记录到二进制日志(binary log)中

  2. slave(从库)发起连接,连接到master,请求获取指定位置的binlog文件

  3. master创建dump线程,推送binlog的slave

  4. slave启动一个I/O线程来读取主库上binary log中的事件,并记录到slave自己的中继日志(relay log)中

  5. slave还会起动一个SQL线程,该线程从relay log中读取事件并在备库执行,完成数据同步

  6. 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服务架构演进

LCSBinlog服务的主体架构

服务一共有两种角色

   Master :主要负责作业的调度,

   Worker: 主要完成具体的数据同步任务

在Worker上运行两种作业:

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

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

服务整体依赖于Zookeeper来同步服务状态,记录作业调度信息和标记作业运行状态;在kudu表中记录作业同步进度

控制流程如下:

  1. Worker节点通过在Zookeeper上注册告知自己可以被调度

  2. 通过在Zookeeper上抢占EPHEMERAL临时节点实现Master的HA

  3. 用户在融合云(Web)上注册BinlogSource同步任务

  4. Master周期性从配置服务读取Binlog同步作业配置

  5. Master更新Zookeeper中的调度信息

  6. Worker节点 根据Zookeeper上的调度信息启动新分配任务,停止配置失效任务;作业启动后完成数据实时同步并周期性将同步进度记录在kudu中

  7. 服务上报监控信息到Falcon平台,作业异常退出发送报警邮件

 如何保障数据正确性

>>>>

顺序性

用户配置的每一个BinlogSource 都会绑定一个Talos的topic,在进行消费的时候需要保证同一条mysql记录操作的顺序性,消息队列Talos是无法保证全局消息有序的,只能保证partition内部有序。

对于配置分库分表或者多库同步任务的BinlogSource,服务会根据库表信息进行hash,将数据写入相应的partiton,保证同一张表的数据在一个partition中,使得下游消费数据的顺序性;

对于单表同步的作业目前使用一个partition保证其数据有序。

>>>>

一致性

如何保证在作业异常退出后,作业重新启动能够完整地将mysql中的数据同步到下游系统,主要依赖于以下三点

  1. 服务会记录作业同步的offset,重启后从上次commit的offset继续消费   

  2. Binlog数据的顺序性保证了即便数据被重复消费(未commit的数据),也能对同一条记录的操作以相同的顺序执行

  3. 下游存储系统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分析同学日常统计分析的需求

如何使用Binlog数据

用户接入数据的时候要求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数据

>>>>

Full Dump同步历史数据时,客户端超时

服务刚上线的时候,通过jdbc 执行sql的方式完成全量历史数据的同步,在同步的过程中会发现dump任务会卡顿很长时间才会返回结果,当数据量很大会出现超时同步失败的情况,会造成数据的延迟。调研后发现使用mysql官方jdbc在客户端查询数据的时候,默认为从服务器一次取出所有数据放在客户端内存中,fetch size参数不起作用,当一条SQL返回数据量较大时可能会出现OOM

解决办法:当statement设置以下属性时,采用的是流数据接收方式,每次只从服务器接收部份数据,直到所有数据处理完毕。优化后历史数据同步稳定运行,对mysql端的压力也很小        

                    总结                 

MySQL以Binlog日志的方式记录数据变化,基于流式数据的Change Data Caputre (CDC)机制实现了LCSBinlog服务,

本文主要对LCSBinlog的服务架构、应用场景以及在小米内部的实践经验进行了介绍,也和大家分享了我们实际中遇到的问题和解决方案,希望能够帮助到大家理解服务的原理,带来启发,也欢迎大家和我们一起交流。

文末福利

雷军曾说:

“一本书、一个人改变了我一辈子,这使得我上大学一年级的时候,就想建一家世界一流的公司。那是80年代的一本书,印得很粗糙,翻译也跟今天不太一样,但看得我激动的不行。”

雷军讲话中提到的那个人是乔布斯,

那本书就是《硅谷之火》。

那么请问对你影响最大的书是哪一本呢?

请在留言区写下书名并说说这本书是如何影响你的

留言点赞数量最多的人,将获得这本《硅谷之火》

小编剧透:

我们将从大家留下的书名中选一本作为下期福利

梦想还是要有的,万一实现了呢~!快来参与吧~!


我就知道你“在看”


http://chatgpt.dhexx.cn/article/kFl3UpYA.shtml

相关文章

SQLServer数据库同步准实时方案

1. 需求 1)如何将在线运营的SQLServer数据库数据及时同步到另外一个SQLServer数据库。 2)数据仓库系统的数据抽取会对源系统造成巨大压力,严重影响性能和响应速度。如何将生产数据快速抽取到历史数据仓库,改善业务系统的性能。…

Oracle RAC+ASM 数据库实时同步

采用Beedup实现数据库实时同步,主库环境Oracle RACASM,内存64G,历史数据19T,日增归档100G,从库单实例环境,内存192G。 以下是项目实施过程遇到的主要问题: 1 历史数据同步 启用Beedup批量复制功…

如何对MySQL数据库中的数据进行实时同步

下载网站:www.SyncNavigator.CN 客服QQ1793040 ---------------------------------------------------------- 关于HKROnline SyncNavigator 注册机价格的问题 HKROnline SyncNavigator 8.4.1 企业版数据同步软件 自2009年第一个版本开发出来以来,经过8年不断地根据客户需求…

SQL server数据实时同步到mysql

本文在https://blog.csdn.net/zhaowenzhong/article/details/50599372的基础上做了测试,改动了个别有误及没有注释的地方 在同步的前提下,环境一定要搭好,测试的时候应为mysql安装的一些bug导致失败了很多次,又重装过 ---安装安…

SqlServer数据实时同步到mysql

SqlServer数据实时同步到mysql 一、首先要装一个ODBC的驱动用来建立mysql的连接。http://www.mysql.com/products/connector/ 注意:一定要用32位的可用cmd执行这个命令: c:\windows\syswow64\odbcad32.exe配置【用户DSN】和【系统DSN】 二、打开sql…

SqlServer实时数据同步到MySql

---安装安装mysqlconnector http://www.mysql.com/products/connector/ /* 配置mysqlconnector ODBC数据管理器->系统DSN->添加->mysql ODBC 5.3 ANSI driver->填入data source name如jt,mysql的ip、用户名、密码即可 */ --新建链接服务器 exec sp_addlinkedserver…

数据库实时同步技术解决方案

下载网站:www.SyncNavigator.CN 客服QQ1793040 ---------------------------------------------------------- 关于HKROnline SyncNavigator 注册机价格的问题 HKROnline SyncNavigator 8.4.1 企业版数据同步软件 自2009年第一个版本开发出来以来,经过8年不断地根…

不同SQL Server数据库之间表数据的实时同步-发布与订阅

最近要将不同服务器上数据库的表数据同步汇总,所以就涉及到了数据同步的问题,以前没有接触过,在网上找了找方法, 大抵的方法有三种: 1,在数据库中编写触发器 2,写一个同步程序去完成同步 3&…

“实时数据同步:构建高效的 MySQL 数据同步方案“

方案一 基于LVM快照进行备份切换 介绍: MySQL数据库本身并不支持快照功能(sqlServer支持) 因此快照备份是指通过文件系统支持的快照功能对数据库进行备份 备份的前提是将所有数据库文件放在同一文件分区中,然后对该分区进行快照操作 LVM是LINUX系统下对磁盘分区进…

多源异构数据库实时同步解决方案

1 需求概述 将企业多个业务系统产生的交易数据流实时同步到数据仓库或大数据平台,通过对交易数据的联机实时分析,快速制定或调整商业计划,提升企业的核心竞争力。 需求关键点:同步过程不可影响或中断业务系统正常运行、同步延时…

hadoop大数据平台搭建

大数据平台搭建 大数据平台搭建虚拟机环境准备修改ip,映射IP地址ssh无密码通信同步时间关闭防火墙安装jdk hadoop平台正式搭建安装hadoop安装 kafka安装spark 大数据平台搭建 zookeeperkafkaspark Hadoop yarn 虚拟机环境准备 我们在搭建大数据分布式系统之前需要对软件和虚…

CDH大数据平台搭建之VMware及虚拟机安装

CDH大数据平台搭建-VMware及虚拟机安装 前言一、下载所需框架二、安装(略)三、安装虚拟机1、新建虚拟机(按照操作即可) 总结 前言 搭建大数据平台需要服务器,这里通过VMware CentOS镜像进行模拟,供新手学习必备。 一、下载所需框架 VMware 和CentOS可以…

CDH大数据平台搭建之虚拟环境配置

CDH大数据平台搭建之虚拟环境配置 前言一、虚拟机网络配置1.配置ip地址2.验证配置是否成功 二、关闭防火墙1.防火墙命令2.禁用防火墙 三、虚拟机主机名配置1.临时配置主机名2.永久配置主机名 四、配置域名解析五、新建大数据用户1.新建用户2.配置普通用户sudo权限3.验证 六、SS…

大数据平台搭建(一):虚拟机环境配置

前言 最近看了些hadoop相关的资料,然后想自己从零开始搭建一个大数据平台。 大数据平台架构 1.概念性的东西还是不想多啰嗦,先上一张网上找的平台架构图,上图的目的是为了大家对整个平台架构有个宏观的认识,这个很重要&#xff0c…

怎么搭建大数据平台,这个大数据平台方案值得学习

在大数据的时代,不仅仅是个人,企业的发展也离不开大数据。对于企业来说,一方面用户越来越多从线下转移到线上,用户的特点属性需要通过网络获取,企业需要依靠大数据把握市场变化并了解客户,从而提供满足市场…

大数据平台搭建,cdh选型配置

天天干后端,又干前端,本行大数据,差点生疏了,哦吼~正当我发愁之际。 领导安排任务了,下个月去某控上市公司。他们需要从0 开始做大数据平台,主要工作内容如下, 平台搭建,数据迁移&…

大数据平台CDH搭建

一、数仓之Cloudera Manager 1、CM简介 1.1、简介 Cloudera Manager是一个拥有集群自动化安装、中心化管理、集群监控、报警功能的一个工具。 1.2、架构 1)Cloudera Repository:软件由Cloudera管理分布存储库。(有点类似Maven的中心仓库&…

大数据平台搭建目录

欢迎各位学习和借鉴搭配大数据系统 1.备注 省略了一些文件的创建,请自行创建 2.配置到大数据系统的所有配套文件 案例中所使用的版本,解决了版本适配问题 百度网盘链接:https://pan.baidu.com/s/1B5sx61Ori4U8fshHE3bJaA 提取码:6666 一.安装Lunx&…

高可用的分布式Hadoop大数据平台搭建,超详细,附代码。

目录 前言1: 前言2: 一,基础环境 1,三台Centos7.5,一台master,两台slave1和slave2 2,IP配置 ​ 3,改主机名 4,配三台主机映射 5,三台主机时钟同步 6&a…

CDH大数据平台搭建之集群规划

CDH大数据平台搭建之集群规划 前言一、集群规模二、集群规划总结 前言 话说无规矩不成方圆,搭建CDH大数据平台之前需要的工作很多,首先,你需要计算公司每日的数据量,来确定需要多少服务器,确定好服务器之后&#xff0…