环境:CentOs6.8

Master:172.20.52.72

Slave:172.20.52.159

Virtual IP address(VIP):172.20.52.253

应用软件:

    1、keepalived-1.2.12.tar.gz

     下载地址

    2、redis-2.8.7.tar.gz

     下载地址http://www.oschina.net/news/49449/redis-2-8-7

一、安装配置前准备

    yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel

    

            Redis属于内存数据库,所以调优都集中到了内存上,需要将 vm.overcommit 设置为1 

            echo "vm.overcommit_memory=1" >> /etc/sysctl
            sysctl -p

            1.在主服务器172.20.52.160上面做下面操作

                echo " 172.20.52.72  node1" >> /etc/hosts
                echo " 172.20.52.159 node2" >> /etc/hosts
            2.在从服务器10.10.10.204上面做下面操作
                echo " 172.20.52.72 node1" >> /etc/hosts
                echo " 172.20.52.159 node2" >> /etc/hosts

二、在Master和slave上安装Redis

    tar -zxvf redis-2.8.7.tar.gz

    cd redis-2.8.7

    make && make install

    cd src

    mkdir -p /usr/local/redis/bin    

    cp redis-server redis-cli redis-benchmark redis-check-aof redis-check-dump /usr/local/redis/bin

    mkdir -p /usr/local/redis/etc

    复制源码中的redis.conf至/usr/local/redis/etc/     cp redis.conf /usr/local/redis/etc/

    修改 /usr/local/redis/etc/redis.conf里面可以把 daemonize no 修改为daemonize yes

    制作一个redis  init.d 的启动脚本:

    复制如下代码:

#!/usr/bin/env bash## redis start up the redis server daemon## chkconfig: 345 99 99# description: redis service in /etc/init.d/redis \#             chkconfig --add redis or chkconfig --list redis \#             service redis start  or  service redis stop# processname: redis-server# config: /etc/redis.conf PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379EXEC=/usr/local/bin/redis-serverREDIS_CLI=/usr/local/bin/redis-cli PIDFILE=/var/run/redis.pidCONF="/etc/redis.conf"#make sure some dir existif [ ! -d /var/lib/redis ] ;then    mkdir -p /var/lib/redis    mkdir -p /var/log/redisfi case "$1" in    status)        ps -A|grep redis        ;;    start)        if [ -f $PIDFILE ]        then                echo "$PIDFILE exists, process is already running or crashed"        else                echo "Starting Redis server..."                $EXEC $CONF        fi        if [ "$?"="0" ]        then              echo "Redis is running..."        fi        ;;    stop)        if [ ! -f $PIDFILE ]        then                echo "$PIDFILE does not exist, process is not running"        else                PID=$(cat $PIDFILE)                echo "Stopping ..."                $REDIS_CLI -p $REDISPORT SHUTDOWN                while [ -x ${PIDFILE} ]               do                    echo "Waiting for Redis to shutdown ..."                    sleep 1                done                echo "Redis stopped"        fi        ;;   restart|force-reload)        ${0} stop        ${0} start        ;;  *)    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2        exit 1esac

    vim /etc/init.d/redis-server
    chmod o+x /etc/init.d/redis-server
    chkconfig --add redis-server
    /etc/init.d/redis-server start

从服务上redis的配置

    修改 /etc/redis.conf

    slaveof <masterip> <masterport>修改为

  slaveof 172.20.52.72 6379

  然后开启从服务器的redis服务。

  start redis-server start

    

三、进行主从测试

   主服务器:redis-cli -p 6379 set hello world

    从服务器:

   redis-cli -p 6379 get hello

    "world"

   #主服务器

redis-cli -p 6379 set hello world2

#从服务器

redis-cli -p 6379 get hello

"world2"

redis-cli -p 6379 set hello world

(error) READONLY You can't write against a read only slave.

成功配置主从redis服务器,由于配置中有一条从服务器是只读的,所以从服务器没法设置数据,只可以读取数据。

四、安装配置keepalived 

1.在Master和Slave上安装Keepalived

$ yum install keepalived -y

2.默认安装完成keepalived之后是有配置文件的,但是我们需要创建合适的配置文件

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

$  vim /etc/keepalived/keepalived.conf

vrrp_script chk_redis {    script "/etc/keepalived/scripts/redis_check.sh"     ###监控脚本       interval 2                                          ###监控时间    } vrrp_instance VI_1 {    state MASTER                 ###设置为MASTER      interface eth1                ###监控网卡         virtual_router_id 51    priority 100            ###权重值      authentication {        auth_type PASS        ###加密          auth_pass 1111        ###密码    } track_script {    chk_redis             ###执行上面定义的chk_redis      }     virtual_ipaddress {        172.20.52.253        ######VIP     }          notify_master /etc/keepalived/scripts/redis_master.sh         notify_backup /etc/keepalived/scripts/redis_backup.sh         notify_fault  /etc/keepalived/scripts/redis_fault.sh         notify_stop   /etc/keepalived/scripts/redis_stop.sh}

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

vim /etc/keepalived/keepalived.conf

vrrp_script chk_redis {    script "/etc/keepalived/scripts/redis_check.sh"     ###监控脚本      interval 2                   ###监控时间    } vrrp_instance VI_1 {    state BACKUP         ###设置为BACKUP       interface eth1       ###监控网卡    virtual_router_id 51    priority 10          ###比MASTRE权重值低       authentication {        auth_type PASS        auth_pass 1111        ###密码与MASTRE相同      } track_script {    chk_redis        ###执行上面定义的chk_redis      }     virtual_ipaddress {        192.168.1.253   ####vip    }          notify_master /etc/keepalived/scripts/redis_master.sh         notify_backup /etc/keepalived/scripts/redis_backup.sh         notify_fault  /etc/keepalived/scripts/redis_fault.sh         notify_stop   /etc/keepalived/scripts/redis_stop.sh }

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

mkdir /etc/keepalived/scripts#!/bin/bash  ALIVE=`/usr/local/bin/redis-cli PING`  if [ "$ALIVE" == "PONG" ]; then echo $ALIVE  exit 0  else echo $ALIVE  exit 1  fi

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

notify_master /etc/keepalived/scripts/redis_master.sh

notify_backup /etc/keepalived/scripts/redis_backup.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

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

$  vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bashREDISCLI="/usr/local/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1 echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 172.20.52.159 6379 >> $LOGFILE  2>&1sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态   echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

 vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash  REDISCLI="/usr/local/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log" echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1 sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色  echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 172.20.52.159 6379 >> $LOGFILE  2>&1

2)在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]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1 echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 172.20.52.72   6379 >> $LOGFILE  2>&1sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态   echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

 vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash  REDISCLI="/usr/local/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log" echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1 sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色  echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 172.20.52.72  6379 >> $LOGFILE  2>&1

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

vim /etc/keepalived/scripts/redis_fault.sh

#!/bin/bash  LOGFILE=/var/log/keepalived-redis-state.logecho "[fault]" >> $LOGFILEdate >> $LOGFILE

vim /etc/keepalived/scripts/redis_stop.sh

#!/bin/bash  LOGFILE=/var/log/keepalived-redis-state.logecho "[stop]" >> $LOGFILEdate >> $LOGFILE

6.在主从服务器上面给脚本都加上可执行权限:

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

7.

.进行相关功能测试

启动Master和slave上的Redis

$  /etc/init.d/redis start

启动Master和slave上的Keepalived

$  /etc/init.d/keepalived start

尝试通过VIP连接Redis:

$ redis-cli -h 172.20.52.253 INFO

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

role:master

slave0:172.20.52.159,6379,online

尝试插入一些数据:

$ redis-cli -h 172。20.52.253 SET Hello Redis

OK

从VIP读取数据

$ redis-cli -h 172.20.52.253 GET Hello

"Redis"

从Master读取数据

$ redis-cli -h 172.20.52.72 GET Hello

"Redis"

从Slave读取数据

$ redis-cli -h 172.20.52.159 GET Hello

"Redis"

8.通过模拟相关故障,进行功能测试

将Master上的Redis进程杀死:

$  killall -9 redis-server

查看Master上的Keepalived日志

$ tail -f /var/log/keepalived-redis-state.log

[fault]

Thu Sep 27 08:29:01 CST 2016

同时Slave上的日志显示:

$ tail -f /var/log/keepalived-redis-state.log

[master]

2016年 07月 07日 星期一 16:42:52 CST

Being master....

Run SLAVEOF cmd ...

OK Already connected to specified master

Run SLAVEOF NO ONE cmd ...

OK

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

$ redis-cli -h 172.20.52.253 INFO

$ redis-cli -h 172.20.52.159 INFO

role:master

然后我们恢复Master的Redis进程

$  /etc/init.d/redis start

查看Master上的Keepalived日志

$ tail -f /var/log/keepalived-redis-state.log

[master]

2016年 07月 07日 星期一 16:48:08 CST

Being master....

Run SLAVEOF cmd ...

OK

Run SLAVEOF NO ONE cmd ...

OK

同时Slave上的日志显示:

$ tail -f /var/log/keepalived-redis-state.log

[backup]

Fri Sep 28 14:16:37 CST 2016

Being slave....

Run SLAVEOF cmd ...

OK

发现目前的Master已经再次恢复了Master的角色,故障切换以及自动恢复都成功了。

1.问题:刚使用redis-cli -h 172.20.52.253 INFO

说连接失败,没有路由。

此时我的解决办法是iptables -F

2.VIP的添加

ifconfig eth1:0 172.20.52.253 netmask 172.20.52.253 up