运维笔记37 mysql主从自动切换(keepalived+自制脚本)

概述:keepalived是一个非常灵活的高可用解决方案,因其对端口检测的特性,让他基本可以完成基本所有服务的高可用,但就是因为灵活导致你自己需要配置的就非常多,最主要的地方就是针对不同的地方自己编写不同的脚本。
集群拓扑:
运维笔记37 mysql主从自动切换(keepalived+自制脚本)_第1张图片
mysql版本:Ver 14.14 Distrib 5.7.11
keepalived版本:Keepalived v1.2.24 (03/30,2017)
集群描述:
该集群主要为mysql集群,与一般不同的是,本集群可以进行mysql主从的自动切换,当mysql1服务down掉后,切换根据优先级切换到2为主,而且将keepalived设置成非抢占模式(就是keepalived全部为BACKUP)。

一mysql主从配置

mysql1配置:
/etc/my.cnf

[mysqld]
binlog-do-db=test
log-bin=mysql-bin
server-id=1
gtid-mode=ON
enforce-gtid-consistency

mysql2

[mysqld]
socket=/usr/local/lnmp/mysql/data/mysql.sock
gtid-mode=ON
enforce-gtid-consistency
log-bin=mysql-bin
log-slave-updates=ON
server-id=2

mysql3


[mysqld]
gtid-mode=ON
enforce-gtid-consistency
socket=/usr/local/lnmp/mysql/data/mysql.sock
log-bin=mysql-bin
log-slave-updates=ON
server-id=3
binlog-do-db=test

keepalived配置

mysql1上keepalived配置

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@master.mo.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    nopreempt
    notify_master /mnt/master.sh
    #notify_backup /mnt/test.sh
    #nofify_stop  /mnt/sh/stop.sh
    virtual_ipaddress {
        172.25.3.200
    }
}
virtual_server 192.168.184.200 3306 {
      delay_loop 2
      lb_algo wrr
      lb_kind DR
      persistence_timeout 60
      protocol TCP
      real_server 172.25.3.103 3306 {
      weight 3
      notify_down /mnt/down.sh
      TCP_CHECK {
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 3306
      }
      }
      real_server 172.25.3.104 3306 {
      weight 3
      notify_down /mnt/down.sh
      TCP_CHECK {
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 3306
      }
      }
}

mysql2与mysql3修改的部分只有vrrp_instance VI_1处的priority和virtual_server中监控的realserver(mysql2 监控172.25.3.102与172.25.3.104,mysql2监控172.25.3.102与172.25.3.103总之就是除了自己外的其他台)。

三keepalived的master脚本

刚接触keepalived的时候总是无法理解keepalived脚本的使用时间,通过这次实验终于理解,我们本次只是使用了notify_master选项后跟的脚本是当keepalived成为master的时候才执行,但什么是成为master呢,我们本次的keepalived是全部没有master的全slave模式呀,那这时候master就是获得ip的那台,那确切又是什么时候执行,执行这个脚本就是vrrp根据priority选举得出master结果的时候。
现在上master.sh脚本:

#!/bin/bash
PATH=$PATH:/usr/local/lnmp/mysql/bin
max_list ()
{
    max=0
    list=()
    len=$1
    for i in $(seq $len)
    do
        shift
        list[$i]=$1
    done
    for i in $(seq $len)
    do
        if [ ${list[$i]} -gt $max ]
        then
            max=${list[$i]}
            index=$i
        fi
    done
    return $(($index-1));
}
touch /media/aaa
ip_list=('172.25.3.102' '172.25.3.103' '172.25.3.104')
proprity=(100 50 25)
mysqladmin -h${ip_list[0]} -uroot -predhat ping > /dev/null 2>&1 ; result1=$?;
mysqladmin -h${ip_list[1]} -uroot -predhat ping > /dev/null 2>&1 ; result2=$?;
mysqladmin -h${ip_list[2]} -uroot -predhat ping > /dev/null 2>&1 ; result3=$?;

if [ $result1 = '0' -a $result2 = '0' -a $result3 = '0' ];
then
    touch /media/test1
    max_index=1
    len=3
    for i in $(seq $len)
    do
        if [ $i -ne $max_index ]
        then
            echo ${ip_list[$(($i-1))]} >> /media/test1

            mysql -h${ip_list[$(($i-1))]} -uroot -predhat -e "stop slave;"
            mysql -h${ip_list[$(($i-1))]} -uroot -predhat -e "start slave;"
         fi
     done
elif [ $result1 != '0' -a $result2 = '0' -a $result3 = '0' ];
then
    touch /media/test2
    proprity=(0 50 25)
    max_list 3 ${proprity[*]}
    max_index=$?
    echo $max_index
    echo ${ip_list[$max_index]}
    mysql -h${ip_list[2]} -uroot -predhat -e "stop slave"
    mysql -h${ip_list[2]} -uroot -predhat -e "change master to MASTER_HOST='${ip_list[$max_index]}',MASTER_USER='repl',MASTER_PASSWORD='redhat',MASTER_AUTO_POSITION=1;" > /dev/null 2>&1
    mysql -h${ip_list[2]} -uroot -predhat -e "start slave"
    if [ $? -eq 0 ];
    then
        echo 'success replication'
    else
        echo 'false'
    fi
elif [ $result1 = '0' -a $result2 != '0' -a $result3 = '0' ];
then
    touch /media/test3
    proprity=(100 0 25)
    max_list 3 ${proprity[*]}
    max_index=$?
    echo $max_index
    echo ${ip_list[$max_index]}
    mysql -h${ip_list[2]} -uroot -predhat -e "stop slave"
    mysql -h${ip_list[2]} -uroot -predhat -e "change master to MASTER_HOST='${ip_list[$max_index]}',MASTER_USER='repl',MASTER_PASSWORD='redhat',MASTER_AUTO_POSITION=1;" > /dev/null 2>&1
    mysql -h${ip_list[2]} -uroot -predhat -e "start slave"
    if [ $? -eq 0 ];
    then
        echo 'success replication'
    else
        echo 'false'
    fi

fi

由于编写脚本耗费了很多时间,并没有对各种异常情况进行很好的测试,有同学使用中遇到问题的,请留言告知,我会尽快修改,谢谢!

你可能感兴趣的:(运维学习)