一、概述

本文将介绍mysql的MM+Keepalived方案。该方案由两个mysql服务器组成,这两个mysql互为主备。其中一台主作为写服务器,另一台主作为读服务器。通过keepalived软件管理写vip,当承担写服务器的mysql出现故障时,将写vip漂移到读服务器上,实现高可用。


二、节点介绍

本次实验采用2台虚拟机,操作系统版本Centos6.10,mysql版本5.7.25
node1    10.40.16.61  主库  提供写服务
node2    10.40.16.62  主库  提供读服务

还须预留1个vip,现在不用配置,这里先提一下,后面的安装步骤用得到
10.40.16.71  写vip


三、安装

1. 配置双主架构

安利一个自己写的mysql一键安装脚本https://www.cnblogs.com/ddzj01/p/10678296.html
mysql搭建完成后,就可以配置互为主备的架构了。

Mysql - 高可用方案之MM+Keepalived

Mysql - 高可用方案之MM+Keepalived

这样node1和node2就互为主备了

在node2上将数据库设置为只读模式
(root@localhost)[(none)]> set global read_only = 1;

 

2. 安装keepalive软件

node1&node2:
yum install -y keepalived


四、修改配置文件

1. node1

编辑配置文件/etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh" # 自定义检查脚本
    interval 30                             # 设置检查间隔时长,可自行设定
}

vrrp_instance VI_1 {
    state BACKUP                            # BACKUP状态,具体意思后面介绍
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt                               # 防止主库切换到从库后,主库恢复后自动切换回主库
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_mysql
    }
    virtual_ipaddress {
        10.40.16.71/24                      # vip
    }
}

 

编辑检查mysql主库的脚本文件/etc/keepalived/check_mysql.sh

#!/bin/bash
source /root/.bash_profile
###填数据库相关信息###
DB_USER='root'
DB_PASSWD='root'
U_EMAIL='xxxx@163.com'
######################

###判断如果上次检查的脚本还没执行完,则退出此次执行
if [ `ps -ef | grep -w "$0" | grep -v "grep" | wc -l` -gt 2 ]; then
    exit 0
fi
mysql_con="mysql -u$DB_USER -p$DB_PASSWD"
error_log="/etc/keepalived/logs/check_mysql.err"

###如果error_log目录不存在则创建目录
if [ -d /etc/keepalived/logs ]; then
    usleep
else
    mkdir -p /etc/keepalived/logs
fi

###定义一个简单判断mysql是否可用的函数
function execute_query {
    $mysql_con -e "select 1;" 2>> $error_log
}

###定义无法执行查询,且mysql服务异常时的处理函数
function service_error {
    echo -e "`date "+%F %H:%M:%S"`    ----mysql service error, now stop keepalived----" >> $error_log
    service keepalived stop >> $error_log 2>&1
    echo "master1 keepalived stopped" | mail -s "master1 keepalived stopped, please take notice!" $U_EMAIL 2>> $error_log
    echo -e "\n---------------------------------------------------------\n" >> $error_log
}

###定义无法执行查询,但mysql服务正常的处理函数
function query_error {
    echo -e "`date "+%F %H:%M:%S"`    ----query error, but mysql service ok, retry after 30s----" >> $error_log
    sleep 30
    execute_query
    if [ $? -ne 0 ]; then
        echo -e "`date "+%F %H:%M:%S"`    ----still can't execute query----" >> $error_log

        ###关闭本机mysql
        echo -e "`date "+%F %H:%M:%S"`    ----stop mysql service----" >> $error_log
        service mysql stop &>> $error_log
        sleep 2    ###给执行和缓冲时间

        ###关闭本机keepalived
        echo -e "`date "+%F %H:%M:%S"`    ----stop keepalived----" >> $error_log
        service keepalived stop &>> $error_log
        echo "master1 keepalived stopped" | mail -s "master1 keepalived stopped, please take notice!" $U_EMAIL 2>> $error_log
        echo -e "\n---------------------------------------------------------\n" >> $error_log
    else
        echo -e "`date "+%F %H:%M:%S"`    ----query ok after 30s----" >> $error_log
        echo -e "\n---------------------------------------------------------\n" >> $error_log
    fi
}

###检查开始: 执行查询
execute_query
if [ $? -ne 0 ]; then
    service mysql status &> /dev/null
    if [ $? -ne 0 ]; then
        service_error
    else
        query_error
    fi
fi

View Code

相关文章:

  • 2021-05-07
  • 2021-12-07
  • 2021-12-04
  • 2021-07-01
  • 2023-03-11
  • 2021-10-18
  • 2019-09-19
  • 2018-03-02
猜你喜欢
  • 2021-09-08
  • 2021-10-22
  • 2022-12-23
  • 2021-06-22
  • 2021-05-20
  • 2023-04-10
  • 2021-08-24
相关资源
相似解决方案