网站网站建设平台,注册公司是在哪个网站,wordpress固定连接不能访问文章,环保网站模板下载转自#xff1a;MySQL双主一致性架构优化 - osc_avwazwuz的个人空间 - OSCHINAmy.oschina.net一、双主保证高可用MySQL数据库集群常使用一主多从#xff0c;主从同步#xff0c;读写分离的方式来扩充数据库的读性能#xff0c;保证读库的高可用#xff0c;但此时写库仍然…转自MySQL双主一致性架构优化 - osc_avwazwuz的个人空间 - OSCHINAmy.oschina.net一、双主保证高可用MySQL数据库集群常使用一主多从主从同步读写分离的方式来扩充数据库的读性能保证读库的高可用但此时写库仍然是单点。在一个MySQL数据库集群中可以设置两个主库并设置双向同步以冗余写库的方式来保证写库的高可用。二、并发引发不一致数据冗余会引发数据的一致性问题因为数据的同步有一个时间差并发的写入可能导致数据同步失败引起数据丢失MySQL双主一致性架构优化 - osc_avwazwuz的个人空间 - OSCHINA一、双主保证高可用MySQL数据库集群常使用一主多从主从同步读写分离的方式来扩充数据库的读性能保证读库的高可用但此时写库仍然是单点。在一个MySQL数据库集群中可以设置两个主库并设置双向同步以冗余写库的方式来保证写库的高可用。二、并发引发不一致数据冗余会引发数据的一致性问题因为数据的同步有一个时间差并发的写入可能导致数据同步失败引起数据丢失如上图所述假设主库使用了auto increment来作为自增主键两个MySQL-master设置双向同步可以用来保证主库的高可用数据库中现存的记录主键是123主库1插入了一条记录主键为4并向主库2同步数据数据同步成功之前主库2也插入了一条记录由于数据还没有同步成功插入记录生成的主键也为4并向主库1也同步数据主库1和主库2都插入了主键为4的记录双主同步失败数据不一致三、相同步长免冲突能否保证两个主库生成的主键一定不冲突呢回答设置不同的初始值设置相同的增长步长就能够做到。如上图所示两个MySQL-master设置双向同步可以用来保证主库的高可用库1的自增初始值是1库2的自增初始值是2增长步长都为2库1中插入数据主键为1/3/5/7库2中插入数据主键为2/4/6/8不冲突数据双向同步后两个主库会包含全部数据如上图所示两个主库最终都将包含1/2/3/4/5/6/7/8所有数据即使有一个主库挂了另一个主库也能够保证写库的高可用。四、上游生成ID避冲突换一个思路为何要依赖于数据库的自增ID来保证数据的一致性呢完全可以由业务上游使用统一的ID生成器来保证ID的生成不冲突如上图所示调用方插入数据时带入全局唯一ID而不依赖于数据库的auto increment也能解决这个问题。至于如何生成全局唯一趋势递增的ID参见文章《分布式ID生成算法》。五、消除双写不治本使用auto increment两个主库并发写可能导致数据不一致只使用一个主库提供服务另一个主库作为shadow-master只用来保证高可用能否避免一致性问题呢如上图所示两个MySQL-master设置双向同步可以用来保证主库的高可用只有主库1对外提供写入服务两个主库设置相同的虚IP在主库1挂掉或者网络异常的时候虚IP自动漂移shadow master顶上保证主库的高可用这个切换由于虚IP没有变化所以切换过程对调用方是透明的但在极限的情况下也可能引发数据的不一致如上图所示两个MySQL-master设置双向同步可以用来保证主库的高可用并设置了相同的虚IP网络抖动前主库1对上游提供写入服务插入了一条记录主键为4并向shadow master主库2同步数据突然主库1网络异常keepalived检测出异常后实施虚IP漂移主库2开始提供服务在主键4的数据同步成功之前主库2插入了一条记录也生成了主键为4的记录结果导致数据不一致六、内网DNS探测虚IP漂移双主同步延时导致的数据不一致本质上需要在双主同步完数据之后再实施虚IP偏移使用内网DNS探测可以实现shadow master延时高可用主库1和主库2设置双主同步不使用相同虚IP而是分别使用ip1和ip2用一个小脚本轮询探测ip1主库的连通性当ip1主库发生异常时小脚本delay一个x秒的延时等待主库2同步完数据之后再将http://db.58daojia.org解析到ip2程序以内网域名进行重连即可自动连接到ip2主库并保证了数据的一致性七、总结主库高可用主库一致性一些小技巧双主同步是一种常见的保证写库高可用的方式设置相同步长不同初始值可以避免auto increment生成冲突主键不依赖数据库业务调用方自己生成全局唯一ID是一个好方法shadow master保证写库高可用只有一个写库提供服务并不能完全保证一致性内网DNS探测可以实现在主库1出现问题后延时一个时间再进行主库切换以保证数据一致性