应对亿级访问,另辟蹊径实现MySQL主库高可用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
 
 


关于如何实现MySQL主库高可用,是一个老生常谈的问题了,目前开源方案主要有MHA和MMM,各有优缺吧。笔者比较推崇的一个原则是“引入尽可能少的东西来满足需求”,所以先想到了“经典”的双主+keepalived架构。关于这个架构,网络上的资料基本都仅停留在对server和MySQL进程层面的监控来决定keepalived是否切换vip,其实这样做是远远不足以保证主库可用性及双主数据一致性的。


举例来说:很多时候主库不可用是由于负载过高或者是达到最大连接数等因素导致的,而server和MySQL进程层面却是正常的;另一方面,在keepalived切换过程中若没有严格的监测当时从库是否有延迟、主库上是否还有耗时的写操作等细节,就无法避免双主数据分列的产生。


因此,笔者在“双主+keepalived”架构的基础上,通过shell脚本主要从以下三个方面进行了改进:


  1. 如何有效地判断主库可用性(通过具体的查询语句来判定);

  2. 如何“优雅”地执行vip切换动作;

  3. 主库修复后,如何安全地将vip切回主库。


目前,这套系统在笔者的线上环境使用,数据库日查询量9000w以上,期间经历过几次切换,未出现数据不一致等异常。


基本思路
 
 


将DB1和DB2做成主动被动模式的双主结构:DB1主动、DB2被动,通过keepalived的VIP对外,将VIP设置成原DB1的IP,保证改造过程对代码透明。


三个前提:

  • 两台MySQL的配置文件里需要加上“log_slave_updates = 1”;

  • 并且“备用机”通过“read_only”参数实现除root用户之外的只读特性;

  • 分别在两个数据库创建test.test表,插入几条数据,供检测脚本使用。

正常时,VIP在DB1,通过keepalived调用脚本定期检查mysql服务可用性(通过一个低权限用户连接mysql服务器并执行一个简单查询,根据返回结果来判定mysql是否可用)。


若无法执行查询:


 

1. 第一次检测失败后,检查服务状态:

  1. 若服务异常,则执行切换:关闭DB1的keepalived,使VIP漂移至DB2,通过DB2上keepalived的notify_master机制,触发脚本将DB2的mysql从被动状态(只读)切换到主动状态(可读写),并发送通知邮件。

  2. 若服务正常(则可能是一些临时性因素导致的监测失败),等待30s做第二次检查,这30s是对瞬时/短时因素造成检查失败的容忍时间,本着“能不切则不切”的原则。若第二次检查仍然失败

 

2.  开始执行系列切换动作

  1. 将DB1的MySQL设置为 read_only模式 (阻止写请继续求进入)

  2. 在DB1上kill掉当前客户端的线程。原来担心kill掉线程会对数据执行造成影响,后来查看了官方文档“mysql shutdown process”,发现mysql正常关闭过程也有一步是如此操作,所以这里可以放心了。然后 sleep 2,给kill命令一些时间(关于kill命令的机制,参考官方解释

  3. 关闭DB1的keepalived,使DB2接管VIP。通过DB2上keepalived的notify_master机制,触发脚本将DB2的mysql从被动状态(只读)切换到主动状态(可读写),并发送通知邮件。

 
 

3.  管理员修复DB1后,通过脚本“change_to_backup.sh”将主库切换回DB1。脚本思路如下:

:涉及到切换主备,就会有中断时间,所以推荐此步骤在业务低谷期执行)

  1. 将DB2的read_only属性置为1

  2. kill掉DB2上的client线程,并重启DB2的keepalived使VIP漂移至DB1

  3. 确定DB1跟上了DB2的更新,并将DB1上的read_only属性移除

 
 

关于“数据一致性”和“切换时间”:

连续两次失败以后,通过对主MySQL设置read_only属性,同时kill掉用户线程来保证在DB2接管服务之前,DB1上已经没有写操作,避免主从数据不一致。并且切换时间基本上是可确定的:

  • keepalived检测间隔笔者设置为30s(可调整)

  • 若server或MySQL进程级故障,则马上切换,切换时间 < 2s(keepalived切换时间)

  • 若其他原因,则切换时间 < 30s(shell脚本里尽量避免切换而等待30s,可调整)+2s(给kill 主库sql的时间)+2s(keepalived切换时间)

 


以上是大致思路,具体实现看过下面的脚本,就会一目了然了。


DB1上keepalived配置



/etc/keepalived/check_mysql.sh脚本内容如下(主要的判断逻辑都在这里)





DB2上keepalived配置:



/etc/keepalived/notify_master_mysql.sh脚本内容:



DB2上手动切换回DB1的脚本change_to_backup.sh:




日志截图:


DB1 mysql服务故障:



DB1 mysql服务正常,查询失败:

 


DB2 一次切换过程:



DB2 执行脚本手动切回DB1:



总结
 


此方案解决了主从中master节点的单点问题;同时,在此基础上,可以再增加从库和中间件实现读写分离等架构。


作者介绍  李建凯

  • 6年Linux运维经验,现混迹动漫行业,任职动漫之家运维经理。

  • 经历过五六台server的“小作坊”,也见识过日pv近亿的“大考验“。多年的一线工作积累了丰富的trouble shooting经验。

  • 擅长应用运维,对数据库感兴趣并对MySQL有些研究。


经作者同意授权转载

作者:李建凯

博客:奋进的K


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-04-25

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
运维 监控 关系型数据库
MySQL高可用方案:MHA与Galera Cluster对比
本文深入对比了MySQL高可用方案MHA与Galera Cluster的架构原理及适用场景。MHA适用于读写分离、集中写入的场景,具备高效写性能与简单运维优势;而Galera Cluster提供强一致性与多主写入能力,适合对数据一致性要求严格的业务。通过架构对比、性能分析及运维复杂度评估,帮助读者根据自身业务需求选择最合适的高可用方案。
|
2月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
1月前
|
关系型数据库 MySQL Linux
MySQL包安装 -- SUSE系列(SUSE资源库安装MySQL)
本文介绍了在openSUSE系统上通过SUSE资源库安装MySQL 8.0和8.4版本的完整步骤,包括配置国内镜像源、安装MySQL服务、启动并验证运行状态,以及修改初始密码等操作,适用于希望在SUSE系列系统中快速部署MySQL的用户。
176 3
MySQL包安装 -- SUSE系列(SUSE资源库安装MySQL)
|
1月前
|
运维 Ubuntu 关系型数据库
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
本文介绍了在Debian系列系统(如Ubuntu、Debian 11/12)中通过APT仓库安装MySQL 8.0和8.4版本的完整步骤,涵盖添加官方源、配置国内镜像、安装服务及初始化设置,并验证运行状态,适用于各类Linux运维场景。
556 0
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
|
1月前
|
存储 关系型数据库 MySQL
MySQL介绍和MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
MySQL是一款开源关系型数据库,高性能、易用、跨平台,支持多种存储引擎,广泛应用于Web开发、企业级应用等领域。本教程介绍其特点、架构及在主流Linux系统中的安装配置方法。
474 0
MySQL介绍和MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
|
2月前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
333 3
|
4月前
|
缓存 关系型数据库 MySQL
MySQL并发访问与高负载处理方法
综上所述,提高MySQL并发能力和处理高负载的策略涵盖了硬件配置、软件优化、架构调整以及运维监控等多个方面。通过综合施策,可以确保数据库系统在面对不断增长的并发需求时,维持高效和稳定的性能。
264 8
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
887 3
Mysql高可用架构方案
|
9月前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
572 6

推荐镜像

更多