主主复制有两台服务器,每一个都被配置成对方的主库和备库。主主拓扑结构有两种配置,一种是主主拓扑结构中的主-主模式。这种模式下,两台服务器都可以写入。那么最大的问题就是如何防止冲突的问题,另外在两台机器上根据不同的顺序更新,可能会导致数据不同步。例如在第一台主库上:
update tableA set col=col+1;
在第二台主库上:
update tableA set col=col*2;
在这种情况下,第一台实际在数据库执行的是
update tableA set col=col+1;
update tableA set col=col*2;
第一台得到的结果是4,在第二台主机上执行的是
update tableA set col=col*2;
update tableA set col=col+1;
那么得到的结果就是3。这种拓扑结构导致了两个库的数据不一致。如果清除自己在做什么,那么可以考虑这种结构,否则,尽量别用,因为有些疑难杂症很难处理好。
在主主拓扑结构中还有另外一种模式,主-被拓扑模式,这种结构能够很好的避免主主结构中主-主模式的一些问题。这种结构跟主-主结构的区别在于其中被动服务器只读,如图所示。由于主主结构主-被模式配置都是对称的(其中,把对方都设置成备库的配置在往后的故障转移和故障恢复起到非常重要的作用),所以在这种特殊的配置中,主-被模式反复切换模式很方便(这些操作相对于主从来说,会少了很多工作量,后续会对主从、主主拓扑结构的主被模式切换主库做个对比),这对系统的故障转移和故障恢复很容易。对于整个系统实现高可用也是非常方便且有效的(可能会配合其他负载均衡如[lvs、haproxy]+keepalive或虚拟IP等相关技术一起使用,具体方案视情况而定)。