Redis+keepalived 主从搭建
设计思路:
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 主从搭建相关推荐
- 一步一步搭建Redis + Keepalived主从高可用之Keepalived安装配置(三)
开心一笑 [我:"屎克郎,你不是移民了吗?怎么又回来了?" 屎克郎:"再不回来,就饿死了!" 我:"怎么会这样子!" 屎克郎:" ...
- Redis的主从搭建
Redis在作为可内存持久化的Key-Value数据库是使用的过程中是可以做主从服务的.在Redis的大规模集群中Redis的主从服务就是集群实现的基础,在Redis的主从服务中有以下几个优点: 1. ...
- mysql 主从 keepalived_一次mysql主从加keepalived配置搭建及切换演示
[需求] 根据需求需要搭建mysql主从架构数据库及加keepalived进行自动切换VIP(没有使用脚本进行检查对端数据库及互换主从) [环境介绍] 系统环境:CentOS release 6.4 ...
- redis 启动无输出_深入剖析Redis系列: Redis入门简介与主从搭建
前言 Redis 是一种基于 键值对 的 NoSQL 数据库.与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串).hash(哈希).list(列表).set ...
- 2.Redis数据库(搭建redis主从的必要性)以及主从搭建(Windows为例)
主从概念 一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率 ...
- Redis多实例及主从搭建
主从搭建前提是服务器上已经安装好了redis, redis安装可搜索本站另一篇博客:redis安装. redis单主机多实例 一.我们首先拷贝两份文件: cp /etc/redis.conf /etc ...
- redis主从搭建和分片集群搭建
文章目录 redis主从搭建 搭建一主一从: 下载安装redis:两台机器都需要操作 权限认证 理解主从复制原理.同步数据集 全量同步三个阶段: 增量同步: 心跳检测 redis哨兵模式 部署方案 搭 ...
- Redis主从搭建(哨兵模式),springboot整合redis主从
相关文章: redis主从复制(读写分离) redis哨兵模式 Redis配置详解 一.Redis主从搭建 本文讲解用的是Redis5.0.10搭建一主二从 Redis官方下载连接:http://do ...
- Redis集群生产环境搭建,主从搭建,动态增删步骤
文章目录 1.解压安装初始化 2.修改所有单台redis的配置文件redis.conf 2.启动全部6台redis单机 3.组成集群 4.增加主节点7006 5.新增从节点->7007作为主机7 ...
最新文章
- Python写入到csv文件存在空行的解决方法
- JVM垃圾回收的时候如何确定垃圾?什么是GC Roots?
- mixly编程怎样音乐_华人留学生开发首个古汉语编程语言,实现易经算命、圆周率计算,Github获赞14.7k...
- 理解Go 1.5 vendor
- E2. Rubik‘s Cube Coloring (hard version) dp,满二叉树(2300)
- 计算机辅助设计A卷,《计算机辅助设计》考试试卷A.doc
- .NET调用控制台下生成的exe文件,传参及获取返回参数
- python封装sql脚本_pymysql的简单封装代码实例
- tick_init 函数
- USBCleaner v6.0 Build 20080327 - U盘病毒专杀工具
- 【Multisim】关于Multisim仿真“运放积分器”出现的问题以及解决方法
- python坐标转化极坐标_matplotlib极坐标方法详解
- ASP.NET2.0 ReportingServices,报表灵魂的收割者(一)
- 强化学习——策略学习
- 企业IP地址管理(IPAM)
- 从互联网+角度看云计算的现状与未来(2)
- 2019第三届“数维杯”大学生数学建模夏令营
- java翻译程序_有没有java代码翻译软件?
- 内存存放方式_如何以正确的方式存放剩余涂料
- c# Thumbnail 生成缩略图,生成压缩图,最大宽高比例缩放,最大边按比例缩放
热门文章
- DataTable、DataView、ListBox 数据绑定与查询
- Windows-Server下加强系统安全性系列之方案【九】
- 让PPT声音播放不再“哑口无言”
- Hibernate搭建成功!(源码)
- java 规则引擎_GitHub - javaso/rulegin: 分布式规则引擎系统,重构于开源IOT项目thingboard...
- Swift3.0语言教程使用URL字符串
- Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍
- string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...
- 电脑有回声_电脑麦克属性调整(用于回声消除)
- 特斯拉中国召回20万辆问题汽车:存在硬件风险,部分引擎盖可能意外打开