MySQL双主一致性架构优化

本文摘抄自沈剑老师的文章,原文地址:https://mp.weixin.qq.com/s/sCjzzi9VXPk-JcWXySfHgw
一、双主保证高可用
MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点。


在一个MySQL数据库集群中可以设置两个主库,并设置双向同步,以冗余写库的方式来保证写库的高可用。


二、并发引发不一致
数据冗余会引发数据的一致性问题,因为数据的同步有一个时间差,并发的写入可能导致数据同步失败,引起数据丢失:
MySQL双主一致性架构优化
文章图片
如上图所述,假设主库使用了auto increment来作为自增主键:
两个MySQL-master设置双向同步可以用来保证主库的高可用
数据库中现存的记录主键是1,2,3
主库1插入了一条记录,主键为4,并向主库2同步数据
数据同步成功之前,主库2也插入了一条记录,由于数据还没有同步成功,插入记录生成的主键也为4,并向主库1也同步数据
主库1和主库2都插入了主键为4的记录,双主同步失败,数据不一致


三、相同步长免冲突
能否保证两个主库生成的主键一定不冲突呢?
回答
设置不同的初始值
设置相同的增长步长
就能够做到。


MySQL双主一致性架构优化
文章图片
如上图所示:
两个MySQL-master设置双向同步可以用来保证主库的高可用
库1的自增初始值是1,库2的自增初始值是2,增长步长都为2
库1中插入数据主键为1/3/5/7,库2中插入数据主键为2/4/6/8,不冲突
数据双向同步后,两个主库会包含全部数据
MySQL双主一致性架构优化
文章图片
如上图所示,两个主库最终都将包含1/2/3/4/5/6/7/8所有数据,即使有一个主库挂了,另一个主库也能够保证写库的高可用。


四、上游生成ID避冲突
换一个思路,为何要依赖于数据库的自增ID,来保证数据的一致性呢?
完全可以由业务上游,使用统一的ID生成器,来保证ID的生成不冲突:
MySQL双主一致性架构优化
文章图片
【MySQL双主一致性架构优化】如上图所示,调用方插入数据时,带入全局唯一ID,而不依赖于数据库的auto increment,也能解决这个问题。

    推荐阅读