后端分布式系列:分布式存储-MySQL 数据库双向同步复制

MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约。

问题和制约

数据库的双主双写并双向同步场景,主要考虑数据完整性、一致性和避免冲突。对于同一个库,同一张表,同一个记录中的同一字段的两地变更,会引发数据一致性判断冲突,尽可能通过业务场景设计规避。双主双写并同步复制可能引发主键冲突,需避免使用数据库自增类主键方案。另外,双向同步潜在可能引发循环同步的问题,需要做回环控制。

如上图所示,复制程序写入时也会产生 binlog,如何识别由复制程序产生的 binlog 并将其过滤掉是避免循环复制的关键。

原生 Dual Master 方案

MySQL 自身支持双主配置,但并没有去解决潜在的主键和双写带来的数据一致性冲突。对于双向同步潜在的循环复制问题,MySQL 在 binlog 中记录了当前 MySQL 的 server-id。一旦有了 server-id 的值之后,MySQL 就很容易判断某个变更是从哪一个 Server 最初产生的,所以就很容易避免出现循环复制的情况。而且,还可以配置不打开记录 slave 的 binlog 选项(–log-slave-update),MySQL 就不会记录复制过程中的变更到 binlog 中,就更不用担心可能会出现循环复制的情形了。

从 MySQL 自身的方案中可以找到切入点,就是如果能在 binlog 中打上标记,就有办法判断哪些 binlog 是复制产生的,并将其过滤。使用 MySQL 的方案则过于耦合 MySQL 的配置,在大规模部署的线上生产系统中容易因为 MySQL 配置错误导致问题。

自定义标记 SQL 方案

为了和 MySQL 配置解耦合,可以考虑一种通用的标记 SQL 方案。简单来说,就是在同步复制入库时插入特殊的标记 SQL 语句来标记这是来自复制程序的变更,这个标记 SQL 会进入 binlog 中。而在复制程序读取时,通过识别这个标记 SQL 来过滤判断。

binlog 中存储了对数据产生变更影响的的 SQL 语句,这些 SQL 语句组成了一段一段的事务,如下图所示:

绿色区是业务运行产生的正常事务,红色区是复制程序写入产生的事务,其中蓝色块是标记 SQL。标记 SQL 分别在事务开始后与事务结束前,标记 SQL 更新一张预定义的区别于业务表的标记表。那么每次复制程序去批量读取 binlog 内容时,可能存在下面 5 种情况,如下图所示:

  1. 批量读取范围全落在绿色区内。
  2. 批量读取范围起点落在绿色区,终点落在红色区。
  3. 批量读取范围起点落在红色区,终点落在绿色区。
  4. 批量读取范围起点和终点都在绿色区,但中间涵盖了一段红色区。
  5. 批量读取范围全落在红色区。

如上只有第 5 种情况,一个事务被拆成 3 段来同步。中间一段因为没有事务头和尾的标记,复制程序读取时将无法判断,导致循环同步,需要避免。通过把复制程序的批量读取范围固定设置为至少大于或等于写入的事务长度范围,避免了第 5 种情况。复制程序批量读取 binlog 日志事件时,通过标记 SQL 来过滤,避免了循环复制,实现了回环控制。

总结

本文考虑了在 MySQL 双主写入场景下双向同步复制的一些设计要点和制约。以原生实现为参考,给出了一种自定义实现方式的设计要点分析。而对于同库同表同记录同字段的同时两地变更,则必然引发数据一致性冲突,在复制同步层面无法区分哪边的更新为准。通常会考虑以最后时间戳来恢复到一致状态,但时间戳实际也会产生误差,此类场景不多见最好还是尽可能还是在业务场景设计上来规避。

参考

[1] MySQL Internals Manual. Replication.

[2] MySQL Internals Manual. The Binary Log. [3] in355hz. 数据库 ACID 的实现.

[4] jb51. MySQL 对 binlog 的处理说明.

[5] repls. 浅析 innodb_support_xa 与 innodb_flush_log_at_trx_commit.

[6] 68idc. MySQL 5.6 之 DBA 与开发者指南.

[7] csdn. 高性能 MySQL 主从架构的复制原理及配置详解.

[8] agapple. Otter 双向回环控制.



下面是我的微信公众号 「瞬息之间」,除了写技术的文章、还有产品、行业和人生的思考,希望能和更多走在这条路上同行者交流。

时间: 2024-08-06 09:02:05

后端分布式系列:分布式存储-MySQL 数据库双向同步复制的相关文章

windows下 MySQL数据库双向同步 配置步骤

      最近在项目中遇到了要实现服务器上MySql数据双向同步,在网上找了很多资料,但是大部分都是在liux系统下配置的, 而且都是互相转载,没有一个详细的步骤,于是决定写一个windows系统下的完整配置,与大家分享,如有不足之处, 请大家指正.   工具/原料 两台服务器,操作系统均为window2012 数据中心版,其中一台服务器为A,IP地址为:192.168.1.2,另外一台为B,IP地址为:192.168.1.3 mysql  的版本最好保持一致,大版本号一定要一致,小更新不影响

烂泥:学习mysql数据库主从同步复制原理

本文由秀依林枫提供友情赞助,首发于烂泥行天下. 说明本篇文章部分转载自互联网. MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少. MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql

mysql数据库主从同步复制原理

MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少. MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到

MySQL数据库半同步复制

半同步复制,是有一个从节点或者一部分从节点与主节点之间是同步复制的,其他的从节点仍是异步复制 半同步复制是谷歌公司贡献给MySQL的一个插件,默认在MySQL中没有此插件,所以要实现主从的版同步复制需要安装此插件 rpm -ql mariadb-server| grep semi #找到需要安装的插件,以so结尾 SHOW PLUGINS; #查看当前支持的插件,此处也能看到myisam和innodb也是插件类型 下面开始介绍如何配置主从版同步复制: 1.创建传统的主从复制功能的mysql,请参

MySQL数据库主从同步复制

主数据库:192.168.1.31/24vim /etc/my.cnf[mysqld]datadir=/usr/local/mysql/data/socket=/tmp/mysql.sock #master and slave#启用二进制日志log-bin=mysql-bin-master#本机数据库ID 标示server-id=1#可以被从服务器复制的库,二进制日志需要同步的数据库名binlog-do-db=test#不可以被从服务器复制的库binlog-ignore-db=mysql [my

mysql数据库主从同步配置教程--数据库同步

背景: 最近有一个mysql数据库同步的需求,我用了mysql主从同步的方法来实现.下面把步骤记录一下. 环境和拓扑 操作系统:Centos6.6 X64 mysql版本:5.1.73 Master: 10.6.1.210 Slave:  10.6.1.211 需求: 实现Master上test库同步到Slave上,但是禁止同步该库下的AA表 1.配置Master上的my.cnf #vim  /etc/my.cnf 添加内容到[mysqld]下,设定只同步test 数据库: [mysqld] l

linux下数据库双向同步之mysql

环境:lamp 下搭建一个博客   然后实现同步 这里:以wordpress为例,进行实施 具体操作如下: 一.环境配置 1.自动获取ip地址,虚拟机设置为桥接 2.[[email protected] ~]# yum install wget #换成163的yum源: cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.save wget mirrors.163.com/.help/CentOS5-Base-163.repo #wg

后端分布式系列:分布式存储-HDFS 与 GFS 的设计差异

「后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现的. 然后呢,我就去把 GFS 的原始论文找出来仔细看了遍,GFS 的整体架构图如下: HDFS 参照了它所以大部分架构设计概念是类似的,比如 HDFS NameNode 相当于 GFS Master,HDFS DataNode 相当于 GFS chunkserver. 但还有些细节不同的地方,所以

MySQL Dual-Master 双向同步

本文介绍的Mysql Dual-Master 复制实施方法可能不是最完美.最强大的.但是在我的应用环境下能很好的满足各项需求. 本文基于我们仅仅使用两台MySQL服务器的情况下,但是你会发现文章中介绍的方法可以很方便的应用于多台服务器的环境下.同样地,我们假设您将用于同步复制的数据库已经在其中一台MySQL服务器上建好了.最后,在开始所有工作之前,我们必须调整所有服务器的防火墙策略以保证彼此能访问对方的3306端口. 环境: 操作系统:CentOS 5.4 x86 MySQL版本:5.0.77