keepalived实现redis双机高可用

  现在的生产环境基本上都采用主备方式,而如何实现redis的主备呢?一般情况下,redis实现主从复制比较简单,只需要在从服务器的配置文件里配置 "slaveof"即可。但这样存在一个问题:主服务器挂掉时,可临时将业务地址转移到从服务器,但从服务器无法进行写操作。

  为解决这个问题,在网上查找了一些资料。主要有以下几种方案

  1、使用keepalived+监控脚本实现主备切换

  2、使用redis cluster实现双主切换,原理就是模仿MySQL的bin-log机制。

  本文介绍一下第1种方案

  设计思路:

  当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;

  当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从复制功能;

  当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。

  然后依此循环。

  环境介绍:

  Master:  192.168.2.23

  Slave:   192.168.2.24

  VIP:    192.168.2.40

  操作系统:

  CentOS 6.5 64bit

  软件版本:

  redis 3.2.0

  keepalived 1.2.13  

  实施步骤:

  一、搭建redis主从

  1、用saltstack部署redis到主从节点(略)

  2、修改redis从节点的配置文件:

  增加以下一行:

  slaveof  192.168.2.40 6379

  二、配置keepalived

  1、Master和Slave两台主机上分别安装keepalived服务

  yum -y install keepalived

  2、修改keepalived配置文件

  Master:

  cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
vrrp_script chk_redis {
     script "/etc/keepalived/scripts/check_redis.sh"
     interval 5
     weight 20
     }
vrrp_instance VI_REDIS_1 {
    #state BACKUP
    state MASTER
    interface eno16780032
    virtual_router_id 30
    mcast_src_ip 192.168.2.23
    priority 100
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 11111
      }
 
track_script {
        chk_redis
     }
    notify_master /etc/keepalived/scripts/master.sh
    notify_backup /etc/keepalived/scripts/backup.sh
    notify_stop /etc/keepalived/scripts/stop.sh
    notify_fault /etc/keepalived/scripts/fault.sh
    virtual_ipaddress {
       192.168.2.40
    }
}

  Slave:

  cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
 
vrrp_script chk_redis {
     script "/etc/keepalived/scripts/check_redis.sh"
     interval 5 
     weight 20 
     } 
 
vrrp_instance VI_REDIS_1 {
    #state BACKUP 
    state MASTER
    interface eno16780032
    virtual_router_id 30 
    mcast_src_ip 192.168.2.24
    priority 100 
    advert_int 1 
    authentication {
       auth_type PASS
       auth_pass 11111
      } 
  
track_script { 
        chk_redis 
     } 
 
    notify_master /etc/keepalived/scripts/master.sh
    notify_backup /etc/keepalived/scripts/backup.sh
    notify_stop /etc/keepalived/scripts/stop.sh
    notify_fault /etc/keepalived/scripts/fault.sh
 
    virtual_ipaddress {
       192.168.2.40
    }
}

  3、编写脚本

  首先在两台服务器分别创建监控redis的脚本

  cat /etc/keepalived/scripts/check_redis.sh

#!/bin/bash
count=1
LOGFILE="/var/log/keepalived-redis-state.log"
while true
do
/usr/local/redis/bin/redis-cli -p 6379 -a abcd*123456 ping >/dev/null 2>&1
i=$?
netstat -ntlup | grep 6379 >/dev/null 2>&1
j=$?
if [ $i = 0 -a $j = 0 ];then
        exit 0
else
        if [ $count -gt 10 ]; then
                echo "`hostname` redis check is failed,Exit check script....." >>$LOGFILE
                break
        fi
        sleep 1
        let count++
        continue
fi
done
/etc/init.d/keepalived stop

  然后是以下这些脚本的用途

  notify_master /etc/keepalived/scripts/master.sh

  notify_backup /etc/keepalived/scripts/backup.sh

  notify_stop /etc/keepalived/scripts/stop.sh

  notify_fault /etc/keepalived/scripts/fault.sh

  当keepalived进入Master状态时,会执行notify_master;

  当keepalived进入Backup状态时,会执行notify_backup;

  当keepalived进入fault状态时,会执行notify_fault ;

  当keepalived进入stop状态时,会执行notify_stop;

  在Master、Slave服务器上编写以下4个脚本

  cat /etc/keepalived/scripts/master.sh

#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
echo "`date +%Y-%m-%d‘ ‘%H:%M:%S`" >> $LOGFILE
echo " change to master role ..." >> $LOGFILE
nohup /bin/bash /usr/local/shell/change_master.sh  &
while true
do
        /bin/bash /usr/local/shell/role_check.sh |grep slave   >> $LOGFILE
        if [ $? -eq 0 ];then
                nohup /bin/bash /usr/local/shell/change_master.sh  &
        else
                exit 0
        fi
        sleep 5    
                                                    
done

  cat /etc/keepalived/scripts/backup.sh

#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
echo "`date +%Y-%m-%d‘ ‘%H:%M:%S`" >> $LOGFILE
echo " change to slave role ..." >> $LOGFILE
sleep 20
nohup /bin/bash /usr/local/shell/change_slave.sh  &
while true
do
/bin/bash /usr/local/shell/role_check.sh |grep master   >> $LOGFILE
if [ $? -eq 0 ];then
nohup /bin/bash /usr/local/shell/change_slave.sh  &
else
exit 0
fi
sleep 5    
                                                    
done

  cat /etc/keepalived/scripts/stop.sh

#!/bin/bash
log=‘/var/log/keepalived-redis-state.log‘
Host=`hostname`
echo "`date +%Y-%m-%d‘ ‘%H:%M:%S` :`hostname` keepalived service stop ... " >> $log

  cat /etc/keepalived/scripts/fault.sh

#!/bin/bash
log=‘/var/log/keepalived-redis-state.log‘
echo "`date +%Y-%m-%d‘ ‘%H:%M:%S` : fault ..." >> $log

  在Master、Slave服务器上编写以下4个故障切换脚本

  cat /usr/local/shell/change_master.sh

#!/bin/bash
PWD=abcd*123456
MASTER_IP=192.168.2.40
port=(6379)
for PORT in ${port[*]}
do
/usr/local/redis/bin/redis-cli -p $PORT -a $PWD SLAVEOF NO ONE
done

  cat /usr/local/shell/change_slave.sh

#!/bin/bash
PWD=abcd*123456
MASTER_IP=192.168.2.40
port=(6379)
for PORT in ${port[*]}
do
/usr/local/redis/bin/redis-cli -p $PORT -a $PWD SLAVEOF $MASTER_IP $PORT
done

  cat /usr/local/shell/startredis.sh

#!/bin/bash
port=(6379)
for PORT in ${port[*]}
do
/etc/init.d/redis_$PORT  start
done

  cat /usr/local/shell/stopredis.sh

#!/bin/bash
port=(6379)
for PORT in ${port[*]}
do
/etc/init.d/redis_$PORT  stop
done

  cat /usr/local/shell/restartredis.sh

#!/bin/bash
port=(6379)
for PORT in ${port[*]}
do
/etc/init.d/redis_$PORT  restart
done

  cat /usr/local/shell/role_check.sh

#!/bin/bash
PWD=abcd*123456
MASTER_IP=192.168.2.40
port=(6379)
for PORT in ${port[*]}
do
/usr/local/redis/bin/redis-cli -p $PORT -a $PWD info|egrep   "role|tcp_port"
done
时间: 2024-10-10 19:21:46

keepalived实现redis双机高可用的相关文章

基于keepalived对redis做高可用配置---转载

关于keepalived的详细介绍,请移步本人相关博客:http://wangfeng7399.blog.51cto.com/3518031/1405785 功能 ip地址 安装软件 主redis 10.13.6.13 redis,keepalived 从redis 10.13.6.16 redis,keepalived VIP 10.13.6.17   一.redis主从搭建 1.redis安装 本文通过yum源的安装方式来安装(需要配置epel源),也可以通过源码编译的方式来安装 1 2 [

使用keepalived 实现redis主从高可用

keepalived官方有中文文档:LVS + Keepalived Chinese application doc - March 16, 2010. keepalived 实现VRRP协议,从路由级别实现VIP切换,可以完全避免类似heartbeat 脑裂问题.可以很nice的实现主从.主备.互备方案,尤其是无状态业务,有状态业务就需要额外花些功夫了. 既然mysql 可以使用keepalived很好的做到主从切换,redis自然也就有样学样就成了. redis主从实现完全没有mysql成熟

使用keepalived打造redis双机热备

redis是非常实用的优秀nosql开源产品,在高并发的服务器环境中,可以作为缓存和队列使用.美中不足的是,到现在为止,redis并没有推出自己的集群方案,对一个完善的生产环境,负载均衡,高可用,主从备份都是必不可少的选项,redis提供了稳定·的主从备份功能,提供了数种持久化策略,在主从备份上也提供了增量备份的功能,现在通过sentinel提供主从热备的功能,可惜功能上并不完善,达不到生产环境的要求. 现在我们选定keepalived作为redis的高可用支持,keepalived不仅可以比较

Keepalived+Haproxy双主高可用负载均衡web和mysql综合实验

日期及版本:2014.5.4v1.0 架构图 实验目的: 1.Haproxy+Keepalived双主双机高可用模型,keepalived为Haproxy主从提供高可用保证haproxy-master若挂掉haproxy-backup能无缝接管,haproxy为后端Web提供负载均衡,缓解并发压力,实现WEB站点负载均衡+高可用性: 2. Haproxy反代web做动静分离: 3. Haproxy反代mysql 算法leastconn和roundrobin的不同效果: 系统环境: OS:cent

HAProxy双机高可用之HAProxy+Keepalived

Haproxy HAProxy 提供高可用性.负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机, 它是免费.快速并且可靠的一种解决方案.HAProxy 特别适用于那些负载特大的 web 站 点, 这些站点通常又需要会话保持或七层处理.HAProxy 运行在当前的硬件上,完全可 以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前 的架构中, 同时可以保护你的 web 服务器不被暴露到网络上. 实验环境:rhel6.5 selinux and iptable

Redis Sentinel高可用架构

Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis sentinel高可用架构. 它的主要功能有以下几点 不时地监控redis是否按照预期良好地运行; 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端); 能够进行自动切换.当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中

【转】双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计

架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP.正常情况时,外网VIP和内网VIP都绑定在server1服务器,web请求发送到server1的nginx,nginx对于静态资源请求就直接在本机检索并返回,对于php的动态请求,则负载均衡到server1和server2.对于SQ

双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计

前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构. 架构简介 此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP.正常情况时,外网VIP和内网VIP都绑定在server1服务器,web请求发送到server1的Nginx,nginx对于静态资源请求就直接在本机检索并返回,对于PHP的动态请求,则负载均衡到server1和server2.对于S

Keepalived配置实现HaProxy高可用

这次,小编就先写一篇对Keepalived的配置,那么在学习之前,我们首先要了解Keepalived是什么,以及为什么要用Keepalived. 实际上,Keepalived不仅仅是实现HaProxy的高可用,小编这里只是拿HaProxy来做一个示例而已,根据这个示例,进行稍微的改动基本就可以实现其他服务的高可用. 在此之前,小编就先来说说为什么要用Keepalived来实现负载均衡器高可用,小编这里只拿HaProxy负载均衡器来进行说明: 对于所有懂运维的小伙伴来说,都应该知道,无论后端的服务