0

0

mysql 双机故障切换方案

php中文网

php中文网

发布时间:2016-06-07 15:10:40

|

1621人浏览过

|

来源于php中文网

原创

情景描述:原来两台数据库server做主从,因为前端有redis帮忙扛着大部分读压力,故而数据库的压力并不大,所以我们也没做读写分离,从库单纯作为备份用。这样明

情景描述:

    原来两台数据库server做主从,因为前端有redis帮忙扛着大部分读压力,故而数据库的压力并不大,所以我们也没做读写分离,从库单纯作为备份用。

    这样明显有两个缺点

        1、主库是单点

        2、从库资源浪费

所以便想出了如下的方案:让从库作为主库的热备,具备自动故障切换(failover)功能。

基本思路:

    将DB1和DB2做成主动被动模式的双主结构:DB1主动;DB2被动(通过read_only参数实现除root用户之外的只读特性),通过keepalived VIP对外,将VIP设置成原DB1的IP,保持改造过程对代码透明。

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

若无法执行查询:

        进一步通过 service mysql status 检查mysql服务是否正常:

weenCompany闻名企业网站系统5.3.0 中英文 GB2312
weenCompany闻名企业网站系统5.3.0 中英文 GB2312

weenCompany闻名企业网站系统(免费开源)是一个功能强大, 使用简单的中英文企业智能建站系统, 您只需要一些基本的计算机知识就可以利用此系统完成中小型企业网站的建设; 是低成本企业网站架设方案之首选CMS系统, 也适合建设个人网站。weenCompany闻名企业网站系统功能:1. 程序代码简洁严谨, 整个系统程序仅2M左右大小.2. 中英文双语版共用一套网站程序, 双语页面实现自由切换.3

下载

        若服务状态不正常,则尝试重启mysql,继续判断可用性:

            若重启过后执行查询OK,则本次检查OK

            若重启后仍无法执行查询,则应该关闭DB1的mysql,然后关闭DB1的keepalived,使VIP漂移到DB2,DB的keepalived察觉到自己进入master状态,通过notify_master机制触发脚本,完成将DB2的mysql从被动状态(只读)切换到主动状态(可读可写)的操作,并且发送通知邮件

       若服务状态正常,则等待30s再次尝试,若仍然无法执行查询,则重启DB1的mysql,再尝试执行sql。若仍然无法执行成功,,则执行关闭DB1的 mysql、keepalived,并将mysql服务切换至DB2的操作。

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

DB1上keepalived 配置

! Configuration File for keepalived global_defs {    notification_email {      lijiankai@dmzj.com    }    notification_email_from mysql_HA@dmzj.com    smtp_server 118.194.37.21    smtp_connect_timeout 30    router_id LVS_DEVEL } vrrp_script chk_mysql {     script "/etc/keepalived/check_mysql.sh"     interval 30         #这里我的检查间隔设置的比较长,因为我们数据库前面有redis做缓存,数据库一两分钟级别的终端对整体可用性影响不大。这也是我没有采用成熟的方案而自己搞了这一套方案的“定心丸” } vrrp_instance VI_1 {     state MASTER     interface em2     virtual_router_id 51     priority 100     advert_int 1     nopreempt           #防止切换到从库后,主keepalived恢复后自动切换回主库     authentication {         auth_type PASS         auth_pass 1111     }     track_script {         chk_mysql     }          virtual_ipaddress {         192.168.1.5/24     } }

/etc/keepalived/check_mysql.sh脚本内容如下

#!/bin/sh ###判断如果上次检查的脚本还没执行完,则退出此次执行 if [ `ps -ef|grep -w "$0"|grep "/bin/sh*"|grep "?"|grep "?"|grep -v "grep"|wc -l` -gt 2 ];then  #理论上这里应该是1,但是实验的结果却是2     exit 0 fi ###定义一个简单判断mysql是否可用的函数 function excute_query {     mysql -uxxx -pxxx -e "show processlist;" 2>>/etc/keepalived/logs/check_mysql.err } ###定义无法连接mysql,且mysql服务状态异常时的处理函数 function service_error {     echo -e "`date "+%F  %H:%M:%S"`    -----try restarting mysql-----" >> /etc/keepalived/logs/check_mysql.err     /sbin/service mysql restart &>> /etc/keepalived/logs/check_mysql.err     /sbin/service mysql status &>/dev/null     if [ $? -ne 0 ];then         ###若重启mysql服务后,仍不正常----关闭mysql----关闭keepalived         echo -e "`date "+%F  %H:%M:%S"`    -----restart mysql failure-----" >> /etc/keepalived/logs/check_mysql.err         echo -e "`date "+%F  %H:%M:%S"`    -----stop mysql-----" >> /etc/keepalived/logs/check_mysql.err         /sbin/service mysql stop &>> /etc/keepalived/logs/check_mysql.err         echo -e "`date "+%F  %H:%M:%S"`    -----now stop keepalived-----" >> /etc/keepalived/logs/check_mysql.err         /sbin/service keepalived stop &>> /etc/keepalived/logs/check_mysql.err         echo -e "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" >> /etc/keepalived/logs/check_mysql.err     fi }     ###定义若mysql服务正常,但是无法执行查询的处理函数 function connect_error {     echo -e "`date "+%F  %H:%M:%S"`    -----excute query error, but mysql service is ok, retry after 30s-----" >> /etc/keepalived/logs/check_mysql.err     sleep 30     excute_query;     if [ $? -ne 0 ];then         echo -e "`date "+%F  %H:%M:%S"`    -----still can not connect to mysql-----" >> /etc/keepalived/logs/check_mysql.err         service_error;         excute_query;         if [ $? -ne 0 ];then             echo -e "`date "+%F  %H:%M:%S"`    -----stop mysql-----" >> /etc/keepalived/logs/check_mysql.err             /sbin/service mysql stop &>> /etc/keepalived/logs/check_mysql.err             echo -e "`date "+%F  %H:%M:%S"`    -----stop keepalived-----" >> /etc/keepalived/logs/check_mysql.err             /sbin/service keepalived stop &>> /etc/keepalived/logs/check_mysql.err             echo -e "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" >> /etc/keepalived/logs/check_mysql.err         fi     fi } ###检查开始: mysql是否可连接 excute_query; if [ $? -ne 0 ];then     ###检查服务状态     /sbin/service mysql status &>/dev/null     if [ $? -ne 0 ];then               ###若服务不正常         echo -e "`date "+%F  %H:%M:%S"`    -----mysql service error-----" >> /etc/keepalived/logs/check_mysql.err         service_error;     else                               ###若服务正常,但无法连接         connect_error;             fi fi 注:脚本里关闭keepalived是在完全关闭mysql之后才执行,这样做的潜在缺点是:假如mysql服务关闭的时间过长,则直接导致整个切换过程过长,即服务终止时间过长 但是,之所以选择完全关闭DB1的 mysql再切换到DB2,是为了避免某些因素导致的数据不一致的发生

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 5.9万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

Excel 教程
Excel 教程

共162课时 | 9.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号