MySQL双主一致性架构优化

本文摘抄自沈剑老师的文章,原文地址:https://mp.weixin.qq.com/s/sCjzzi9VXPk-JcWXySfHgw

一、双主保证高可用

MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点。


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


二、并发引发不一致

数据冗余会引发数据的一致性问题,因为数据的同步有一个时间差,并发的写入可能导致数据同步失败,引起数据丢失:

MySQL双主一致性架构优化_第1张图片

如上图所述,假设主库使用了auto increment来作为自增主键:

两个MySQL-master设置双向同步可以用来保证主库的高可用

数据库中现存的记录主键是1,2,3

主库1插入了一条记录,主键为4,并向主库2同步数据

数据同步成功之前,主库2也插入了一条记录,由于数据还没有同步成功,插入记录生成的主键也为4,并向主库1也同步数据

主库1和主库2都插入了主键为4的记录,双主同步失败,数据不一致


三、相同步长免冲突

能否保证两个主库生成的主键一定不冲突呢?

回答

设置不同的初始值

设置相同的增长步长

就能够做到。


MySQL双主一致性架构优化_第2张图片

如上图所示:

两个MySQL-master设置双向同步可以用来保证主库的高可用

库1的自增初始值是1,库2的自增初始值是2,增长步长都为2

库1中插入数据主键为1/3/5/7,库2中插入数据主键为2/4/6/8,不冲突

数据双向同步后,两个主库会包含全部数据

MySQL双主一致性架构优化_第3张图片

如上图所示,两个主库最终都将包含1/2/3/4/5/6/7/8所有数据,即使有一个主库挂了,另一个主库也能够保证写库的高可用。


四、上游生成ID避冲突

换一个思路,为何要依赖于数据库的自增ID,来保证数据的一致性呢?

完全可以由业务上游,使用统一的ID生成器,来保证ID的生成不冲突:

MySQL双主一致性架构优化_第4张图片

如上图所示,调用方插入数据时,带入全局唯一ID,而不依赖于数据库的auto increment,也能解决这个问题。

你可能感兴趣的:(MySQL双主一致性架构优化)