keepalived+redis 實現高可用的自動容錯移轉failover,keepalivedfailover

來源:互聯網
上載者:User

keepalived+redis 實現高可用的自動容錯移轉failover,keepalivedfailover
keepalived+redis 實現高可用的自動容錯移轉failover
在A伺服器(10.0.11.2),B伺服器(10.0.12.2)上均安裝redis,keepalived(安裝方法略)
A作為預設的master,B作為slave(在redis的設定檔中加上 SLAVEOF 10.0.11.2 6379)即可
A,B上的Redis均開啟本地化策略。appendonly yes

A伺服器的配置keepalived設定檔內容-------begin------
! Configuration File for keepalived


global_defs {
   notification_email {
    hq@xxx.com
    }
   notification_email_from hq@xxx.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id redis1.xxx.com
}


vrrp_script chk_redis {
script "/opt/redis/sh/redis_check.sh"
interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface bond0
    virtual_router_id 51 
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
chk_redis
    }
    virtual_ipaddress {
        10.0.11.0
    }
    notify_master /opt/redis/sh/redis_master.sh
    notify_backup /opt/redis/sh/redis_backup.sh
    notify_fault /opt/redis/sh/redis_fault.sh
    notify_stop /opt/redis/sh/redis_stop.sh
}
-----end-----
說明:global_defs 部分的郵件可以隨便寫,要實現郵件通知則要按真實填寫
script "/opt/redis/sh/redis_check.sh" #監控指令碼的路徑
interval 2 #監控的頻率
state MASTER #預設的狀態
interface bond0 #網卡名
virtual_router_id 51 #A,B 伺服器設定一樣即可
priority 101 #優先順序 比B設大即可
advert_int 2 #貌似廣播的頻率,不確定
authentication { #A,B 伺服器設定一樣即可
auth_type PASS
auth_pass 1111
}
    track_script { #監控的名稱,上面設定的
chk_redis
    }
    virtual_ipaddress { #虛擬IP, 用戶端就用這個IP來訪問redis
        10.0.11.0
    }
#以下是各個狀態下執行的指令碼路徑
notify_master /opt/redis/sh/redis_master.sh #成為master
notify_backup /opt/redis/sh/redis_backup.sh #成為backup
notify_fault /opt/redis/sh/redis_fault.sh #監控指令碼 exit 1 時
notify_stop /opt/redis/sh/redis_stop.sh #keepalived 服務停止時
/opt/redis/sh/redis_check.sh--begin--


#!/bin/bash
ALIVE=`/usr/local/bin/redis-cli PING`
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
    #echo "check master  pong" >> $LOGFILE
exit 0
else
echo $ALIVE
exit 1
fi
--end--
/opt/redis/sh/redis_master.sh--begin--


#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 10.0.12.2 6379 >> $LOGFILE  2>&1
sleep 15 
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
--end--
/opt/redis/sh/redis_backup.sh--begin--
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15
echo "Run SLAVEOF cmd..." >> $LOGFILE 
$REDISCLI SLAVEOF 10.0.12.2 6379 >> $LOGFILE  2>&1
--end--
/opt/redis/sh/redis_fault.sh--begin--
#!/bin/bash


LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
sh /opt/redis/sh/redis_backup.sh
--end--
/opt/redis/sh/redis_stop.sh--begin--
#!/bin/bash
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
--end--

B伺服器的配置
keepalived設定檔內容-------begin------
! Configuration File for keepalived


global_defs {
   notification_email {
    hq@xxx.com
    }
   notification_email_from hq@xxx.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id redis2.xxx.com
}


vrrp_script chk_redis {
script "/opt/redis/sh/redis_check.sh"
interval 2
}




vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 51
    priority 99
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
chk_redis
    }
    virtual_ipaddress {
        10.0.11.0
    }
    notify_master /opt/redis/sh/redis_master.sh
    notify_backup /opt/redis/sh/redis_backup.sh
    notify_fault /opt/redis/sh/redis_fault.sh
    notify_stop /opt/redis/sh/redis_stop.sh
}
-----end-----

/opt/redis/sh/redis_check.sh--begin--
#!/bin/bash
ALIVE=`/usr/local/bin/redis-cli -h 10.0.11.2 -p 6379 PING`
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
if [ "$ALIVE" != "PONG" ]; then
  echo $ALIVE
exit 0
else
  echo $ALIVE
exit 1
fi
--end--
/opt/redis/sh/redis_master.sh--begin--
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
##echo "master Run SLAVEOF 10.0.11.2 cmd ..." >> $LOGFILE
##REDISCLI SLAVEOF 10.0.11.2 6379 >> $LOGFILE  2>&1
#sleep 10 
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1


--end--
/opt/redis/sh/redis_backup.sh--begin--
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
#sleep 10
echo "backup Run SLAVEOF 10.0.11.2 cmd..." >> $LOGFILE 
$REDISCLI SLAVEOF 10.0.11.2 6379 >> $LOGFILE  2>&1
--end--
/opt/redis/sh/redis_fault.sh--begin--
#!/bin/bash


LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
sh /opt/redis/sh/redis_slave.sh
--end--


/opt/redis/sh/redis_stop.sh
--begin--
#!/bin/bash
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
--end--
/opt/redis/sh/redis_slave.sh--begin--
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/opt/redis/logs/keepalived-redis-state.log"
echo "[slave]" >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
sleep 35
date >> $LOGFILE
echo "slave Run SLAVEOF 10.0.11.2 cmd..." >> $LOGFILE 
$REDISCLI SLAVEOF 10.0.11.2 6379 >> $LOGFILE  2>&1
--end--
redis_slave.sh 中的sleep 35 說明,因為A伺服器上的redis服務起來後 B變成fault狀態,同時A伺服器在變成master,如果次是B太快同步A的話(比A從B同步資料早)會造成資料丟失。這樣做的目的是A起來後先從B同步資料,B在slaveof A,

指令碼說明:指令碼的邏輯就是當A,B上的redis服務正常是A為master,B為slave
如果檢測到A服務不正常則B成為master, “/usr/local/bin/redis-cli SLAVEOF NO ONE” 這個命令就是關閉資料同步,變成Redis 的master.
如果A服務起來後,A切回master,在變成master前從B上同步最新的資料。同時在B上要 執行 “/usr/local/bin/redis-cli SLAVEOF 10.0.11.2 6379”
讓B再做為A的slave,不然B還是master.
在redis的主從架構中,可以用“/usr/local/bin/redis-cli -h 10.0.11.2 INFO” 來查看各個當前的狀態。 看當前伺服器是master還是slave;


在命令列下 
“tail -30 /opt/redis/logs/keepalived-redis-state.log”  查看keepalived的狀態轉換 


“tail -30 /var/log/messages” 查看 keepalived虛擬IP的變化。


以上是在實際生產環境中測試過的,雖然有的的地方可能不大合理,但容錯移轉可以實現,資料也不會丟。之前按網上的教程做的vip可以切換,但資料這塊有問題,所以改成這樣。
如有更好的方法請告知,多謝!





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.