canal mysql从库_大厂如何基于binlog解决多机房同步mysql数据(一)?

目录

  1. 前言
  2. 单一IDC
  3. 多IDC
  4. mysql主从同步
  5. 数据同步方案
  6. 多机房mysql同步方案
  7. 优化同步方案
  8. 同步方案的问题
  9. 如何解决重复插入
  10. 对于DDL语句处理
  11. 如何解决唯一索引冲突
  12. 如何解决数据回环问题
  13. 总结

前言

小伙伴们是否经常听说多机房部署,异地容灾?什么两地3中心,三地5中心?是否好奇多机房部署,数据之间是如何共享的呢

今天老顾就来尝试着给大家解惑解惑,并详细介绍一下数据同步的问题。

单一IDC

ead54ac9039dd4364a44434a22c243cb.png

上图的架构,是一个IDC机房中,部署了一主两从mysql数据库集群,大多数据中小型互联网公司采用的方案。

上面的方案存在一些问题:

1)不同地区的用户体验速度不同。一个IDC必然只能部署在一个地区,例如部署在北京,那么北京的用户访问将会得到快速响应;但是对于上海的用户,访问延迟一般就会大一点

上海到北京的一个RTT可能有20ms左右。

2)容灾问题。这里容灾不是单台机器故障,而是指机房断电,自然灾害,或者光纤被挖断等重大灾害。一旦出现这种问题,将无法正常为用户提供访问,甚至出现数据丢失的情况。

某年,支付宝杭州某数据中心的光缆就被挖断过

多IDC

为了解决这些问题,我们可以将服务部署到多个不同的IDC中,不同IDC之间的数据互相进行同步。如下图

bb5a890dda7bd918b1c59a9f1d941cf3.png

通过这种方式,我们可以解决单机房遇到的问题:

1)用户体验。不同的用户可以选择离自己最近的机房进行访问

2)容灾问题。当一个机房挂了之后,我们可以将这个机房用户的流量调度到另外一个正常的机房,由于不同机房之间的数据是实时同步的,用户流量调度过去后,也可以正常访问数据

故障发生那一刻的少部分数据可能会丢失

关于流量的调度问题,本文就不介绍,以后老顾会单独介绍流量、灰度发布的问题。本文主要介绍数据同步。

容灾补充

  • 机房容灾 : 上面的案例中,我们使用了2个IDC,但是2个IDC并不能具备机房容灾能力。至少需要3个IDC,例如,一些基于多数派协议的一致性组件,如zookeeper,redis、etcd、consul等,需要得到大部分节点的同意。例如我们部署了3个节点,在只有2个机房的情况下, 必然是一个机房部署2个节点,一个机房部署一个节点。当部署了2个节点的机房挂了之后,只剩下一个节点,无法形成多数派。在3机房的情况下,每个机房部署一个节点,任意一个机房挂了,还剩2个节点,还是可以形成多数派。这也就是我们常说的"两地三中心”。
  • 城市级容灾:在发生重大自然灾害的情况下,可能整个城市的机房都无法访问。为了达到城市级容灾的能力,使用的是"三地五中心"的方案。这种情况下,3个城市分别拥有2、2、1个机房。当整个城市发生灾难时,其他两个城市依然至少可以保证有3个机房依然是存活的,同样可以形成多数派。

Mysql主从同步

小伙伴们应该知道mysql的主从架构的数据复制的基本原理

ac5402f46f8c58d2e40353e8f847163c.png

通常一个mysql集群有一主多从构成。用户的数据都是写入主库Master,Master将数据写入到本地二进制日志binary log中。从库Slave启动一个IO线程(I/O Thread)从主从同步binlog,写入到本地的relay log中,同时slave还会启动一个SQL Thread,读取本地的relay log,写入到本地,从而实现数据同步

数据同步方案

根据上面的mysql主从数据复制方案,那我们是不是可以自己写个组件,也读取binlog日志,解析出sql语句;然后同步到另一个mysql集群呢?

这样就可以实现了一个集群的数据,同步到另一个集群中。

那这个组件需要我们自己写吗?这个组件可以参考binlog的协议,只要有资深的网络编程知识,是能够实现的。

当然现在也不需要我们自己编写,现在市面上有成熟开源的

  • 阿里巴巴开源的canal
  • 美团开源的puma
  • linkedin开源的databus

我们可以利用这些开源组件订阅binlog日志,解析到变化数据同步到目标库中。整个过程可以分为2步,第一步订阅获得变化的数据,第二步是把变化数据更新到其他目标库

这边所说的目标库,不单单为mysql集群,也可以为redis,es等

d4d294bfa4a39c1a55ebb679506eaf7b.png

上图我们通过订阅binlog,完成比较有代表性的数据同步

多机房Mysql同步

根据上面的知识,多机房的mysql的数据同步,可以也采用binlog方案

c424e265165800306e068f6995bea888.png

北京用户的数据不断写入离自己最近的机房的DB,通过binlog订阅组件订阅这个库binlog,然后下游的更新组件将binlog转换成SQL,插入到目标库。上海用户类似,只不过方向相反,不再赘述。通过这种方式,我们可以实时的将两个库的数据同步到对端。

上面的方案面对binlog更新不频繁的场景,应该问题不大;但是如果更新很频繁,那么binlog日志量会很大,处理更新数据的组件很有可能会顶不住,那如何处理?

优化同步方案

为了解决binlog量过大,更新数据组件处理不过来,可以在此方案中加入MQ进行削峰,如下图

f7e47141cbc872e93c9fbf0fc70c008b.png

同步方案的问题

我们看到上面的架构,主要是针对增量数据的同步;但一开始项目上线的时候,全量数据怎么处理呢?这个一般的处理策略是DBA先dump一份源库完整的数据快照;目标库导入快照即可。

下面我们看看增量数据同步,仔细的小伙伴们应该会看到北京IDC和上海IDC之间的数据是双向的,因为北京用户的数据是更新到北京DB的,上海用户的数据是更新到上海DB的,所以业务上面也是必须是双向的

整个数据同步的过程会出现几个问题:

如何解决重复插入?

考虑以下情况下,源库中的一条记录没有唯一索引。对于这个记录的binlog,通过更新组件将binlog转换成sql插入目标库时,抛出了异常,此时我们并不知道知道是否插入成功了,则需要进行重试。如果之前已经是插入目标库成功,只是目标库响应时网络超时(socket timeout)了,导致的异常,这个时候重试插入,就会存在多条记录,造成数据不一致

因此,通常,在数据同步时,通常会限制记录必须有要有主键或者唯一索引

对于DDL语句如何处理?

如果数据库表中已经有大量数据,例如千万级别、或者上亿,这个时候对于这个表的DDL变更,将会变得非常慢,可能会需要几分钟甚至更长时间,而DDL操作是会锁表的,这必然会对业务造成极大的影响

因此,同步组件通常会对DDL语句进行过滤,不进行同步。DBA在不同的数据库集群上,通过一些在线DDL工具进行表结构变更。

如何解决唯一索引冲突?

由于两边的库都存在数据插入,如果都使用了同一个唯一索引,那么在同步到对端时,将会产生唯一索引冲突。对于这种情况,通常建议是使用一个全局唯一的分布式ID生成器来生成唯一索引,保证不会产生冲突。

另外,如果真的产生冲突了,同步组件应该将冲突的记录保存下来,以便之后的问题排查。

如何解决数据回环问题?

此问题是数据同步经常出现的,也是必须需要解决的。最重要的问题。我们针对INSERT、UPDATE、DELETE三个操作来分别进行说明:

INSERT操作

假设在A库插入数据,A库产生binlog,之后同步到B库,B库同样也会产生binlog。由于是双向同步,这条记录,又会被重新同步回A库。由于A库本来就存在这条记录了,产生冲突。

UPDATE操作

先考虑针对A库某条记录R只有一次更新的情况,将R更新成R1,之后R1这个binlog会被同步到B库,B库又将R1同步会A库。对于这种情况下,A库将不会产生binlog。因为A库记录当前是R1,B库同步回来的还是R1,意味着值没有变。

在一个更新操作并没有改变某条记录值的情况下,mysql是不会产生binlog,相当于同步终止。下图演示了当更新的值没有变时,mysql实际上不会做任何操作:

a13a7ea6c9b2ce8056d3becc359ac428.png

上图演示了,数据中原本有一条记录(1,"tianshouzhi”),之后执行一个update语句,将id=1的记录的name值再次更新为”tianshouzhi”,意味着值并没有变更。这个时候,我们看到mysql 返回的影响的记录函数为0,也就是说,并不会产生的更新操作

小伙伴们是不是以为,update操作不会有回环问题了;事实上并不是,我们看一些场景:

虑A库的记录R被连续更新了2次,第一次更新成R1,第二次被更新成R2;这两条记录变更信息都被同步到B库,B也产生了R1和R2。由于B的数据也在往A同步,B的R1会被先同步到A,而A现在的值是R2,由于值不一样,将会被更新成R1,并产生新的binlog;此时B的R2再同步会A,发现A的值是R1,又更新成R2,也产生binlog。由于B同步回A的操作,让A又产生了新的binlog,A又要同步到B,如此反复,陷入无限循环中。

这个后果将会进入死循环。

DELETE操作

同样存在先后顺序问题。例如先插入一条记录,再删除。B在A删除后,又将插入的数据同步回A,接着再将A的删除操作也同步回A,每次都会产生binlog,陷入无限回环

总结

今天老顾介绍了基本的多机房同步mysql的方案,以及同步方案遇到的一些问题,以及一些解决方案;但还遗留了数据回环问题,老顾将在下一篇文章中介绍解决方案。谢谢!!!

---End---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java语言怎么建立窗口awt,java.awt.Frame类:创建窗口

创建窗口是 AWT 编程的第一步,窗口是所有组件和面板的容器。在 Java AWT 中,我们使用 Frame 类来创建窗口。Frame 中文字意是“框架”,它的主要功能是建立窗口。AWT 建立窗口的步骤如下:设计 Frame 类对象,建立空白窗口…

sql数据导入错误代码: 0x80004005_SQL入门第八关 项目实战

不知不觉,学SQL已经一个多月了,每天下班学一个小时,有空做做练习题。从之前的焦虑到现在已经有了一定的自信了,猴子的课程真的很适合小白入门,尤其是SQL学习群里,助教老师很尽责,每个问题都会解…

虚拟主机选择php版本,虚拟主机的php版本如何选择

虚拟主机如何选择php版本?虚拟主机选择PHP版本,这是根据网站程序设置的。例如,新版本的WordPress需要PHP5.6和更高版本,而旧版本,如WordPress4,可以使用PHP5.2、5.3和其他更低版本。虚拟主机的PHP版本是什么…

有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

作者:张人大代码效率优化复杂度 -- 一个关于输入数据量n的函数时间复杂度 -- 昂贵与代码的结构设计有着紧密关系一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关空间复杂度 -- 廉价与数据结构设计有关数据结构 -- 考虑如何去组织计算机中…

图片马赛克去除工具_图片太多该如何进行排版呢?

胖友们大家好呀,我是三儿昨天三儿刚讲了多文字如何排版就有胖友在后台留言说问三儿如何对图片较多的内容排版那么今天三儿就来教大家图片较多时我们该怎样排版!赶紧拿着小本本做好笔记哦!图片的重要性图片在排版设计中,占有很大的…

神经网络人口预测matlab,BP神经网络预测(人口)程序(matlab)

自己测试人口预测的matlab实现:x[5416755196563005748258796602666146562828646536599467207662076585967295691727049972538745427636878534806718299285229871778921190859924209371794974962599754298705100072101654103008104357105851107507109300111026112704…

php如何监听页面滚动,html5中在元素滚动条在滚动时触发的事件onscroll

实例元素滚动时执行 JavaScript定义和用法onscroll 事件在元素滚动条在滚动时触发。提示: 使用 CSS overflow 样式属性来创建元素的滚动条。浏览器支持语法HTML 中:JavaScript 中:object.οnscrοllfunction(){myScript};JavaScript 中, 使用 addEventListener() 方…

可观测性PHP秩判据,线性系统的可控性与可观测性

现代控制理论中用状态方程和输出方程描述系统,输入和输出构成系统的外部变量,而状态为系统的内部变量,这就存在着系统内的所有状态是否可受输入影响和是否可由输出反映的问题,这就是可控性和可观测性问题。如果系统所有状态变量的…

matlab中的nlinfit,matlab中nlinfit问题!!!!!!!!!!!!

matlab中nlinfit问题!!!!!!!!!!!!mip版 关注:272 答案:3 悬赏:40解决时间 2021-01-19 04:20已解决2021-01-18 13:28muinline(beta(…

电机控制系统php,电机控制系统的未来发展变化趋势

在智能化生产系统的发展过程之中,网络化分布式生产设备的实现意味着我国机器设备之间可以达到信息沟通的能力,而在这种沟通之中良好的控制系统则承担了枢纽的职责。在这种地机控制系统的发展之中迎合了我国智能联网时代的发展需求,将人机交互…

微信wechat.class.php,laravel使用组件实现微信网页授权登入

laravel框架中的实现简单实现微信网页授权登入首先引入基于laravel的easywechat的组件,laravel版本5.8$ cd laravel$ composer require "overtrue/laravel-wechat:~5.0"然后呢因为下载过程会比较缓慢所以可以先根据官方提供的方式配置一下该组件的中间件根据官方提供…

qc成果报告范例_质量引领创新 扬子江勇夺医药行业QC“十五连冠”

近日,第40届全国医药行业QC小组成果发布交流会圆满落幕,扬子江药业集团勇夺QC一等奖总数“十五连冠”。会上,业界人士共享新成果、带来新思考、集聚新视野。扬子江人凭借高标准、高要求的精益求精的创新精神,在产品质量、技术、人…

oracle 11g安装时设密码 database control,安装oracle 11g 保护Database Control时出错,Database Control已在非安全模式下启动...

错误解决:打开cmdC:\Users\lin>emctl status dbconsoleEnvironment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name.C:\Users\lin>C:\Users\lin>set oracle_sidorclC:\Users\lin>emca -config dbcontrol dbE…

oracle fs1 2多少u,甲骨文FS1系列闪存的“大道至简”

近年来,存储技术中,闪存技术顶着“最高效挖掘数据能力”和“最小容量需求”的称号试图颠覆传统存储的技术架构和竞争格局。据IDC预测,全闪存存储阵列市场规模在2015年将增至12亿美元,而到2016年这一市场将增至16亿美元&#xff0c…

django oracle 性能,4.利用Django在前端展示Oracle 状态趋势

利用Django在前端展示Oracle 状态趋势2017-12-15 Python 宅必备开发环境操作系统:CentOS 7.4Python版本 :3.6Django版本: 1.10.5操作系统用户:oms数据处理:pandas前端展示:highcharts通过上面我们已介绍了如何定时获取系统Oracle状态语句以及如何利用pandas处理成highcharts识别…

linux 格式化 目录,Linux 磁盘分区、格式化、目录挂载

实验环境: Citrix虚拟化, RHEL6.4系统环境本文目的: 熟悉Linux的基本磁盘分区、格式化、目录挂载。1.显示当前主机目录2.磁盘分区3.磁盘格式化4.挂载目录1. 显示当前主机目录命令df -h[rootlocalhost ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/map…

linux用分词系统,Linux(CentOS 6.4)Solr4.8.1中文分词配置(IK分词)

1、环境准备CentOS6.4、Tomcat6.0、Jdk1.7、Solr4.8.1、IK Analyzer 2012FF_hf12、配置步骤(1)下载IK Analyzer分词包,解压缩(2)将IKAnalyzer2012FF_u1.jar拷贝到solr服务的目录solr/WEB-INF/lib下cp /usr/download/IK Analyzer 2012FF_hf1/IKAnalyzer2012FF_u1.jar…

linux c程序加args,C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用

在阅读代码的时候,在一个宏定义语句中,发现了个之前未曾见过的编译器预定义宏:“__VA_ARGS__”。当时,从代码语句中推测它代表宏参数:“…”(本文称之为省略号),依稀记得printf函数声明中有使用这个省略号&…

linux看java堆大小,linux 改java堆内存大小

linux 改java堆内存大小[2021-02-08 23:06:29] 简介:linux查内存大小的方法:首先打开应用程序;然后选择系统工具选项,并单击系统终端选项;接着在系统终端命令行输入【free -h】命令;最后在结果中找到total即可查看到系…

arch linux简体中文,User-mode Linux (简体中文)

本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队。什么是 user-mode-linux?User-mode-linux (UML) 是让一个linux作为一个独立进程运行在另一个linux上。 请在[1] 查找 uml 的详细安装使用指南。这篇 wiki 文章是 这帖[失效链接 2020-08-06 ⓘ] 概要。 如果…