三、keepalived + redis&mysql高可用主备

3 篇文章 0 订阅
3 篇文章 0 订阅

前提:
centos7,所有操作在root用户下进行
mysql 版本 5.7.32
Redis server 版本 6.2.4

一、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;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于您提到的keepalived、nginx、tomcat、redismysql,这些是常用于构建高可用和负载均衡的Web应用架构的关键组件。 1. KeepalivedKeepalived是一种开源的高可用解决方案,可以提供IP地址和服务的故障转移。它通常与负载均衡器(如Nginx)一起使用,以确保当主服务器故障时,备份服务器可以接管服务。 2. Nginx:Nginx是一款高性能的开源Web服务器和反向代理服务器。它可以作为负载均衡器,在多个后端服务器(如Tomcat、RedisMySQL)之间分发请求,并提供静态文件的高效传输。 3. Tomcat:Tomcat是Java Servlet容器,用于部署和运行Java Web应用程序。它可以作为应用服务器与Nginx配合使用,通过反向代理将请求分发到多个Tomcat实例,以实现负载均衡和高可用性。 4. RedisRedis是一种基于内存的开源键值存储数据库,被广泛用于缓存、会话存储和消息队列等场景。在Web应用架构中,Redis可以作为缓存层,提高数据读取速度,并减轻后端数据库(如MySQL)的负载。 5. MySQLMySQL是一种流行的开源关系型数据库管理系统,常用于存储应用程序的持久化数据。它可以与Tomcat结合使用,作为后端数据库存储和管理数据。 以上是对keepalived、nginx、tomcat、redismysql的简要介绍,它们在Web应用架构中扮演着不同的角色,以提供高可用、高性能和负载均衡的服务。如果您对其中任何一个组件有更具体的问题,我很乐意为您解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值