Keepalived+expect方式实现Redis主从高可用实际操作(2)

为了避免主从间的来回切换,也可以设置nopreemt参数,开启非抢占式模式;不过当redis或者keepalived发生异常时都会触发各种告警,运维人员会及时介入处理。

3.启动并设置开机启动

[root@redis-master ~]# systemctl start keepalived
[root@redis-master ~]# systemctl enable keepalived

四、expect安装

[root@redis-master ~]# yum -y install expect

expect是一个提供自动交互的工具,本文notify_master中的脚本会使用到。

五、高可用脚本

1.redis-check.sh脚本

[root@redis-master keepalived]# more redis-check.sh
#!/bin/sh
rediscli="/usr/local/bin/redis-cli"
logfile="/var/log/redis_6379.log"
result=$($rediscli ping)
echo $result
echo "-------------------redis-check-------------------" >> $logfile
date >> $logfile
if [ $result == "PONG" ]; then :
  echo "Success: the result is $result" >> $logfile 2>&1
  exit 0
else
  echo "Failed:the result is $result " >> $logfile 2>&1
  exit 1
fi

该脚本为对redis状态检查

2.redis-master.sh脚本

[root@redis-master keepalived]# more redis-master.sh
#!/bin/bash
rediscli="/usr/local/bin/redis-cli"
logfile="/var/log/redis_6379.log"
sync=`$rediscli info replication|grep master_sync_in_progress|awk -F: '{print $2}'|sed 's/\r//'`
#sync=`/usr/local/bin/redis-cli info replication|grep master_sync_in_progress|awk -F: '{print $2}'`
echo $sync
echo "-------------------change to master-------------------" >> $logfile 2>&1
date >> $logfile
if [ $sync == 0 ]; then :
    echo "the master_sync_in_progress is 0 and excute slaveof no one" >>$logfile 2>&1
    $rediscli slaveof no one
elif [ $sync == 1 ]; then :
    sleep 10
    $rediscli slaveof no one
else
    echo "the host is master,do nothing" >>$logfile 2>&1
fi
/etc/keepalived/exp.sh 172.27.9.31 monitor >>$logfile 2>&1 

该脚本为本文高可用切换的关键。

monitor为31的root密码;slave脚本的ip应改为172.27.9.30;该脚本为服务器切换为master时执行的脚本,首先会检查切换前与master的主从同步是否完成,然后利用expect工具跳到另一台服务器将其redis状态更改为slave。

3.exp.sh脚本

[root@redis-master keepalived]# more exp.sh
#!/usr/bin/expect -f
set ip [lindex $argv 0 ]
set password [lindex $argv 1 ]
set timeout 30
spawn ssh root@$ip
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "$password\r";exp_continue }
}
expect "#*" 
send "/usr/local/bin/redis-cli slaveof 172.27.9.30 6379\r" 
send  "exit\r" 
expect eof

slave脚本中的ip为172.27.9.31;该脚本作用是跳到另一台服务执行slaveof命令。

六、测试

1.模拟redis服务异常

操作:停掉master的redis服务

预期:vip漂移,slave主机的redis状态切换为master

测试过程:

1.1停止master的redis服务

[root@redis-master keepalived]# service redis_6379 stop

1.2查看虚ip

Keepalived+expect方式实现Redis主从高可用实际操作

Keepalived+expect方式实现Redis主从高可用实际操作

发现vip由30漂移至31

1.3查看redis状态

[root@redis-slave keepalived]# redis-cli info replication

Keepalived+expect方式实现Redis主从高可用实际操作

31的redis状态切换为master

1.4回切

启动30的redis服务

[root@redis-master keepalived]# service redis_6379 start

查看vip和redis状态

30:

Keepalived+expect方式实现Redis主从高可用实际操作

31:

Keepalived+expect方式实现Redis主从高可用实际操作

结论:redis服务异常时会发生切换,从机会切换为master状态对外提供服务。

2.模拟keepalived服务异常

操作:停掉master的keepalived服务

预期:vip漂移,master的redis状态切换为slave,slave的redis状态切换为master

测试过程:

2.1停止master的keepalived服务

[root@redis-master keepalived]# systemctl stop keepalived

2.2查看vip和redis状态

30:

Keepalived+expect方式实现Redis主从高可用实际操作

31:

Keepalived+expect方式实现Redis主从高可用实际操作

vip由30漂移至31且主从发生反转;开启keepalived服务会触发回切。

结论:keepalived服务异常时会发生切换,主从会反转。

3.模拟master宕机

操作:master关机

预期:vip漂移,slave的redis状态切换为master

测试过程:

3.1master服务器关机

[root@redis-master ~]# init 0

3.2查看vip和redis状态

Keepalived+expect方式实现Redis主从高可用实际操作

vip漂移至31且状态切换为master;30开机会触发回切。

结论:master宕机时会发生切换,从机切换为master状态对外提供服务。

至此完成redis高可用测试。

本文所有脚本和配置文件已上传,可以到Linux公社资源站下载:

------------------------------------------分割线------------------------------------------

免费下载地址在

用户名与密码都是

具体下载目录在 /2018年资料/8月/19日/Keepalived+expect方式实现Redis主从高可用实际操作/

下载方法见

------------------------------------------分割线------------------------------------------

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1a4635bd30082e97c0f21afa21de8334.html