关于多实例redis主从+Keepalived故障切换的解决方法

一、redis三主三从部署图

公司最近要上线多实例redis主从,可用的redis服务机器一共有两台,其中前端1为redis主机,前端2为redis从机,而且主机上需启用三个主redis,备机上与之对应启动三个从redis,这就需要keepalived支撑三个主redis的故障切换和恢复,其中192.168.100.154为主redis,192.168.100.156为从redis,具体部署如下图:

二、keepalived主备机配置

因为只有两台机器,没有多余的,而这两台机器上将来有nginx的主备切换要上线,这就需要两台机器上既要能redis切换,又要nginx切换,其实配置起来很简单。

主机上keepalived配置:

!Configuration File for keepalived

global_defs{

notification_email {

[email protected]

[email protected]

[email protected]

}

[email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

vrrp_scriptcheck_run {

script"/usr/local/nginx/check_nginx.sh"

interval 2

}

vrrp_sync_groupVG1 {

group {

VI_1

}

}

vrrp_instanceVI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script{

check_run

}

virtual_ipaddress {

192.168.1.57/24

}

}

vrrp_sync_group VG2 {

group {

VI_2

}

}

vrrp_script check_run2{

script"/usr/redis/script/redis_check.sh"

interval 2

}

vrrp_instance VI_2 {

state MASTER

interfaceeth1

virtual_router_id 52

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script{

check_run2

}

virtual_ipaddress {

192.168.100.100/24

}

notify_master/usr/redis/script/redis_master.sh

notify_backup/usr/redis/script/redis_backup.sh

notify_fault/usr/redis/script/redis_fault.sh

notify_stop/usr/redis/script/redis_stop.sh

}

需要注意的是VI_2中的interface 和virtual_router_id不能和 VI_1一样的。否则会出现切换错误。还需要说明的是vrrp_script触发机制一定要放到最前面的,刚开始弄,不清楚,放到其他位置,VIP不能自动漂移。这里我们只配置check_run2,上面的留给nginx。

备机上keepalived配置

! Configuration Filefor keepalived

global_defs {

notification_email {

[email protected]

[email protected]

[email protected]

}

[email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

vrrp_sync_group VG1 {

group {

VI_1

}

notify_master"/usr/local/nginx/nginx.sh master"

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 80

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.57/24

}

}

vrrp_scriptcheck_run2 {

script"/usr/redis/script/redis_check.sh"

interval 2

}

vrrp_instanceVI_2 {

state BACKUP

interface eth1

virtual_router_id 52

priority 80

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script{

check_run2

}

virtual_ipaddress {

192.168.100.100/24

}

notify_master/usr/redis/script/redis_master.sh

notify_backup/usr/redis/script/redis_backup.sh

notify_fault/usr/redis/script/redis_fault.sh

notify_stop/usr/redis/script/redis_stop.sh

}

2.1、redis主机配置

这里的脚本是拷贝几个专业人士的脚本,只根据实际需求做了部分修改。

1>、vim /usr/redis/script/redis_check.sh

#!/bin/bash

ALIVE=`/usr/local/redis/bin/redis-cli -p6379 PING`

ALIVE1=`/usr/local/redis/bin/redis-cli -p6380 PING`

ALIVE2=`/usr/local/redis/bin/redis-cli -p6381 PING`

if [ "$ALIVE" == "PONG"]&&[ "$ALIVE1" == "PONG" ]&&["$ALIVE2" == "PONG" ]; then

echo "$ALIVE,$ALIVE1,$ALIVE2"

exit 0

else

killall -9 redis-server

exit 1

fi

检测方法是三个主redis中,任何一个PING命令检测到的状态不是PONG的,即进入故障切换状态。

2>、vim /usr/redis/script/redis_master.sh

#!/bin/bash

#/usr/redis/script/redis_master.sh

REDISCLI="/usr/local/redis/bin/redis-cli"

LOGFILE="/usr/local/redis/logs/keepalived-redis-state-6379.log"

LOGFILE1="/usr/local/redis/logs/keepalived-redis-state-6380.log"

LOGFILE2="/usr/local/redis/logs/keepalived-redis-state-6381.log"

echo "[master]" >> $LOGFILE

echo "[master]" >>$LOGFILE1

echo "[master]" >>$LOGFILE2

date >> $LOGFILE

date >> $LOGFILE1

date >> $LOGFILE2

echo "Being master...." >>$LOGFILE 2>&1

echo "Being master...." >>$LOGFILE1 2>&1

echo "Being master...." >>$LOGFILE2 2>&1

echo "Run SLAVEOF cmd ...">> $LOGFILE

echo "Run SLAVEOF cmd ...">> $LOGFILE1

echo "Run SLAVEOF cmd ...">> $LOGFILE2

$REDISCLI -p 6379 SLAVEOF 192.168.100.156 6379 >> $LOGFILE 2>&1

$REDISCLI -p 6380 SLAVEOF 192.168.100.156 6380 >> $LOGFILE1 2>&1

$REDISCLI -p 6381 SLAVEOF 192.168.100.156 6381 >> $LOGFILE2 2>&1

sleep 10

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE1

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE2

$REDISCLI -p 6379 SLAVEOF NO ONE >> $LOGFILE 2>&1

$REDISCLI -p 6380 SLAVEOF NO ONE >> $LOGFILE1 2>&1

$REDISCLI -p 6381 SLAVEOF NO ONE >> $LOGFILE2 2>&1

请注意标红的地方,redis-cli后面一定要加对应的端口号,不然主备切换过程中,会产生端口错乱现象。

3>、vim /usr/redis/script/redis_backup.sh

#!/bin/bash

REDISCLI="/usr/local/redis/bin/redis-cli"

LOGFILE="/usr/local/redis/logs/keepalived-redis-state-6379.log"

LOGFILE1="/usr/local/redis/logs/keepalived-redis-state-6380.log"

LOGFILE2="/usr/local/redis/logs/keepalived-redis-state-6381.log"

echo "[backup]" >> $LOGFILE

echo "[backup]" >>$LOGFILE1

echo "[backup]" >>$LOGFILE2

date >> $LOGFILE

date >> $LOGFILE1

date >> $LOGFILE2

echo "Being slave...." >>$LOGFILE 2>&1

echo "Being slave...." >>$LOGFILE1 2>&1

echo "Being slave...." >>$LOGFILE2 2>&1

sleep 15

echo "Run SLAVEOF cmd ...">> $LOGFILE

echo "Run SLAVEOF cmd ...">> $LOGFILE1

echo "Run SLAVEOF cmd ...">> $LOGFILE2

$REDISCLI -p 6379 SLAVEOF 192.168.100.156 6379 >> $LOGFILE  2>&1

$REDISCLI -p 6380 SLAVEOF 192.168.100.156 6380 >> $LOGFILE1  2>&1

$REDISCLI -p 6381 SLAVEOF 192.168.100.156 6381 >> $LOGFILE2  2>&1

标红的地方同样需要注意SLAVEOF 后面IP为从机的。

4>、vim /usr/redis/script/redis_backup.sh

#!/bin/bash

LOGFILE="/usr/local/redis/logs/keepalived-redis-state-6379.log"

LOGFILE1="/usr/local/redis/logs/keepalived-redis-state-6380.log"

LOGFILE2="/usr/local/redis/logs/keepalived-redis-state-6381.log"

echo "[fault]" >> $LOGFILE

echo "[fault]" >> $LOGFILE1

echo "[fault]" >> $LOGFILE2

date >> $LOGFILE

date >> $LOGFILE1

date >> $LOGFILE2

5>、vim /usr/redis/script/redis_stop.sh

#!/bin/bash

LOGFILE="/usr/local/redis/logs/keepalived-redis-state-6379.log"

LOGFILE="/usr/local/redis/logs/keepalived-redis-state-6380.log"

LOGFILE="/usr/local/redis/logs/keepalived-redis-state-6381.log"

echo "[stop]" >> $LOGFILE

echo "[stop]" >> $LOGFILE1

echo "[stop]" >> $LOGFILE2

date >> $LOGFILE

date >> $LOGFILE1

date >> $LOGFILE2

2.2、redis从机配置

1、/usr/redis/script/redis_check.sh

#!/bin/bash

ALIVE=`/usr/local/redis/bin/redis-cli -p 6379 PING`

ALIVE1=`/usr/local/redis/bin/redis-cli -p 6380 PING`

ALIVE2=`/usr/local/redis/bin/redis-cli -p 6381 PING`

if [ "$ALIVE" == "PONG" ]&&[ "$ALIVE1" == "PONG" ]&&[ "$ALIVE2" == "PONG" ]; then

echo  "$ALIVE,$ALIVE1,$ALIVE2"

exit 0

else

echo "$ALIVE,$ALIVE1,$ALIVE2"

exit 1

fi

剩下的redis_backup.sh, redis_fault.sh  redis_master.sh  redis_stop.sh和上面的一样,只需要改对应iP为192.168.1.154即可。

2.3、故障模拟

启动192.168.100.3,192.168.100.2上的keepalived和redis

启动keepalived:service keepalivedstart

启动redis: redis-server/usr/local/redis/conf/redis.conf

1、  查看主redis的IP状态,可以看到获取到了VIP。

查看redis信息,看到三个主redis状态,与之对应的slave状态是online的。

2、查看从redis的IP状态,看到三个从redis状态是up的。

3、故障模拟

我们分别启动主redis和从redis上的三个redis服务。

redis-cli /usr/local/redis/conf/redis_6379.conf

redis-cli /usr/local/redis/conf/redis_6380.conf

redis-cli /usr/local/redis/conf/redis_6381.conf

这种启动方法有个缺陷,就是在故障恢复后,启动三个redis时,经常不能启动redis,因为我在check_redis.sh脚本已经设置了启动机制,把3个redis做成启动脚本启动,效果并不理想,需要把keepalived里的 interval 2检测值设置的大点,或许效果好点。这个问题希望大神多多指点啊!

时间: 2024-08-29 13:22:55

关于多实例redis主从+Keepalived故障切换的解决方法的相关文章

Redis高可用方案(redis主从+keepalived+sentinel)

架构:redis主从+keepalived+sentinel 三台机器,两台redis主从,一台配合选举sentinel leader机器. Master:  192.168.100.135    controller         部署redis+keepalived+sentinel Slave:  192.168.100.136     web-nb-136     部署redis+keepalived+sentinel 配合sentinel:  192.168.100.128    

利用redis主从+keepalived实现高可用

Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主持. redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set –有序集合)和hash(哈希类型).这些数据类型都支持push/pop.ad

在windows上部署使用redis出现的问题及解决方法

原文链接:https://www.cnblogs.com/herry52/p/5938902.html 下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.目前的是2.8.12版的,直接解压,在\bin\release 目录下有个压缩包,这就是我们需要的: 启动Redis 直接在上图的目录打开命令窗口,运行: [在当前目录下打开cmd窗口的方法:先 按住 shift 键,然后再在目标目录中 右键 ,在右键菜单中 点击 在此处打开命

mysql数据库主从不同步的解决方法

故障描述: 进入从数据库 mysql> show slave status\G; 结果如下: ... Slave_IO_Running: Yes Slave_SQL_Running: No Last_Errno: 1062 ... 原因: 程序可能在slave上进行了写操作 可能是slave机器重启后,事物回滚造成的 多数是第二种造成的 解决方法一:忽略错误后继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 mysql> slave stop;m

MySQL主从不一致情形与解决方法

一.MySQL主从不同步情况 1.1 网络的延迟 由于mysql主从复制是基于binlog的一种异步复制 通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计. 1.2 主从两台机器的负载不一致 由于mysql主从复制是主数据库上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况.

redis线上问题及解决方法

Redis内存配置大小要求 配置redis时,内存不宜超过机器总内存的50%,否则写RDB文件时会导致机器总内存不足,从而进行IO等待,使redis访问速度骤降 maxmemory 12gb 设置redis总内存为机器总内存的50%,且当redis进程占用内存超过机器内存的40%时进行报警,此时需要迁移数据 Redis数据较大时,主从同步失败 当redis数据较大时,RDB文件有好几个G,第一次主从同步时会传输整个RDB文件并加载到内存中,数据较大时会导致slave还没同步完,已经超时.此时主从

redis连接过多的一个解决方法

报错 Cannot assign requested address写了个程序,对redis连续进行100000访问,却出现以了Cannot assign requested address的问题,我起先是以为是redis的问题(可能承受不了这么多访问量),可是redis被大家吹的那么NB,不会出现这么SB的问题吧,于是google之,发现原来是:客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即"Can

Redis (error) NOAUTH Authentication required.解决方法

出现认证问题,应该是设置了认证密码,输入密码既可以啦 注意密码是字符串形式! [plain] view plain copy 127.0.0.1:6379> auth "yourpassword" 例如密码是'root',当出现认证问题时候,输入"auth 'root'"即可 [plain] view plain copy 127.0.0.1:6379> set name "hello" (error) NOAUTH Authenti

Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享

Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享 2014-09-09 14:14:25 标签:会话共享 主从 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lovelace.blog.51cto.com/1028430/1550198 ### keepalived配置 ### nginx安装培训 - 安装nginx 1 2 3 ``` cpp yum install nginx -y `