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 {

     [email protected]

   }

   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 {

     [email protected]

   }

   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是備

自動切換成功!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章