首先声明一下,双主这种架构个人不怎么喜欢,所以这里只做简单说明与吐槽

Ⅰ、双主架构介绍

M/S(A) <====> S/M(B)

为什么要这么做呢?有什么意义呢?

我也不知道

Ⅱ、双主搭建

主上操作change masterstart slave机器A
auto_increment_increment  自增值设置为2机器B
auto_increment_increment  自增值设置为2auto_increment_offset     起始值也设置为2tips:session级别的参数,不能用set globalA1 3 5 7B2 4 6 8

这样就可以双写了,带有自增的insert没问题

但极力不推荐

Ⅲ、双写存在的问题

3.1 不好的第一点

一张表上如果有唯一索引,即使是自增,也会完蛋

A上同步到B,B上写,就会报duplicate,这还比较好,至少两边数据还是一致的

万一A还没同步到B,B上插入也成功了,两边都成功了复制是失败的,这咋办?两边数据都不一致了,对不起来


3.2 不好的第二点

解决不了update问题

同一条记录在两个节点上更新,前面一个更新的节点数据被覆盖,就更新丢失了


3.3 相关说明

双写存在很多问题

  • 以前做双主,主从复制关系之前都建立好了,以后做选主的时候就不用建立复制关系了,以前建立复制关系是很烦的一件事情

  • mha不需要做双主,mmm才是做双主,5.6开始,只要开启gtid,选主是很容易的

  • 如果不是5.6,但是用了mha,mha会自动重建复制关系

综上:所以双主用来做选主的架构其实也不多了,很落后,双主做双写很危险

应用层控制双写,如果能解决上面说的问题就可以用,但是很难

如果做到的话,对写入的带宽有很大提升

tips:

①A同步到B,为什么B不会再推到A,这样无限循环?

因为同步的记录是带有server-id的,检测到要发送的server-id就是接收过来的server-id就不会发了

②oracle的rac为什么可以双写?

  • 支持共享存储架构,多个进程共享一个存储

  • MySQL的M和S存储是自己管自己

  • oracle这么用(rac的共享存储)就是单点

Ⅳ、双主的一个比较好的方案

拒绝交叉写入