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

栏目: 数据库 · 发布时间: 6年前

内容简介:redis高可用有Sentinel、Cluster等多种方式,本文主要介绍keepalived方式。keepalived常用的实现高可用方式是当检查到被监控进程或keepalived服务本身挂掉时触发切换,这种方式对于redis主从高可用会有一个问题:当主的keepalived挂掉时,此时无法触发keepalived里的notify_backup脚本,主的redis状态还是master;此时从服务器会接管vip并且redis状态由slave切换为master,这时就会有两个master,主从架构被破坏。为

前言:

redis高可用有Sentinel、Cluster等多种方式,本文主要介绍keepalived方式。

keepalived常用的实现高可用方式是当检查到被监控进程或keepalived服务本身挂掉时触发切换,这种方式对于 redis 主从高可用会有一个问题:当主的keepalived挂掉时,此时无法触发keepalived里的notify_backup脚本,主的redis状态还是master;此时从服务器会接管vip并且redis状态由slave切换为master,这时就会有两个master,主从架构被破坏。为了解决该问题,在notify_master脚本使用expect工具,本文在主从发生切换时,切换为master的主机会触发notify_master脚本,该脚本中的expect工具会远程到对方主机执行slaveof命令,重新确定主从关系。

架构:

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

配置:

hostname ip os redis版本 keepalived版本 备注
redis-master 172.27.9.30 CentOS7.3.1611 4.0.10 1.3.5 关闭防火墙和selinux
redis-slave 172.27.9.31 Centos7.3.1611 4.0.10 1.3.5 关闭防火墙和selinux

一、redis安装

redis安装有yum和编译两种方式,本文以编译方式安装,参考文档为官网安装文档

1.gcc安装

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

2.下载安装包

[root@redis-master ~]# wget http://download.redis.io/redis-stable.tar.gz

3.解压编译

[root@redis-master ~]# tar xvzf redis-stable.tar.gz

[root@redis-master ~]# cd redis-stable

[root@redis-master redis-stable]# make

[root@redis-master redis-stable]# make install

4.修改配置文件

[root@redis-master redis-stable]# mkdir /etc/redis[root@redis-master redis-stable]# mkdir -p /var/redis/6379

[root@redis-master redis-stable]# cp redis.conf /etc/redis/6379.conf

[root@redis-master redis-stable]# cd /etc/redis/

[root@redis-master redis]# cp 6379.conf 6379.conf.bak

[root@redis-master redis]# grep -Ev '^$|#' 6379.conf.bak > 6379.conf

主要配置修改如下:

#bind 127.0.0.1

protected-mode no

daemonize yes

pidfile /var/run/redis_6379.pid

logfile /var/log/redis_6379.log

dir /var/redis/6379

5.制作启动服务

[root@redis-master redis-stable]# cp utils/redis_init_script /etc/init.d/redis_6379

6.启动服务并加入开机启动

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

7.RedisDesktopManager管理工具

工具 为redis图形化管理工具

软件下载:链接: https://pan.baidu.com/s/1Q9k-zyhfTWbvjbHaZvafbw 提取码: 495t

连接设置:

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

连接后效果

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

二、redis主从复制及持久化

1.从服务器设置

redis主从复制很简单,只需要在从服务器配置文件新增一条配置即可

[root@redis-slave redis]# sed -i '$a slaveof 172.27.9.30 6379' /etc/redis/6379.conf

2.主从测试

2.1主机上写入值

[root@redis-master ~]# redis-cli set test-key abc

查看从机redis键值:

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

2.2从机写入值

[root@redis-slave redis]# redis-cli set test-key 123

发现报错,处于slave状态redis无法写入。

3.持久化

redis持久化有RDB和AOF两种方式,默认持久化为RDB方式,关闭默认持久化只需要把默认配置注释就行:

#save 900 1

#save 300 10

#save 60 10000

三、keepalived安装配置

1.keepalived安装

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

2.keepalived配置

[root@redis-master ~]# more /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id master      #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

}

vrrp_script chk_redis {

script "/etc/keepalived/redis-check.sh"

interval 2    #健康检查周期

weight 30    #优先级变化幅度

fall 2        #尝试两次都成功才成功

rise 2        #尝试两次都失败才失败

}

vrrp_instance VI_1 {            #vrrp实例定义部分

state MASTER              #设置lvs的状态,MASTER和BACKUP两种,必须大写

interface ens33              #设置对外服务的接口

virtual_router_id 100        #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示

priority 100              #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup

advert_int 1              #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒

authentication {          #设置验证类型和密码

auth_type PASS        #主要有PASS和AH两种

auth_pass 1111        #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同

}

virtual_ipaddress {        #设置虚拟ip地址,可以设置多个,每行一个

172.27.9.100

}

track_script {              #执行脚本chk_redis

chk_redis

}

notify_master "/etc/keepalived/redis-master.sh" #指定当切换为master时,执行的脚本

}

相比master,slave配置有3点不同:

router_id slave

state BACKUP

priority 90

为了避免主从间的来回切换,也可以设置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 公社资源站下载:

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

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是 www.linuxidc.com

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

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

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

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

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-09/154219.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Rails

Head First Rails

David Griffiths / O'Reilly Media / 2008-12-30 / USD 49.99

Figure its about time that you hop on the Ruby on Rails bandwagon? You've heard that it'll increase your productivity exponentially, and allow you to created full fledged web applications with minimal......一起来看看 《Head First Rails》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试