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

本文介绍了如何利用keepalived实现MySQL主从自动切换,详细解析了配置过程,包括MySQL主从配置、keepalived配置及切换脚本。集群在非抢占模式下运行,当MySQL服务故障时,能根据优先级自动切换主从。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:keepalived是一个非常灵活的高可用解决方案,因其对端口检测的特性,让他基本可以完成基本所有服务的高可用,但就是因为灵活导致你自己需要配置的就非常多,最主要的地方就是针对不同的地方自己编写不同的脚本。

集群拓扑:

d3d6bee139c398472dc859765077471c.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值