脚本实现sentinel高可用

脚本实现sentinel高可用

   张吉吉     2019年12月30日 01:31     728    

1、搭建redis sentinel

 redis搭建sentinel

2、以VIP实现高可用

当搭建完redis sentinel以后,虽然已经实现了出现故障时的主备切换的功能,但是一般链接着redis的业务也需要更改一下其链接的redis的地址(当然这个并不是一定的),如果还需要手动去修改的话,可能会耽误业务链接的时间,进而影响业务的使用,造成损失。所以最好还是能由平台自动去实现这个功能。

这里提供了一种办法,当然还有很多别的办法,后边会再写。这里只需要一个虚拟IP(VIP),然后编写一个自动切换VIP的脚本就可以了。

再sentinel中提供了一个字段,就是sentinel client-reconfig-script。当redis出现故障切换的时候就会自动执行这个脚本,每个sentinel都会去执行这个脚本。执行脚本实现VIP的转移,转移到新的master上边。

原理就是这样。

(1)修改sentinel配置文件

sentinel client-reconfig-script mymaster /usr/local/redis/scripts/changeVip.sh

配置此字段,告诉sentinel执行哪个脚本。

(2)脚本编写

#!/bin/bash

RPORT=6379                           #端口

VIP="192.168.60.153"                   #虚拟IP

VIP_NETMASK="255.255.255.255"          #IP的掩码

IP=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}'|grep -v $VIP)

#获取IP地址

EXISTPORT=$(netstat -an | grep -w 6379 | grep LISTEN | wc -l)

#判断redis是否存活

NETNAME=$(ls /sys/class/net | grep -v lo)

#获取网卡名称

REDIS_HOME='/usr/local/redis/'

#配置redis目录

REDIS_NAME=$($REDIS_HOME/src/redis-cli -h $IP -p $RPORT INFO replication | grep role|tr -d '\r' | cut -d: -f2)

#查看redis的角色,master或者slave

 

if [ $EXISTPORT -eq 0 ]

then

        ip addr del "$VIP/32" dev $NETNAME

         echo "This VIP id down" >> /usr/local/redis/scripts/info.log

        exit 0

else

        if [ "$REDIS_NAME" = "master" ]

        then

                ifconfig "$NETNAME:1" $VIP netmask $VIP_NETMASK

                 echo "This VIP id up" >> /usr/local/redis/scripts/info.log

        fi

fi

以上脚本的原理也很简单,就是取出redis的状态,这里判断状态就是看看redis的端口是否还在,其实应该多加些判断的内容,比如看进程是否存在,这里判断的比较简单。如果判断redis已经不是存活状态,就删除掉master上的虚拟ip,然后如果还存活,说明服务器是slave,然后就判断切换之后的状态是不是master,如果是master,就配置虚拟IP。

如果发生问题,三个sentinel会同时执行脚本,当redis master去执行的时候,因为脚本已经判断redis是不存活得状态,就会去删除掉redis master上得虚拟ip,当redis slave去执行这个脚本的时候,判断redis是存活的,所以就会去判断当前的slave是不是已经转换为master,如果是转换为master的redis就会去启动虚拟ip,从而实现虚拟ip的切换。

以上的脚本有的地方其实还并不够严谨,还能有很多更值得优化的地方。


后来一段时间,仔细研究了sentinel的配置文件,发现原来在执行脚本切换的时候会传递7个参数进去,这7个参数中旧包含了旧master的地址和端口和新的master的地址和端口。这样一来就不用如同上边一样去费劲的获取新的master,这篇文章是一个新的redis偏移虚拟IP的脚本,推荐使用这个脚本

新的redis-sentinel虚拟IP偏移脚本

 

3、开机添加虚拟ip

在/etc/rc.d/rc.loal下添加如下字段实现开机添加虚拟ip的方法。

ip addr add  192.168.60.153/32 dev ens33

然后redis和sentinel也都设置为开机启动,这样就形成一套在开机能够直接使用的redis sentinel平台。

当平台发生故障的时候,不需要人工干预,自动完成主备服务器切换的过程。只需要去修复出现故障的redis,redis也能自动融入新的平台中,充当备机的状态。


4、附件

下边是脚本,根据实际情况修改。

changeVip.txt


文章评论

0

其他文章