前提:
centos7,所有操作在root用户下进行
mysql 版本 5.7.32
Redis server 版本 6.2.4
keepalived + redis&mysql高可用主备
一、rpm安装keepalived
详见上篇文章第一章节
https://blog.csdn.net/linhan007/article/details/119182286
二、新建目录
mkdir -p /usr/local/keepalived/var/log 放日志文件
mkdir -p /usr/local/keepalived/scripts/redis_mysql 放脚本文件
三、先决条件
详见第三章节
https://blog.csdn.net/linhan007/article/details/119182286
四、MySql主主数据同步
详见第四章节
https://blog.csdn.net/linhan007/article/details/119184419
五、配置文件和脚本
用于演示的两台主台ip分别是 :
192.168.171.150,默认为master;
192.168.171.160,默认为slave;
redis虚拟飘移vip是192.168.171.100;
mysql虚拟飘移vip是192.168.171.200;
配置文件和脚本打包下载地址:
https://download.csdn.net/download/linhan007/20602480
(一)keepalived.conf配置文件
放到/etc/keepalived/keepalived.conf路径下
1.150上的配置文件
global_defs {
router_id dhbt-redis-mysql-master
script_user root
enable_script_security
}
vrrp_script chk_redis
{
#监控脚本
script "/usr/local/keepalived/scripts/redis_mysql/redis_check.sh"
#监控时间,脚本的执行时间间隔
interval 2
#超时时间
timeout 2
weight -15
#3次失败才算失败,会用weight减少优先级(1-255之间)
fall 3
#1次成功就算成功,但不修改优先级
rise 1
}
vrrp_script chk_mysql
{
#监控脚本
script "/usr/local/keepalived/scripts/redis_mysql/mysql_check.sh"
#监控时间,脚本的执行时间间隔
interval 2
#超时时间
timeout 2
weight -15
#3次失败才算失败,会用weight减少优先级(1-255之间)
fall 3
#1次成功就算成功,但不修改优先级
rise 1
}
vrrp_instance VI_1 {
#设置为MASTER
state MASTER
#本机监控网卡
interface ens33
#主从需要在同一路由编号
virtual_router_id 55
#权重值
priority 100
#vrrp通告的时间间隔,默认1s
advert_int 5
authentication {
#加密
auth_type PASS
#密码
auth_pass dhbt
}
virtual_ipaddress {
#Keppalived虚拟出来的VIP
192.168.171.100
}
track_script {
chk_redis
}
#keepalived成为master
notify_master /usr/local/keepalived/scripts/redis_mysql/redis_master.sh
#keepalived成为backup
notify_backup /usr/local/keepalived/scripts/redis_mysql/redis_slave.sh
#keepalived fault时
notify_fault /usr/local/keepalived/scripts/redis_mysql/redis_fault.sh
#keepalived服务中止时
notify_stop /usr/local/keepalived/scripts/redis_mysql/redis_stop.sh
}
vrrp_instance VI_2 {
#设置为BACKUP
state BACKUP
#本机监控网卡
interface ens33
#主从需要在同一路由编号
virtual_router_id 60
#权重值
priority 90
#vrrp通告的时间间隔,默认1s
advert_int 1
authentication {
#加密
auth_type PASS
#密码
auth_pass dhbt
}
virtual_ipaddress {
#Keppalived虚拟出来的VIP
192.168.171.200
}
track_script {
chk_mysql
}
}
注意:
(1)脚本所在路径,默认为第二章节所建目录;如放到其它目录,切记要修改;
(2)网卡名称,如和实际不符,切记要修改;
(3)vip,切记要为主机实际IP同网段的ip;
2.160上的配置文件
除了以下几点,其它和150上完全一致
(1)router_id dhbt-redis-mysql-slave
(2)vrrp_instance VI_1
① #设置为BACKUP
state BACKUP
② #权重值
priority 90
(3)vrrp_instance VI_2
① #设置为MASTER
state MASTER
② #权重值
priority 100
3.说明
vrrp_instance VI_1设置了advert_int 5,默认检测三次,所以15秒之后才会状态转变。为什么设置间隔这么长时间呢?因为默认备时为了让redis_backup.sh脚本有充足的时间执行完毕。否则可能出现以下现象:
150的keepalived不启动,160的keepalived启动时刻,默认为backup,执行redis_backup.sh,因脚本中sleep 13,所以13秒后才真正的执行slaveof 192.168.171.150;
可是如果advert_int 1,则3秒后就会向master状态转变,执行redis_master.sh,使redis变为master;但此时redis_slave.sh还未执行完毕,还未执行到slaveof 192.168.171.150;
即两个脚本参杂着执行了,导致最后redis_slave.sh又执行了slaveof 192.168.171.150,使redis最后成了slave状态,这显然是不对的。
150上:MySQL从、Redis主;160上:MySQL主,Redis从。此为理想状态,MySQL和Redis的主库各自在一台服务器上,达到负载均衡目的。
(二)脚本文件
shell脚本文件全部放在第二章节中所建目录下:/usr/local/keepalived/scripts/mysql
在150与160上都要这个脚本,并给脚本都加上可执行权限:
chmod +x /usr/local/keepalived/scripts/mysql/*
不要权限777或744,否则日志中会报脚本不安全
1.mysql_check.sh 主备两机一致
#!/bin/bash
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=!QAZ2wsx
CHECK_TIME=3
#mysql is working MYSQL_OK is 1, mysql down MYSQL_OK is 0
MYSQL_OK=1
#select 1;
function check_mysql_helth() {
mysqladmin -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} ping &>/dev/null
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
echo $MYSQL_OK
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ]; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
exit 1
fi
sleep 2
done
注意:mysql用户名和密码,要根据实际配置;
2.redis_check.sh 主备两机一致
#!/bin/bash
ALIVE=`/home/uiot_core/bin/redis/redis-cli -p 6339 PING`
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
systemctl stop keepalived
killall -9 keepalived
exit 1
fi
注意:redis-cli和端口,及日志路径,要根据实际配置;
3.redis_master.sh
150上的脚本如下编写:
!/bin/bash
REDISCLI="/home/uiot_core/bin/redis/redis-cli -p 6339"
LOGFILE="/usr/local/keepalived/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run [SLAVEOF 192.168.171.160 6339] cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.171.160 6339 >> $LOGFILE 2>&1
#延迟10秒以后待数据同步完成后再取消同步状态
sleep 10
date >> $LOGFILE
echo "Run [SLAVEOF NO ONE] cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
注意:redis-cli和端口,及日志路径,要根据实际配置。
160上的脚本,把150上脚本中的ip改为192.168.171.150即可,其它一致;
也就是说要填写对方主机的ip;
4.redis_slave.sh
150上的脚本如下编写:
#!/bin/bash
REDISCLI="/home/uiot_core/bin/redis/redis-cli -p 6339"
LOGFILE="/usr/local/keepalived/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
#延迟13秒待数据被对方同步完成之后再切换主从角色
sleep 13
date >> $LOGFILE
echo "Run [SLAVEOF 192.168.171.160 6339] cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.171.160 6339 >> $LOGFILE 2>&1
注意:redis-cli和端口,及日志路径,要根据实际配置。
160上的脚本,把150上脚本中的ip改为192.168.171.150即可,其它一致;
也就是说要填写对方主机的ip;
5.redis_fault.sh 主备两机一致
#!/bin/bash
LOGFILE="/usr/local/keepalived/var/log/keepalived-redis-state.log"
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
sh /usr/local/keepalived/scripts/redis_mysql/redis_slave_now.sh
注意:redis-cli和端口,及日志路径,要根据实际配置
6.redis_stop.sh 主备两机一致
#!/bin/bash
LOGFILE="/usr/local/keepalived/var/log/keepalived-redis-state.log"
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
sh /usr/local/keepalived/scripts/redis_mysql/redis_slave_now.sh
注意:redis-cli和端口,及日志路径,要根据实际配置
7.redis_slave_now.sh
150上的脚本如下编写:
!/bin/bash
REDISCLI="/home/uiot_core/bin/redis/redis-cli -p 6339"
LOGFILE="/usr/local/keepalived/var/log/keepalived-redis-state.log"
echo "[backup now]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
echo "Run [SLAVEOF 192.168.171.160 6339] cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.171.160 6339 >> $LOGFILE 2>&1
注意:redis-cli和端口,及日志路径,要根据实际配置;
160上的脚本,把150上脚本中的ip改为192.168.171.150即可,其它一致;
主要用于keepalved异常或退出时,把本机redis同时切换为从;
六、测试
(一)可用以下测试方法,验证测试结果。
1.查看keepalvied最新运行日志信息
tail -f /var/log/messages
2.查看脚本执行的最新日志信息
cat /usr/local/keepalived/var/log/keepalived-redis-state.log
3.查看飘移vip
在终端用 ip add查看。
150查看如下:
160查看如下:
结论:此时redis的ip飘移在150上,mysql的ip飘移在160上。
4.查看redis主备
在redis客户端用命令 info replication查看其状态
150上的redis:
160上的redis:
5.飘移地址查看mysql的存活
终端输入命令 mysqladmin -h 192.168.171.100 -uroot -p’!QAZ2wsx’ ping
输出 mysqld is alive
(二)测试用例和结果
注意:keepalved的停止要用systemctl stop keepalived,不要用service keepalved stop,否则不会触发notify_stop;
redis的飘移ip:192.168.171.100,为vip1;
mysql的飘移ip:192.168.171.200,为vip2;