首先声明一下,双主这种架构个人不怎么喜欢,所以这里只做简单说明与吐槽
Ⅰ、双主架构介绍
M/S(A) <====> S/M(B)
为什么要这么做呢?有什么意义呢?
我也不知道
Ⅱ、双主搭建
主上操作
change master
start slave
机器A
auto_increment_increment 自增值设置为2
机器B
auto_increment_increment 自增值设置为2
auto_increment_offset 起始值也设置为2
tips:
session级别的参数,不能用set global
A
1 3 5 7
B
2 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的共享存储)就是单点
Ⅳ、双主的一个比较好的方案
拒绝交叉写入