当前位置:编程学堂 > MySQL双主一致性架构优化

MySQL双主一致性架构优化

  • 发布:2023-10-01 23:09

1.双主控保证高可用 MySQL数据库集群经常采用一主多从、主从同步、读写分离的方式来扩展数据库的读性能,保证读数据库的高可用性。不过,此时写入数据库仍然是单点。 在MySQL数据库集群中,可以设置两个主数据库,并设置双向同步,以冗余的方式保证写数据库的高可用性。 2.并发导致不一致 数据冗余会造成数据一致性问题,因为数据同步存在时间差,并发写入可能会导致数据同步失败,导致数据丢失: 如上图所示,假设主库使用自增作为自增主键: 在两个MySQL-master之间设置双向同步可以保证主数据库的高可用性。 数据库中现有记录的主键为1,2,3 主库1插入主键4的记录,并与主库2同步数据 在数据同步成功之前,主库2还插入了一条记录。由于数据还没有同步成功,所以插入的记录生成的主键也是4,数据也同步到了主库1。 主库1和主库2都插入了一条主键为4的记录,双主同步失败,数据不一致。 3.避免相同步长冲突 能保证两个主库生成的主键不会冲突吗? 回答: 设置不同的初始值 设置相同的增长步长 只要能够做到就可以了。 如图所示: 在两个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的所有数据。即使一个主库出现故障,另一个主库也能保证库的高写入速度。可用的。 4. 上游生成ID以避免冲突 换句话说,为什么要依靠数据库的自增ID来保证数据的一致性呢? 业务上游完全可以使用统一的ID生成器来保证ID生成不冲突: 如上图所示,调用者插入数据时,也可以通过引入全局***ID来解决这个问题,而不需要依赖数据库的自增。 至于如何生成全局***和趋势递增ID,请参考文章《分布式ID生成算法》。 5. 消除重复写入并不能解决根本原因。 使用自增同时写入两个主库可能会导致数据不一致。仅使用一个主库提供服务,另一个主库作为shadow-master,保证高可用性。一致性问题可以避免吗? 如图所示:在两个MySQL-master之间设置双向同步可以保证主数据库的高可用性。 仅主库1提供对外写作服务 两个主库设置为同一个虚拟IP。当主库1挂掉或者网络异常时,虚拟IP自动漂移,影主在上,保证主库高可用。 由于这个交换机的虚拟IP不会改变,因此切换过程对于调用者来说是透明的,但在极端情况下,也可能会导致数据不一致: 如图所示: 两台MySQL-master设置双向同步,保证主库高可用,并设置相同的虚拟IP 网络抖动前,主库1向上游提供写入服务,插入一条主键为4的记录,并与shadow master主库2同步数据 突然主库1网络出现异常。 keepalived检测到异常后,进行虚拟IP漂移,主数据库2开始提供服务。 在主键4的数据同步成功之前,主库2插入了一条记录,同时也生成了一条主键4的记录,导致数据不一致。 6.内网DNS检测 双主同步延迟导致的虚拟IP漂移和数据不一致。本质上,虚拟IP偏移需要在双主同步数据完成后才能实现。利用内网DNS检测,可以实现shadow master延迟高可用: 使用内网域名连接数据库,例如:www.sychzs.cn 主库1和主库2设置双主同步。它们不使用相同的虚拟IP,而是分别使用ip1和ip2。 首先www.sychzs.cn指向ip1 使用小脚本轮询并检测ip1主库的连通性 当ip1主库出现异常时,小脚本延时x秒,等待主库2同步数据,然后解析www.sychzs.cn到ip2。 当程序重新连接内网域名时,会自动连接ip2主数据库,保证数据一致性。 七、总结 主库高可用,主库一致性,一些技巧: 双主同步是保证写库高可用性的常用方式。 设置相同的步长和不同的初始值可以避免自增生成冲突的主键。 对于业务调用者来说,不依赖数据库生成全局***ID是一个很好的方法。 Shadow Master保证写库的高可用。只有一个写入库提供服务,无法完全保证一致性。 内网DNS检测可以在主库1出现问题后,延迟一段时间,然后切换主库,保证数据一致性。 【本文为51CTO专栏作家“58申健”原创稿件,转载请联系原作者】 点击此处查看该作者更多好文章

相关文章

最新资讯