概述:keepalived是一个非常灵活的高可用解决方案,因其对端口检测的特性,让他基本可以完成基本所有服务的高可用,但就是因为灵活导致你自己需要配置的就非常多,最主要的地方就是针对不同的地方自己编写不同的脚本。
集群拓扑:
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
由于编写脚本耗费了很多时间,并没有对各种异常情况进行很好的测试,有同学使用中遇到问题的,请留言告知,我会尽快修改,谢谢!