阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

284次阅读
没有评论

共计 6267 个字符,预计需要花费 16 分钟才能阅读完成。

前言:

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 主从高可用实际操作

配置:

hostnameiposredis 版本 keepalived 版本 备注
redis-master172.27.9.30CentOS7.3.16114.0.101.3.5 关闭防火墙和 selinux
redis-slave172.27.9.31Centos7.3.16114.0.101.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
[root@redis-master redis]# chkconfig redis_6379 on

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
OK

查看从机 redis 键值:

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

2.2 从机写入值

[root@redis-slave redis]# redis-cli set test-key 123
(error) READONLY You can’t write against a read only slave.

发现报错,处于 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

—————————————— 分割线 ——————————————

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计6267字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中