上篇文章《分布式数据存储 - MySQL主从复制》,我们说到MySQL主从复制很好的保障了从库,读的高可用性。so,问题来了:

1、针对主库,写的高可用性又是如何做到高可用性?

2、如果需要对Master进行维护或宕机,为了不影响写服务,我们可能会将Slave节点提升为Master来提供写服务。当Master节点可以正常提供服务时,可能会发现Master中数据和实际数据不一致的情况,就不得不 反转原来的Master-Slave关系重新搭建Replication环境,进行新的主从节点数据同步,新的Slaver节点提供读服务。这种方式我们不仅要重新搭建Replication环境,还要处理数据同步postion位置,甚至数据冲突。那么有没有更好的处理方法?

一般的解决方法采用双主模式。

一、MySQL双主复制(Dual Master)

Dual Master,既是master,又是另一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

双主复制的复制过程和主从复制类似的,这里就不再赘述。

双主复制需要注意哪些问题?数据完整性、数据一致性和主键冲突

1、尽可能通过业务场景设计来规避,对于同一个库,同一张表,同一个记录中的同一字段的两地变更,引发的数据一致性判断冲突。

2、避免使用数据库自增类主键方案,而使用分布式全局ID,避免双主双写并同步复制可能引发主键冲突。

3、双向同步复制Dual Master潜在可能引发循环同步的问题。

  • 在MySQL的Binary Log中记录了当前MySQL的server-id,而且这个参数也是我们搭建MySQLReplication的时候必须明确指定,并且参数值不一致。一旦有了server-id的值之后,MySQL就很容易判断某个变更是从哪一个MySQL Server最初产生的,所以就很容易避免出现循环复制的情况。
  • 如果我们不打开记录Slave的Binary Log的选项(--log-slave-update)的时候,MySQL根本就不会记录复制过程中的变更到BinaryLog中,就更不用担心可能会出现循环复制的情形了。

我们从MySQL的Dual Master的循环复制方案中看出,就是在Binary Log中打上标记,就有办法判断哪些Binary Log是复制产生的,并将其过滤。

复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:在master上过滤二进制日志中的事件;在slave上过滤中继日志中的事件。

二、自定义标记SQL方案

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

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

(http://www.cnblogs.com/mindwind/p/4993708.html)

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

(http://www.cnblogs.com/mindwind/p/4993708.html)

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

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

分布式数据存储 - MySQL双主复制的更多相关文章

  1. keepalived+mysql双主复制高可用方案

    MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了 ...

  2. MySQL双主复制

    原文发表于cu:2017-06-12 本文简单介绍MySQL双主复制原理及1个简单是双主复制验证. 一.MySQL双主复制原理 1. 双主复制原理 master-master复制的两台服务器,既是ma ...

  3. mysql 双主复制 centos7

    mysql 安装请看:http://www.cnblogs.com/leohe/p/6839705.html 双主复制设置 1. 两台虚拟机,都是 centos7 主: 10.1.1.115 从: 1 ...

  4. mysql双主复制总结

    双主复制: 1).在两台服务器上各自建立一个具有复制权限的用户: 2).修改配置文件: # 主服务器A上 [mysqld] server-id = 10 log-bin = mysql-bin rel ...

  5. linux环境下配置mysql双主复制

    简单来说,双主复制就是让两台mysql服务器中的数据保持同步,可以用来实现灾备和负载均衡 主机1 IP:192.168.200.128 主机2 IP:192.168.200.131 两台主机系统均为c ...

  6. 利用LVS+Keepalived搭建Mysql双主复制高可用负载均衡环境

    应用背景: MySQL复制(主主,主从...)能在保证数据的备份的同时也能够做读写分离分摊系统压力,但是发生单点故障时,需要手动 切换到另外一台主机.LVS和Keppalived可以设定一个VIP来实 ...

  7. keeplived + mysql双主复制部署 --原创

    环境: master 1: 192.168.100.10  oracle  linux 7.4  mysql 5.7.1 master 2: 192.168.100.11 oracle  linux ...

  8. 003.Heartbeat MySQL双主复制

    一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master01 CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Master0 ...

  9. mysql 双主复制 windows10

    1. 整体思路 MySQL开始复制是很简单的过程,不过,根据特定的应用场景,都会在基本的步骤上有一些变化.最简单的场景就是一个新安装的master和slave,整个过程如下:(1)在每个服务器上创建一 ...

随机推荐

  1. oracle 查询今天哪个表增加的数据多

    一.创建一个表  create table A(  TABLE_NAME VARCHAR2(200),  COUNT_NUM  NUMBER) 二.创建一个存储过程create or replace  ...

  2. ASP.NET浏览器定义文件及IE兼容模式

    由于ASP.NET4.0中的一个小bug,导致了ASP.NET WebForms控制的CallBack无效,部分控件无法使用. 解决方法是在项目中添加自定义的浏览器定义文件,参考这里:http://w ...

  3. windows phone 8.1开发笔记之Toast

    Toast(吐司)是wp屏幕上端弹出来的临时通知,他会存在7秒钟的时间,可以快速定位到用户需要的位置(当然是由开发者设置的) 1.创建一个Toast now,需要将你的app设置支持Toast 否则即 ...

  4. qt 焦点设置策略

    focusPolicy 一个QWidget获得焦点的方式受 focusPolicy 控制 Qt::TabFocus 通过Tab键获得焦点 Qt::ClickFocus 通过被单击获得焦点 Qt::St ...

  5. 有关ZxMiddleTier构想

    终于决定动手写一个自己的东西,没有其它想法,人已经30多了,感觉原来学的东西都是零散的,想通过这样一个中间层的项目,串联起原来所学的东西,形成一个体系,也算是对自己这么多年的程序员的生涯做出一个交代, ...

  6. UserDefault 用户首选项读写 swift

    // // ViewController.swift // 首选项数据读写 // // Created by mac on 15/7/12. // Copyright (c) 2015年 fangyu ...

  7. Android L Camera2 API 使用实例程序汇总

    在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考: 1.Camera2 Basic : https://github.com/googlesamples/android-C ...

  8. 用telnet和php的curl库测试http

    一.telnet测试http telnet简介     Telnet协议是TCP/IP协议族的其中之一,是Internet远端登录服务的标准协议和主要方式,常用于网页服务器的远端控制,可供使用者在本地 ...

  9. Log4Net学习【三】

    Log4Net配置详解 配置方式一 在相应的应用程序的配置文件中配置,(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例是Web应用程序,以Web.co ...

  10. 四则运算三+psp0级表格

    一.题目 在四则运算二的基础上,选择一个方向进行拓展,我选择的是增加了答题模块 二.设计思路 1.在上次的基础上,增加了答题模块,每出现一道四则运算题目,便提醒输入结果,如果结果错误,就会提示错误 2 ...