keepalived redis主從雙機熱備部署

搭建環境看了很多帖子,因爲諸多原因都有些原因導致,失敗,因此記錄一下自己的搭建步驟。


爲了提高程序響應效率,用到了redis作爲存放緩存數據的地方,但是隻運行一臺redis無疑對線上環境是一種挑戰,萬一服務器宕機,那生成環境就沒法玩了,因此需要對redis做集羣配置,由於公司業務量不是很大,所以採用主從雙機熱備的方案。

主要核心思想,如果master 和 salve 全部存活的情況,VIP就漂移到 master。讀寫都從master操作,如果master宕機,VIP就會漂移到salve,並將之前的salve切換爲master,當宕機的master可以繼續服務的時候,首先會從salve同步數據,然後VIP漂移到master服務器上面,持續提供服務。

一、準備環境

    1.兩臺服務器

        192.168.0.55 master

        192.168.0.56 slave

        192.168.0.99 VIP

    2.redis安裝包

        下載地址:redis下載 (本人下載的穩定版 4.0.9)

    3.keeplived安裝包

二、安裝redis(兩臺服務器都按照此方式安裝)

    1、解壓安裝包

        tar -zxvf redis-stable.tar.gz 

    2、將文件放於 /usr/local

        mv redis-stable /usr/local/

    3、進入redis目錄並重命名

        cd /usr/local/

        mv redis-stable/ redis

    4、進入 redis目錄,編譯

        cd redis

        make 

        

        到這步就編譯成功了、但是發現    有個錯誤,經檢測發現是時間不對

        所以修改時間  

        date  -s "2018-3-31 15:24:00"  

        讓系統時間和硬件時間同步:

        hwclock --systohc

        

        最後通過date 查看時間無誤了。再編譯一次 在 redis目錄中再次make

        

       5、 然後執行 make test

        

        測試的時候報錯了,需要安裝 tcl8.5

        5.1 、去下載tcl8.5

        5.2、解壓並放入 /usr/local

        5.3、進入tcl 下的unix 編譯安裝

            cd tcl8.6.1/unix/

            ./configure

            make && make install

            

        6、進入 /usr/local/redis/src 執行 make install

            

        7、新建 redis 下新建 bin 及 etc目錄 存放redis 服務相關文件和配置文件

            mkdir /usr/local/redis/etc /usr/local/redis/bin

            

        8、移動相關文件

            mv /usr/local/redis/redis.conf /usr/local/redis/etc/

            cd /usr/local/redis/src

           mv  mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin/

        9、修改配置文件、讓服務可以後臺啓動

            vim /usr/local/redis/etc/redis.conf

            daemonize  yes

            requirepass 123456 (連接密碼)

        10、啓動 redis(後臺啓動)

            [root@jonyLinux1 redis]# ./bin/redis-server ./etc/redis.conf

        11、測試是否成功(保存、查找)

            

        12、配置服務

            12.1、創建文件

                touch /etc/init.d/redis

            12.2、編寫啓動文件

                vim /etc/init.d/redis

            12.3、文件內容

#!/bin/sh
# chkconfig: 2345 10 90  
# description: Start and Stop redis   

REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/etc/redis.conf"
REDISPASS=123456

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
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT -a $REDISPASS shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    restart)
        "$0" stop
        sleep 3
        "$0" start
        ;;
    *)
        echo "Please use start or stop or restart as first argument"
        ;;
esac

            12.4、配置開機啓動

                chmod +x /etc/init.d/redis

                chkconfig --add redis

                chkconfig redis on

    三、redis雙機熱備配置

            1、相關配置

                192.168.0.55 master中配置    

                    daemonize  yes

                    requirepass 123456

                    bind 0.0.0.0

                    slave-serve-stale-data yes

                    slave-read-only no

                192.168.0.56 slave中配置

                    daemonize  yes

                    slaveof 192.168.0.55 6379

                    masterauth 123456

                    slave-serve-stale-data yes

                    slave-read-only no

            2、驗證是否成功

                    192.168.0.55 master 中

                        

                    192.168.0.56 slave 中(先get weater 無值、master set 成功之後 slave 中 有值)

                        

    四、keepalived安裝

        1、解壓壓縮包

                tar -zxvf keepalived-1.4.0.tar.gz

        2、安裝所需鏡像

                yum install -y openssl openssl-devel

        3、編譯安裝

                cd keepalived-1.4.0

                ./configure -prefix=/usr/local/keepalived/

                make && make install

        4、拷貝keepalived配置文件

            cp /opt/keepalived-1.4.0/keepalived/etc/init.d/keepalived /etc/init.d/

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

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

            mkdir -p /etc/keepalived/scripts/

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

/etc/keepalived/keepalived.conf

        5、修改配置文件及腳本

               5.1、修改master keepalived配置文件

              vim /etc/keepalived/keepalived.conf      

vrrp_script chk_redis {
    script "killall -0 redis-server"
    interval 2
}
#網卡需要注意,使用ifconfig查看一下當前活動網卡
vrrp_instance VI_1 {
    state MASTER
    interface eth0   #監控網卡(一定要設置正確)
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.0.99  #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
}

             5.2、修改salve keepalived配置文件

                  vim /etc/keepalived/keepalived.conf

vrrp_script chk_redis {
   # script "killall -0 redis-server"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.0.99
    }

    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
}

    6、編寫監控腳本

        6.1、master中腳本

            6.1.1 redis_master.sh文件

                touch /etc/keepalived/scripts/redis_master.sh

                vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"

sleep 15

echo "[master]" >> $LOGFILE

date >> $LOGFILE

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


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

$REDISCLI SLAVEOF 192.168.0.58 6379 >>$LOGFILE  2>&1
if [ $? -ne 0 ];then
    echo "data rsync fail." >>$LOGFILE 2>&1
else
    echo "data rsync OK." >> $LOGFILE  2>&1
fi

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

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

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
if [ $? -ne 0 ];then
    echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
else
    echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE  2>&1
fi
            6.1.2 redis_backup.sh文件

                    touch /etc/keepalived/scripts/redis_backup.sh

                    vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash 

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

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.0.56 6379 >>$LOGFILE  2>&1

        6.2、slave中腳本

            6.2.1、redis_master.sh 腳本

                touch /etc/keepalived/scripts/redis_master.sh

                vim /etc/keepalived/scripts/redis_master.sh

#!/bin/bash 

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

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.0.55 6379 >>$LOGFILE  2>&1

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



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

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

             6.2.2、redis_backup.sh 腳本

                    touch /etc/keepalived/scripts/redis_backup.sh

                    vim /etc/keepalived/scripts/redis_backup.sh

#!/bin/bash 

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

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.0.55 6379 >>$LOGFILE  2>&1
                                                           

           6.3、master 和 salve 中同時創建腳本

                6.3.1 創建 redis_fault.sh

                    touch /etc/keepalived/scripts/redis_fault.sh

                    vim /etc/keepalived/scripts/redis_fault.sh

LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

                 6.3.2、創建 redis_stop.sh

                    touch /etc/keepalived/scripts/redis_stop.sh

                    vim /etc/keepalived/scripts/redis_stop.sh

lOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

      7、keepalived 最終腳本目錄如下

        master(55) 中

        

        salve(56) 中

        

到此所有配置文件全部設置完畢

然後再 maseter和 salve 中 執行:

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

五、驗證成功

    1、啓動master 和 salve中 的redis

        service redis restart

    2、啓動master 和 salve中的 keepalived

        service keepalived restart

    3、用VIP連接redis

        redis-cli -h 192.168.0.99 -a 123456

        

        3.1、輸入 info查看redis信息

        

        可以看到當前狀態爲master 以及 salve (圖中IP58,由於內網56被佔用了,只好將salve的IP改爲58)

        

     4、同步測試

            4.1、master服務器中

            

            salve 服務器中

            

            數據已同步。

            4.2、停掉master redis 服務,測試同步

            

            查看replication slaves 爲0

            

            4.3、新增 redis key

            

            4.4、重啓 master 中的redis,並查看redis 數據同步狀態

            

            啓動master中的redis,然後查看keys 還未同步,稍等片刻發現 剛剛再slave中新增的數據已同步。

        以上爲本人 使用keepalived+redis 雙機熱備實際操作步驟,以留記錄,方便以後再次使用,也方便看到此文的同學。


本環境搭建成功,要感謝諸多同學的貢獻,以下爲主要參考的一些帖子內容:

http://abcve.com/redis-keepalived/

http://blog.51cto.com/wangfeng7399/1591272

https://www.cnblogs.com/davidwang456/p/3525090.html

https://www.cnblogs.com/JeremyWYL/p/8562388.html

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