mysql 高可用方案漫谈(一)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介:

引言:

      AliCloudDB HA系统是为阿里云 mysql,sqlserver,pgsql 三大数据库提供实例高可用的一整套技术方案,确保系统能够在故障中快速恢复。同时HA 也满足日常运维管理中涉及到主备切换的需求。由于mysql 在业内使用最为广泛,所以本系列先介绍mysql实例高可用的相关技术。

基本架构:

      目前使用最为广泛的实例架构是采用一主一备 share-nothing 的结构。数据链路支持RLB + dbnode 与 RLB + proxy + dbnode 两种。为简便起见,本文以proxy 链路,引擎为innodb 的实例为例介绍。
    rds mysql 实例架构图

      主备同步模式支持半同步,与异步两种方式,强同步在mysql5.7中将被支持。

      这里简要介绍下三种同步方式的区别:

      异步模式:主库收到commit 请求后,依次执行:写redo log prepare,写入binlog,写redo log commit,返回客户端成功。

      半同步模式:主库收到commit 后,依次执行 redo log prepare,写binlog/发往备库(两个步骤并行),等待备库回复收到ack,redo log commit,给用户回复成功。

      强同步模式:主库收到commit 后,依次执行 redo log prepare,写binlog/发往备库(并行),等待备库fsync到磁盘后,redo log commit ,给用户恢复成功。

      以上步骤中,写入redo log 步骤受参数innodb_flush_log_at_trx_commit 影响。 分为0,1,2三种设置,具体含义这里不再赘述。写入binlog 步骤受 sync_binlog 参数影响,具体数字含义,也不再赘述。在两个参数双1 条件下,数据最为安全可靠,性能略有下降。本文假设我们都是设置在双1条件下。

健康检测与切换类型:

健康检测:

      HA 使用update 语句对mysql 实例分别通过VIP,物理IP进行检测,这样检测的优点是可以检测从VIP到用户实例主库的整条链路的可用性,同时配合备库的io线程的健康状况,避免HA到用户主库网络故障情况下,主库实例健康时的误判。

      HA 每次update 成功时,HA都将主库的时间戳记录到HA当中,同时更新主备库的心跳表,让备库同步主库写入的时间戳,当发生切换时,对比HA中与实例备库中保存的时间戳,可以得到备库大致的延迟。作为主备延迟的判断依据之一。

当实例发生连接超时,连接重置,更新超时,socket超时时都被称作故障切换。

 

普通切换

      当发生mysql实例版本升级,规格升级,刷新实例参数等情况时,需要对实例做主备切换。切换基本步骤如下:

  • 预检查主备延迟,如果延迟较大,那么直接退出切换,等待下次切换。
  • 如果延迟在一定范围内,那么进入切换流程,调用proxy api 切换VIP 指向备库。Proxy 此时会hold 住用户新的连接和请求,不会访问备库(桥接)。关于桥接的具体详情可以参考proxy 技术方案的文章。
  • kill 主库连接,设置read_only参数为ON。等待主库瞬间连接上来的事务结束。
  • 读取主库master binlog 的位点信息,等待备库同步到该位点,由于之前进行过预等待所以此步骤不会等待很长时间,根据实际运行中数据观察可以控制在数秒以内。
  • 备库打开read_only 为OFF
  • 调用proxy api 放开用户连接的请求。整个切换过程不会超过10S,用户会感觉到服务器卡住一小段时间后,恢复正常。

 

故障切换

      mysql实例发生故障的环节可能多种多样,这里仅以主备库采用异步复制模式,并且主库所在主机故障导致的切换为例来讲解基本的故障恢复流程,其他类型的故障后面会再综合介绍。

  • 当主库自身发生故障时,HA连接主机后,返回的错误类型是连接超时,或者收到主库返回的rst包,那么进入切换流程。
  • 检查备库延迟自身SQL线程延迟,如果有延迟,那么不切换,等待备库应用relaylog。
  • 当备库SQL线程没延迟后,尝试连接主库,获取主库master binlog,如果能够获取,那么就等待备库跟上主库到该位点。如果不能获取(一般都是如此),那么对比主备库时间戳,如果时间戳在一定范围内(主备可能存在数据不一致),那么根据用户指定的策略决定是否切换。

A, 如果用户指定可用性优先,那么HA会将用户连接切换至备库,数据可能丢失,已经通报给用户。

B, 如果用户指定可靠性优先,那么不会切换VIP,人工介入重启主库或主实例,或拷贝redo log,修复数据,确保主备一致后,提供服务。

      由于异步模式在有主备IO线程延迟情况下可能存在数据丢失,我们数据库内核组专门开发了double binlog 复制方式,用于专门判断在切换时是否存在数据丢失,如果存在,那么可靠性优先条件下不切换,可用性优先条件下可以切换。

      在用户指定了半同步模式下,也有可能导致主备数据不一致,但是不会引起数据丢失(数据丢失的定义是用户commit 后收到成功的回复,但是数据库内没有该数据。对于执行超时,或者执行异常,客户端认为是unknown状态,那么数据库可以选择丢弃该事务,或者应用该事务)。Semi-sync条件下,主备故障切换后,备库按照新主库备份集来重新搭建,确保主备数据一致。

其他故障切换:
    HA故障图

      以上图中各处都有可能发生故障,那么对于不同的故障情况,都要分别逐一考虑,目前HA从整体上已经保证了以上各种故障条件下,可以在用户指定策略下按预期切换。考虑篇幅过长,每种情况的分析放在下次分享中,这里暂不作介绍。

 

HA 自身高可用与高可靠

      HA 通过多台机器采用多MASTER结构平衡负载,每台HA负责该region的一部分实例,并动态平衡,同时如果有一台HA发生故障,那么其他HA机器会争抢该dead HA所负责实例,然后再次平衡负载,实现方法既可以很简单,也可以很复杂, ha 这里由于考虑多单元部署的成本问题,使用metaDB中一个表作为负载均衡器,使用另外一张表作为HA心跳表,同时metaDB 使用一主多备方案,避免单点故障。整体上解决了HA 自身的高可用问题。

总结:

      本片主要简单讨论了HA for mysql 异步复制条件下基本切换流程, 没有介绍各种切换方式的优缺点及各种讨论,以及半同步条件,for mssql, for pgsql 条件下的切换,业内其他厂商如何解决数据库可靠性与可用性问题的相关内容。敬请期待。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
8月前
|
运维 监控 关系型数据库
MySQL高可用方案:MHA与Galera Cluster对比
本文深入对比了MySQL高可用方案MHA与Galera Cluster的架构原理及适用场景。MHA适用于读写分离、集中写入的场景,具备高效写性能与简单运维优势;而Galera Cluster提供强一致性与多主写入能力,适合对数据一致性要求严格的业务。通过架构对比、性能分析及运维复杂度评估,帮助读者根据自身业务需求选择最合适的高可用方案。
|
8月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
9月前
|
存储 关系型数据库 MySQL
修复.net Framework4.x连接MYSQL时遇到utf8mb3字符集不支持错误方案。
通过上述步骤大多数情况下能够解决由于UTF-encoding相关错误所带来影响,在实施过程当中要注意备份重要信息以防止意外发生造成无法挽回损失,并且逐一排查确认具体原因以采取针对性措施解除障碍。
595 12
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
1241 3
Mysql高可用架构方案
|
10月前
|
SQL 关系型数据库 MySQL
解决MySQL "ONLY_FULL_GROUP_BY" 错误的方案
在实际操作中,应优先考虑修正查询,使之符合 `ONLY_FULL_GROUP_BY`模式的要求,从而既保持了查询的准确性,也避免了潜在的不一致和难以预测的结果。只有在完全理解查询的业务逻辑及其后果,并且需要临时解决问题的情况下,才选择修改SQL模式或使用 `ANY_VALUE()`等方法作为短期解决方案。
979 8
|
9月前
|
监控 NoSQL 关系型数据库
保障Redis与MySQL数据一致性的强化方案
在设计时,需要充分考虑到业务场景和系统复杂度,避免为了追求一致性而过度牺牲系统性能。保持简洁但有效的策略往往比采取过于复杂的方案更加实际。同时,各种方案都需要在实际业务场景中经过慎重评估和充分测试才可以投入生产环境。
451 0
|
10月前
|
关系型数据库 MySQL Java
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2328 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
804 9

推荐镜像

更多