Redis + keepalived 主從設置與搭建


Redis+keepalived安裝及配置:

1.ip規划:

服務器

Ip地址

VIP

應用軟件

Redis主

192.168.1.102

 192.168.1.120

Redis+

keepalived

Redis備

192.168.1.103

Redis+

keepalived

2.服務器基礎配置安裝

先安裝好基礎裝機環境,具體參考  服務器基礎環境配置 文檔

redis安裝:

1.#下載redies安裝包

wget http://download.redis.io/releases/redis-3.2.0.tar.gz  tar -xf redis-3.2.0.tar.gz

2.#編譯安裝  

cd redis-3.2.0

make

3.#添加相關文件及命令

mkdir /usr/local/redis/bin/ -p

cd src

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

cd ..

cp redis.conf /etc/

 

4.#添加啟動腳本

echo '#chkconfig: 2345 10 90

#description: Start and Stop redis

REDISPORT=6379

EXEC=/usr/local/redis/bin/redis-server

REDIS_CLI=/usr/local/redis/bin/redis-cli 

PIDFILE=/var/run/redis.pid

CONF="/etc/redis.conf"

case "$1" in

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 1

esac

' > /etc/init.d/redis

添加執行權限:

chmod +x /etc/init.d/redis

5.#設置開機自啟動

chkconfig --add redis

chkconfig redis on

6.#創建redis狀態日志

mkdir /var/log/redis/

touch /var/log/redis/redis.log

Keepalived安裝:

1.獲取安裝包

wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz

2.解壓安裝

tar -xf keepalived-1.2.20.tar.gz

cd keepalived-1.2.20

yum -y install openssl openssl-devel

./configure && make && make install

3.文件配置

mkdir /etc/keepalived

mkdir /usr/local/keepalived/scripts/ -p

cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

cp /usr/local/sbin/keepalived /usr/sbin

cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

4.添加開機自啟動

chmod +x /etc/init.d/keepalived

chkconfig --add keepalived

chkconfig keepalived on

以上操作主從都要執行

 

 

 

redis +keepalived配置:

1.配置redis master高可用配置文件:

vim  /etc/keepalived/keepalived

! Configuration File for keepalived

global_defs {

router_id redis103

}

vrrp_script chk_redis

{

script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" #監控腳本

interval 2                                   #監控時間

timeout 2                                   #超時時間

fall 3

}

vrrp_instance redis {

state BACKUP # master set to SLAVE also

interface eth0

lvs_sync_daemon_interface eth0

virtual_router_id 202

priority 150                                      #權重值

nopreempt # no seize,must add

advert_int 1

authentication { #all node must same

auth_type PASS                                 #加密

auth_pass 1111                                 #密碼

}

virtual_ipaddress {

192.168.1.120                                     #VIP

}

track_script {

chk_redis

}

notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.1.103 6379"

notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.1.103 6379"

notify_fault /usr/local/keepalived/scripts/redis_fault.sh

notify_stop /usr/local/keepalived/scripts/redis_stop.sh

}

 

2.配置slave高可用配置文件(可從線上拷貝再做修改)

[root@www scripts]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

    router_id redis104

}

vrrp_script chk_redis

{

     script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379"                                            #監控腳本

     interval 2                                     #監控時間

     timeout 2                                      #超時時間

     fall 3                                    #

}

vrrp_instance redis {

     state BACKUP                                      #設置為BACKUP

     interface eth0                                #監控網卡

     lvs_sync_daemon_interface eth0                      #

     virtual_router_id 202

     priority  100                                    #權重值

     nopreempt # no seize,must add

     advert_int 1

     authentication {   #all node must same

         auth_type PASS                               #加密

         auth_pass 1111                            #密碼與102的相同

     }

     virtual_ipaddress {

   192.168.1.120                                     #  VIP  

     }

     track_script {

         chk_redis

     }

     notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.1.102 6379"

     notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.1.102 6379"

     notify_fault /usr/local/keepalived/scripts/redis_fault.sh

     notify_stop /usr/local/keepalived/scripts/redis_stop.sh

}

 

3.masterslave上創建監控腳本:

1).配置master腳本文件(可從線上拷貝再做修改)

腳本目錄 /usr/local/keepalived/scripts

以下用於監控Redis的腳本

/usr/local/keepalived/scripts/redis_check.sh 

 

[root@www scripts]# cat redis_check.sh

#!/bin/bash

ALIVE=`/usr/local/redis/bin/redis-cli -h $1 -p $2 PING`

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

echo "[CHECK]" >> $LOGFILE

date >> $LOGFILE

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

   echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1

    exit 0

else

    echo "Failed:redis-cli -h $1 -p $2 PING $ALIVE " >> $LOGFILE 2>&1

    exit 1

fi

以下負責運作的關鍵腳本:
notify_master /usr/local/keepalived/scripts/redis_master.sh
notify_backup /usr/local/keepalived/scripts/redis_backup.sh
notify_fault /usr/local/keepalived/scripts/redis_fault.sh
notify_stop /usr/local/keepalived/scripts/redis_stop.sh

因為Keepalived在轉換狀態時會依照狀態來呼叫:
當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程序終止時則呼叫notify_stop

首先,在Redis Master上創建notity_master與notify_backup腳本:

[root@www scripts]# cat redis_master.sh

#!/bin/bash

REDISCLI="/usr/local/redis/bin/redis-cli -h $1 -p $3"

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 $2 $3 >> $LOGFILE  2>&1

#echo "SLAVEOF $2 cmd can't excute ... " >> $LOGFILE

sleep 10               #延遲10秒以后待數據同步完成后再取消同步狀態

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

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

 

[root@www scripts]# cat redis_backup.sh

#!/bin/bash

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

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

echo "[BACKUP]" >> $LOGFILE

date >> $LOGFILE

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

echo "Run SLAVEOF cmd ..." >> $LOGFILE 2>&1

$REDISCLI SLAVEOF $2 $3 >> $LOGFILE

sleep 100 #延遲100秒以后待數據同步完成后再取消同步狀態

exit(0)

 

接着,在Redis Slave上創建notity_master與notify_backup腳本(因為是雙主腳本和slave一致):

然后在Master與

[root@www scripts]# cat redis_fault.sh

#!/bin/bash

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

echo "[fault]" >> $LOGFILE

date >> $LOGFILE

[root@www scripts]# cat redis_stop.sh

#!/bin/bash

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

echo "[stop]" >> $LOGFILE

date >> $LOGFILE

給腳本都加上可執行權限:
$ sudo chmod +x /etc/keepalived/scripts/*.sh

 

2).Redis配置文件說明/etc/redis.conf:

參考文檔 redis配置文件參數詳解

 

3).設置環境變量:

echo “export PATH=$PATH:/usr/local/redis/bin” >> /root/.bash_profile

source /root/.bash_profile

4).重啟服務:

/etc/init.d/keepalived restart

/etc/init.d/redis restart

redis測試:

腳本創建完成以后,我們開始按照如下流程進行測試:
1.啟動Master上的Redis
$ /etc/init.d/redis start

2.啟動Slave上的Redis
$ /etc/init.d/redis start

3.啟動Master上的Keepalived
$ /etc/init.d/keepalived start

4.啟動Slave上的Keepalived
$ /etc/init.d/keepalived start

5.嘗試通過VIP連接Redis:
$ redis-cli -h 192.168.1.120 INFO
role:master
$ redis-cli -h 192.168.1.102 INFO

role:master

$ redis-cli -h 192.168.1.103 INFO

role:slave 

連接成功,Slave也連接上來了。

6.嘗試插入一些數據:
$ redis-cli -h 192.168.1.120 SET Hello Redis
OK

從VIP讀取數據
$ redis-cli -h 192.168.1.120 GET Hello
"Redis"

從Master讀取數據
$ redis-cli -h 192.168.1.102 GET Hello
"Redis"

從Slave讀取數據
$ redis-cli -h 192.168.1.103 GET Hello
"Redis"

下面,模擬故障產生:
將Master上的Redis進程殺死:
$ killall -9 redis-server

查看Master上的Keepalived日志
$ tailf /var/log/keepalived-redis-state.log

同時Slave上的日志顯示:
$ tailf /var/log/keepalived-redis-state.log

然后我們可以發現,Slave已經接管服務,並且擔任Master的角色了。
$ redis-cli -h 192.168.1.120 INFO
$ redis-cli -h 192.168.1.104 INFO
role:master

然后我們恢復Master的Redis進程
$ /etc/init.d/redis start

查看Master上的Keepalived日志
$ tailf /var/log/keepalived-redis-state.log

同時Slave上的日志顯示:
$ tailf /var/log/keepalived-redis-state.log

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM