设计思路:
redis 主和 redis从  正常同步;

redis主keepalived 启动,执行redis_master.sh脚本,vip在自己身上;

redis 从keepalived 启动,执行redis_slave.sh脚本;

redis主服务关闭,则redis主执行redis_fault.sh脚本, vip落在ipredis 从上,redis从执行redis_master.sh脚本,变成主;

redis主服务开启,则redis主执行redis_slave.sh脚本变成从,vip还在redis 从上,还是主;

redis从服务关闭,则redis从执行redis_fault.sh脚本, vip落在redis主上,redis主执行redis_master.sh脚本,变成主;

redis从服务开启,则redis从执行redis_slave.sh脚本变成从, vip还在redis主上,redis主继续做主,此时为redis初试主从状态;

环境:

192.168.1.39 redis

192.168.1.52 redis-slave

192.168.1.75 vip

一:安装keepalived

(redis和redis-slave两台服务器都安装)

yum -y install ipvsadm keepalived

二:安装redis

(redis和redis-slave两台服务器都安装)

tar -zxvf redis-2.4.17.tar.gz

cd redis-2.4.17

./configure

make

make install

redis-slve只需注意一点

[root@redis bin]# vim /etc/redis.conf

slaveof 192.168.1.39 6379

三:通过Keepalived实现Redis Failover自动故障切换

修改Master和Slave的/etc/hosts文件

[root@redis rc.d]# cat /etc/hosts

192.168.1.39   redis

192.168.1.52   redis-slave

Master上是

[root@redis rc.d]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=redis

Slave上是

[root@redis-slave linux]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=redis-slave

修改完主机名重启机器生效

默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建:

首先,在Master上创建如下配置文件:

[root@redis  linux]# vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

liyongshan213@sina.com

}

notification_email_from keepalived@redis

router_id redis

}

vrrp_script chk_redis {

script "/etc/keepalived/scripts/redis_check.sh"

interval 1

}

vrrp_instance mes_Redis {

state MASTER

interface eth0

garp_master_delay 10

smtp_alert

virtual_router_id 3

priority 100

nopreempt

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.75

}

track_script {

chk_redis

}

notify_master /etc/keepalived/scripts/redis_master.sh

notify_backup /etc/keepalived/scripts/redis_slave.sh

notify_fault  /etc/keepalived/scripts/redis_fault.sh

notify_stop   /etc/keepalived/scripts/redis_stop.sh

}

然后,在Slave上创建如下配置文件:

[root@redis-slave linux]# vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

liyongshan213@sina.com

}

notification_email_from keepalived@redis-slave

router_id redis-salve

}

vrrp_script chk_redis {

script "/etc/keepalived/scripts/redis_check.sh"

interval 1

}

vrrp_instance mes_Redis {

state BACKUP

interface eth0

garp_master_delay 10

smtp_alert

virtual_router_id 3

priority 90

nopreempt

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.237

}

track_script {

chk_redis

}

notify_master /etc/keepalived/scripts/redis_master.sh

notify_backup /etc/keepalived/scripts/redis_slave.sh

notify_fault  /etc/keepalived/scripts/redis_fault.sh

notify_stop   /etc/keepalived/scripts/redis_stop.sh

}

在Master和Slave上创建监控Redis的脚本

mkdir /etc/keepalived/scripts

vim /etc/keepalived/scripts/redis_check.sh

#!/bin/bash

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

if [ "$ALIVE" == "PONG" ]; then

echo $ALIVE

exit 0

else

echo $ALIVE

exit 1

fi

编写以下负责运作的关键脚本:

notify_master /etc/keepalived/scripts/redis_master.sh

notify_backup /etc/keepalived/scripts/redis_slave.sh

notify_fault /etc/keepalived/scripts/redis_fault.sh

notify_stop /etc/keepalived/scripts/redis_stop.sh

因为Keepalived在转换状态时会依照状态来呼叫:

当进入Master状态时会呼叫notify_master

当进入Backup状态时会呼叫notify_backup

当发现异常情况时进入Fault状态呼叫notify_fault

当Keepalived程序终止时则呼叫notify_stop

首先,在Redis Master上创建notity_master与notify_backup脚本:

vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash

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

LOGFILE="/var/log/keepalived-redis-state.log"

echo "[master]" >> $LOGFILE

date >> $LOGFILE

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

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

$REDISCLI SLAVEOF 192.168.1.236 6379 >> $LOGFILE  2>&1

sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态

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

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

vim /etc/keepalived/scripts/redis_slave.sh

#!/bin/bash

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

LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILE

date >> $LOGFILE

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

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色

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

$REDISCLI SLAVEOF 192.168.1.236 6379 >> $LOGFILE  2>&1

接着,在Redis Slave上创建notity_master与notify_backup脚本:

vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash

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

LOGFILE="/var/log/keepalived-redis-state.log"

echo "[master]" >> $LOGFILE

date >> $LOGFILE

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

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

$REDISCLI SLAVEOF 192.168.1.235 6379 >> $LOGFILE  2>&1

sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态

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

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

vim /etc/keepalived/scripts/redis_slave.sh

#!/bin/bash

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

LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILE

date >> $LOGFILE

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

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色

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

$REDISCLI SLAVEOF 192.168.1.235 6379 >> $LOGFILE  2>&1

然后在Master与Slave创建如下相同的脚本:

vim /etc/keepalived/scripts/redis_fault.sh

#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo "[fault]" >> $LOGFILE

date >> $LOGFILE

vim /etc/keepalived/scripts/redis_stop.sh

#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo "[stop]" >> $LOGFILE

date >> $LOGFILE

在Master与Slave给脚本都加上可执行权限:

chmod +x /etc/keepalived/scripts/*.sh

脚本创建完成以后,我们开始按照如下流程进行测试:

1.启动Master上的Redis

[root@redis ~]# /usr/local/bin/redis-server /etc/redis.conf

2.启动Slave上的Redis

[root@redis ~]# /usr/local/bin/redis-server /etc/redis.conf

3.启动Master上的Keepalived

/etc/init.d/keepalived start

4.启动Slave上的Keepalived

/etc/init.d/keepalived start

5.尝试通过VIP连接Redis:

[root@redis ~]# /usr/local/bin/redis-cli -h 192.168.1.75 info

role:master

slave0:192.168.1.52,6379,online

连接成功,Slave也连接上来了

6.尝试插入一些数据:

[root@redis ~]# /usr/local/bin/redis-cli -h 192.168.1.75 SET Hello Redis

从VIP读取数据

[root@redis ~]# /usr/local/bin/redis-cli -h 192.168.1.75 GET Hello

"Redis"

从Master读取数据

[root@redis ~]# /usr/local/bin/redis-cli -h 192.168.1.39 GET Hello

"Redis"

从Slave读取数据

[root@redis ~]# /usr/local/bin/redis-cli -h 192.168.1.52 GET Hello

"Redis"

下面,模拟故障产生:

将Master上的Redis进程杀死:

[root@redis ~]# /usr/local/bin/redis-cli shutdown

查看Master上的Keepalived日志

[root@redis scripts]# tail /var/log/keepalived-redis-state.log

[fault]

Thu Sep 27 08:29:01 CST 2012

同时Slave上的日志显示:

[root@redis-slave scripts]# tail /var/log/keepalived-redis-state.log

[master]

Thu Nov 15 12:06:04 CST 2012

Being master....

Run SLAVEOF cmd ...

OK

Run SLAVEOF NO ONE cmd ...

OK

然后我们可以发现,Slave已经接管服务,并且担任Master的角色了。

./redis-cli -h 192.168.1.75 info

./redis-cli -h 192.168.1.52 info

role:master

然后我们恢复Master的Redis进程

主变成slave

然后把52redis停掉

39恢复主的角色,在把52redis开启

恢复39是主,52是备

自动切换成功!

转载于:https://blog.51cto.com/8474832/1604527

Redis+keepalived 主从搭建相关推荐

  1. 一步一步搭建Redis + Keepalived主从高可用之Keepalived安装配置(三)

    开心一笑 [我:"屎克郎,你不是移‍民了吗?怎么又回来了?" 屎克郎:"再不回来,就饿死了!" 我:"怎么会这样子!" 屎克郎:" ...

  2. Redis的主从搭建

    Redis在作为可内存持久化的Key-Value数据库是使用的过程中是可以做主从服务的.在Redis的大规模集群中Redis的主从服务就是集群实现的基础,在Redis的主从服务中有以下几个优点: 1. ...

  3. mysql 主从 keepalived_一次mysql主从加keepalived配置搭建及切换演示

    [需求] 根据需求需要搭建mysql主从架构数据库及加keepalived进行自动切换VIP(没有使用脚本进行检查对端数据库及互换主从) [环境介绍] 系统环境:CentOS release 6.4 ...

  4. redis 启动无输出_深入剖析Redis系列: Redis入门简介与主从搭建

    前言 Redis 是一种基于 键值对 的 NoSQL 数据库.与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串).hash(哈希).list(列表).set ...

  5. 2.Redis数据库(搭建redis主从的必要性)以及主从搭建(Windows为例)

    主从概念 一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率 ...

  6. Redis多实例及主从搭建

    主从搭建前提是服务器上已经安装好了redis, redis安装可搜索本站另一篇博客:redis安装. redis单主机多实例 一.我们首先拷贝两份文件: cp /etc/redis.conf /etc ...

  7. redis主从搭建和分片集群搭建

    文章目录 redis主从搭建 搭建一主一从: 下载安装redis:两台机器都需要操作 权限认证 理解主从复制原理.同步数据集 全量同步三个阶段: 增量同步: 心跳检测 redis哨兵模式 部署方案 搭 ...

  8. Redis主从搭建(哨兵模式),springboot整合redis主从

    相关文章: redis主从复制(读写分离) redis哨兵模式 Redis配置详解 一.Redis主从搭建 本文讲解用的是Redis5.0.10搭建一主二从 Redis官方下载连接:http://do ...

  9. Redis集群生产环境搭建,主从搭建,动态增删步骤

    文章目录 1.解压安装初始化 2.修改所有单台redis的配置文件redis.conf 2.启动全部6台redis单机 3.组成集群 4.增加主节点7006 5.新增从节点->7007作为主机7 ...

最新文章

  1. Python写入到csv文件存在空行的解决方法
  2. JVM垃圾回收的时候如何确定垃圾?什么是GC Roots?
  3. mixly编程怎样音乐_华人留学生开发首个古汉语编程语言,实现易经算命、圆周率计算,Github获赞14.7k...
  4. 理解Go 1.5 vendor
  5. E2. Rubik‘s Cube Coloring (hard version) dp,满二叉树(2300)
  6. 计算机辅助设计A卷,《计算机辅助设计》考试试卷A.doc
  7. .NET调用控制台下生成的exe文件,传参及获取返回参数
  8. python封装sql脚本_pymysql的简单封装代码实例
  9. tick_init 函数
  10. USBCleaner v6.0 Build 20080327 - U盘病毒专杀工具
  11. 【Multisim】关于Multisim仿真“运放积分器”出现的问题以及解决方法
  12. python坐标转化极坐标_matplotlib极坐标方法详解
  13. ASP.NET2.0 ReportingServices,报表灵魂的收割者(一)
  14. 强化学习——策略学习
  15. 企业IP地址管理(IPAM)
  16. 从互联网+角度看云计算的现状与未来(2)
  17. 2019第三届“数维杯”大学生数学建模夏令营
  18. java翻译程序_有没有java代码翻译软件?
  19. 内存存放方式_如何以正确的方式存放剩余涂料
  20. c# Thumbnail 生成缩略图,生成压缩图,最大宽高比例缩放,最大边按比例缩放

热门文章

  1. DataTable、DataView、ListBox 数据绑定与查询
  2. Windows-Server下加强系统安全性系列之方案【九】
  3. 让PPT声音播放不再“哑口无言”
  4. Hibernate搭建成功!(源码)
  5. java 规则引擎_GitHub - javaso/rulegin: 分布式规则引擎系统,重构于开源IOT项目thingboard...
  6. Swift3.0语言教程使用URL字符串
  7. Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍
  8. string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...
  9. 电脑有回声_电脑麦克属性调整(用于回声消除)
  10. 特斯拉中国召回20万辆问题汽车:存在硬件风险,部分引擎盖可能意外打开