一、概述
本文将介绍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搭建完成后,就可以配置互为主备的架构了。
这样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