1. 程式人生 > >SuSE11環境下Redis+Keepalived實現高可用技術

SuSE11環境下Redis+Keepalived實現高可用技術

keep starting pass prot x86_64 configure pid dev 修改

1.Redis配置信息
Redis部署使用兩臺服務器,實現Redis+keepalived,提供redis服務高可用,當主redis進程或服務器宕機之後,備redis進程或服務器繼續提供服務。

實現目的:主MASTER宕機後,從BACKUP接管VIP提供服務,升為MASTER,主MASTER恢復後狀態變為從BACKUP,不搶占回VIP,待新MASTER宕機後繼續接替VIP,重新升為MASTER

                 MASTER-->BACKUP-->MASTER 依次輪詢接管服務

服務器配置信息如下所示:

主機名/IP

端口

用途

JZSHPT-APP5/

10.133.214.15

6379

Redis主服務器

JZSHPT-APP6/

10.133.214.16

6379

Redis從服務器

2.Redis主服務器搭建
2.1.安裝redis
JZSHPT-APP5:/soft # tar -zxf redis-3.2.1.tar.gz -C /usr/local

JZSHPT-APP5:/soft # cd /usr/local/redis-3.2.1/

JZSHPT-APP5:/usr/local/redis-3.2.1 # make

JZSHPT-APP5:/usr/local/redis-3.2.1 # cd src && make install

JZSHPT-APP5:/usr/local # mv /usr/local/redis-3.2.1/ /usr/local/redis

1)redis配置文件修改

JZSHPT-APP5:/usr/local # vim /usr/local/redis/redis.conf

修改文件相關內容為:

protected-mode no

port 6379

daemonize yes

pidfile /usr/local/redis/redis.pid

logfile "/usr/local/redis/redis.log"

2)redis啟動腳本編寫(非必須)

JZSHPT-APP5:/usr/local/redis # vim /etc/init.d/redisd

#!/bin/sh

#chkconfig 345 86 14

#description Startup and Shutdown script for Redis-3.2.1

progdir=/usr/local/redis/src

progname=redis-server

daemon=$progdir/$progname

config=/usr/local/redis/redis.conf

pidfile=/usr/local/redis/redis.pid

desc="redis daemon"

scriptname=/etc/init.d/redisd

start()

{

if test -x $daemon;

then

echo -e "Starting $desc:$progname"

    if $daemon $config

    then

        echo -e "Start OK!!!"

    else

         echo -e "Start failed!!!"

    fi  

else

echo -e "Couldn‘t find Redis Server($daemon)"

fi  

}

stop()

{

if test -e $pidfile;

then

    echo -e "Stopping $desc:$progname"

    if kill `cat $pidfile`

    then

        echo -e "stop OK!!!"

    else

        echo -e "Stop failed!!!"

    fi

else

    echo -e "No Redis Server($daemoon) running"

fi

}

restart()

{

echo -e "Restarting $desc:$progname"

stop

    start

}

status()

{

ps aux | grep $progname

}

case $1 in

start)

    start

;;

stop)

    stop

;;

restart)

restart

;;

status)

status

;;

*)

echo "Usage:$scriptnme{start|stop|restart|status}" >&2

exit 1

;;

esac

exit 0

JZSHPT-APP5:/usr/local/redis # chmod +x /etc/init.d/redisd

JZSHPT-APP5:/usr/local/redis # chkconfig --add redisd

2.2.安裝Keepalived
安裝keepalived前請自行安裝解決依賴關系(可能會涉及的軟件包為libopenssl-devel、zlib-devel、ipvsadm內核模塊等)

JZSHPT-APP5:/soft # tar -zxf keepalived-1.2.23.tar.gz

JZSHPT-APP5:/soft # cd keepalived-1.2.23/

JZSHPT-APP5:/soft/keepalived-1.2.23 # ./configure --prefix=/usr/local/keepalived/

JZSHPT-APP5:/soft/keepalived-1.2.23 # make && make install

1) keepalived配置文件編輯

JZSHPT-APP5:~ # mkdir -p /etc/keepalived/{scripts,log}

JZSHPT-APP5:~ # vim /usr/local/keepalived/etc/keepalived/

! Configuration File for keepalived

global_defs {

router_id Redis1_DEVEL

}

vrrp_script chk_redis {

     script "/etc/keepalived/scripts/redis_check.sh"

     interval 2

     timeout 2

     fall 3

}

vrrp_instance VI_1 {

 state BACKUP

 interface eth0

 virtual_router_id 51

 nopreempt

 priority 200

  advert_int 5

  authentication {

auth_type PASS

    auth_pass redis

 }

 virtual_ipaddress {

     10.133.214.50

 }

 track_script {

     chk_redis

}

    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

}

2)keepalived啟動腳本配置

JZSHPT-APP5:~ # cp /soft/keepalived-1.2.23/keepalived/etc/init.d/keepalived.suse.init /etc/init.d/keepalived.suse

JZSHPT-APP5:~ # cp /usr/local/keepalived/sbin/keepalived /usr/local/sbin/

JZSHPT-APP5:~ # cp /usr/local/keepalived/etc/keepalived/ /etc/keepalived/

3)定義監控腳本

JZSHPT-APP5:~ # vim /etc/keepalived/scripts/redis_check.sh

#!/bin/sh

###/etc/keepalived/scripts/redis_check.sh

ALIVE=/usr/local/bin/redis-cli PING

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

echo $ALIVE

exit 0

else

echo $ALIVE

exit 1

fi

4)定義狀態切換為master時執行的腳本

JZSHPT-APP5:~ # vim /etc/keepalived/scripts/redis_master.sh

#!/bin/sh

###/etc/keepalived/scripts/redis_master.sh

REDISCLI="redis-cli"

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

pid=$$

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver]" >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.16 6379‘" >> $LOGFILE

$REDISCLI SLAVEOF 10.133.214.16 6379 >> $LOGFILE 2>&1

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] wait 10 sec for data sync from old master" >> $LOGFILE

sleep 10

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] data rsync from old mater ok..." >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE

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

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] wait other slave connect...." >> $LOGFILE

5)定義狀態切換為backups時執行的腳本

JZSHPT-APP5:~ # vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash

###/etc/keepalived/scripts/redis_backup.sh

REDISCLI="redis-cli"

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

pid=$$

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master]" >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE

sleep 10

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.16 6379‘" >> $LOGFILE

$REDISCLI SLAVEOF 10.133.214.16 6379 >> $LOGFILE 2>&1

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] slave connect to 192.18.3.21 ok..." >> $LOGFILE

6) 定義狀態切換為stop時執行的腳本

JZSHPT-APP5:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_stop.sh

7) 定義狀態切換為fault時執行的腳本

JZSHPT-APP5:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_fault.sh

2.2.安裝rsyslog實現keepalived日誌分離
1)安裝rsyslog軟件包

JZSHPT-APP5:/soft # rpm -ivh rsyslog-5.10.1-0.7.49.x86_64.rpm

2)修改rsyslog配置文件

JZSHPT-APP5:/soft # vim /etc/rsyslog.conf

140 #.;mail.none;news.none -/var/log/messages

141 .;mail.none;news.none;local0.none -/var/log/messages

153 #local0,local1.* -/var/log/localmessages

154 local0.* -/var/log/keepalived.log

155 local1.* -/var/log/localmessages

156 local2,local3.* -/var/log/localmessages

157 local4,local5.* -/var/log/localmessages

158 cal6,local7.* -/var/log/localmessages

3)修改rsyslog啟動腳本配置文件

根據/etc/init.d/syslog中的三個啟動選項,修改該文件內的”SYSLOG_DAEMON”選項

JZSHPT-APP5:/soft # vim /etc/sysconfig/syslog

40 #SYSLOG_DAEMON="syslog-ng"

41 SYSLOG_DAEMON="rsyslogd"

4)修改Keepalived啟動腳本選項

JZSHPT-APP5:/soft # vim /etc/init.d/keepalived.suse

17 DAEMON_OPT="-d "

18 DAEMON_OPT="-d -D -S 0"

5)啟動rsyslog服務

JZSHPT-APP5:/soft # /etc/init.d/syslog start

2.3.啟動Redis和Keepalived
JZSHPT-APP5:~ # /etc/init.d/redisd start

JZSHPT-APP5:~ # /etc/init.d/keepalived.suse start

3.Redis從服務器搭建
3.1.安裝redis
JZSHPT-APP6:/soft # tar -zxf redis-3.2.1.tar.gz -C /usr/local

JZSHPT-APP6:/soft # cd /usr/local/redis-3.2.1/

JZSHPT-APP6:/usr/local/redis-3.2.1 # make

JZSHPT-APP6:/usr/local/redis-3.2.1 # cd src && make install

JZSHPT-APP6:/usr/local # mv /usr/local/redis-3.2.1/ /usr/local/redis

1)redis配置文件修改

JZSHPT-APP6:/usr/local # vim /usr/local/redis/redis.conf

修改文件相關內容為:

protected-mode no

port 6379

daemonize yes

pidfile /usr/local/redis/redis.pid

logfile "/usr/local/redis/redis.log"

2)redis啟動腳本編寫(非必須)

JZSHPT-APP6:/usr/local/redis # vim /etc/init.d/redisd

#!/bin/sh

#chkconfig 345 86 14

#description Startup and Shutdown script for Redis-3.2.1

progdir=/usr/local/redis/src

progname=redis-server

daemon=$progdir/$progname

config=/usr/local/redis/redis.conf

pidfile=/usr/local/redis/redis.pid

desc="redis daemon"

scriptname=/etc/init.d/redisd

start()

{

if test -x $daemon;

then

echo -e "Starting $desc:$progname"

    if $daemon $config

    then

        echo -e "Start OK!!!"

    else

         echo -e "Start failed!!!"

    fi  

else

echo -e "Couldn‘t find Redis Server($daemon)"

fi  

}

stop()

{

if test -e $pidfile;

then

    echo -e "Stopping $desc:$progname"

    if kill `cat $pidfile`

    then

        echo -e "stop OK!!!"

    else

        echo -e "Stop failed!!!"

    fi

else

    echo -e "No Redis Server($daemoon) running"

fi

}

restart()

{

echo -e "Restarting $desc:$progname"

stop

    start

}

status()

{

ps aux | grep $progname

}

case $1 in

start)

    start

;;

stop)

    stop

;;

restart)

restart

;;

status)

status

;;

*)

echo "Usage:$scriptnme{start|stop|restart|status}" >&2

exit 1

;;

esac

exit 0

JZSHPT-APP6:/usr/local/redis # chmod +x /etc/init.d/redisd

JZSHPT-APP6:/usr/local/redis # chkconfig --add redisd

3.2.安裝Keepalived
安裝keepalived前請自行安裝解決依賴關系(可能會涉及的軟件包為libopenssl-devel、zlib-devel、ipvsadm內核模塊等)

JZSHPT-APP6:/soft # tar -zxf keepalived-1.2.23.tar.gz

JZSHPT-APP6:/soft # cd keepalived-1.2.23/

JZSHPT-APP6:/soft/keepalived-1.2.23 # ./configure --prefix=/usr/local/keepalived/

JZSHPT-APP6:/soft/keepalived-1.2.23 # make && make install

1)keepalived配置文件編輯

JZSHPT-APP6:~ # mkdir -p /etc/keepalived/{scripts,log}

JZSHPT-APP6:~ # vim /usr/local/keepalived/etc/keepalived/

! Configuration File for keepalived

global_defs {

router_id Redis2_DEVEL

}

vrrp_script chk_redis {

     script "/etc/keepalived/scripts/redis_check.sh"

     interval 2

     timeout 2

     fall 3

}

vrrp_instance VI_1 {

 state BACKUP

 interface eth0

 virtual_router_id 51

 priority 150

  advert_int 5

  authentication {

auth_type PASS

    auth_pass redis

 }

 virtual_ipaddress {

     10.133.214.50

 }

 track_script {

     chk_redis

}

    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

}

2)keepalived啟動腳本配置

JZSHPT-APP6:~ # cp /soft/keepalived-1.2.23/keepalived/etc/init.d/keepalived.suse.init /etc/init.d/keepalived.suse

JZSHPT-APP6:~ # cp /usr/local/keepalived/sbin/keepalived /usr/local/sbin/

JZSHPT-APP6:~ # cp /usr/local/keepalived/etc/keepalived/ /etc/keepalived/

3)定義監控腳本

JZSHPT-APP6:~ # vim /etc/keepalived/scripts/redis_check.sh

#!/bin/sh

###/etc/keepalived/scripts/redis_check.sh

ALIVE=/usr/local/bin/redis-cli PING

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

echo $ALIVE

exit 0

else

echo $ALIVE

exit 1

fi

4)定義狀態切換為master時執行的腳本

JZSHPT-APP6:~ # vim /etc/keepalived/scripts/redis_master.sh

#!/bin/sh

###/etc/keepalived/scripts/redis_master.sh

REDISCLI="redis-cli"

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

pid=$$

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver]" >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.15 6379‘" >> $LOGFILE

$REDISCLI SLAVEOF 10.133.214.15 6379 >> $LOGFILE 2>&1

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] wait 10 sec for data sync from old master" >> $LOGFILE

sleep 10

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] data rsync from old mater ok..." >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE

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

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] wait other slave connect...." >> $LOGFILE

5)定義狀態切換為backups時執行的腳本

JZSHPT-APP6:~ # vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash

###/etc/keepalived/scripts/redis_backup.sh

REDISCLI="redis-cli"

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

pid=$$

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master]" >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE

sleep 10

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] Run ‘SLAVEOF 10.133.214.15 6379‘" >> $LOGFILE

$REDISCLI SLAVEOF 10.133.214.15 6379 >> $LOGFILE 2>&1

echo "date +‘%Y-%m-%d:%H:%M:%S‘|$pid|state:[slaver] slave connect to 10.133.214.15 ok..." >> $LOGFILE

6) 定義狀態切換為stop時執行的腳本

JZSHPT-APP6:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_stop.sh

7) 定義狀態切換為fault時執行的腳本

JZSHPT-APP6:~ # cp /etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_fault.sh

3.3.安裝rsyslog實現keepalived日誌分離
1)安裝rsyslog軟件包

JZSHPT-APP5:/soft # rpm -ivh rsyslog-5.10.1-0.7.49.x86_64.rpm

2)修改rsyslog配置文件

JZSHPT-APP5:/soft # vim /etc/rsyslog.conf

140 #.;mail.none;news.none -/var/log/messages

141 .;mail.none;news.none;local0.none -/var/log/messages

153 #local0,local1.* -/var/log/localmessages

154 local0.* -/var/log/keepalived.log

155 local1.* -/var/log/localmessages

156 local2,local3.* -/var/log/localmessages

157 local4,local5.* -/var/log/localmessages

159 cal6,local7.* -/var/log/localmessages

3)修改rsyslog啟動腳本配置文件

根據/etc/init.d/syslog中的三個啟動選項,修改該文件內的”SYSLOG_DAEMON”選項

JZSHPT-APP5:/soft # vim /etc/sysconfig/syslog

40 #SYSLOG_DAEMON="syslog-ng"

41 SYSLOG_DAEMON="rsyslogd"

4)修改Keepalived啟動腳本選項

JZSHPT-APP5:/soft # vim /etc/init.d/keepalived.suse

17 DAEMON_OPT="-d "

18 DAEMON_OPT="-d -D -S 0"

5)啟動rsyslog服務

JZSHPT-APP5:/soft # /etc/init.d/syslog start

3.4.啟動Redis和Keepalived
JZSHPT-APP6:~ # /etc/init.d/redisd start

JZSHPT-APP6:~ # /etc/init.d/keepalived.suse start

測試結果可通過依次停Redis主從單節點來觀測vip漂移

SuSE11環境下Redis+Keepalived實現高可用技術