keepalive構建高可用LVS集羣

一、什麼是keepalived?

    利用虛擬路由冗餘協議(vrrp)技術,實現lvs的高可用,也可以對nginx和haproxy等輕量級帶有負載均衡的軟件進行高可用。因爲keepalived非常輕量級,速度非常快,配置簡單,所以受到衆多企業運維人員青睞。 

   參考資料:http://outofmemory.cn/wiki/keepalived-configuration



二、虛擬路由備份協議

    VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)是一種容錯協議,這個協議內的所有路由分爲主備,平時數據都是由主節點的IP接口接收轉發,一旦主節點故障,就自動啓動備用節點,奪取主節點的IP,接管主節點的所有轉發工作。

    


三、案例:KeepAlived 實現高可用 LVS


    1、環境準備

  1.   準備兩個http節點:172.16.113.13          172.16.113.14            vip:172.16.13.1

  2.   準備兩個lvs節點:  172.16.13.13            172.16.13.14             vip:172.16.13.1

  3.   測試兩個lvs節點可不可以對後面兩個http節點進行負載均衡

  4.   配置keepalived:172.16.13.13     172.16.13.14                         vip:172.16.13.1

  5.   測試keepalived對lvs的高可用性

wKioL1WATv3QXPpIAABO87jqcrs588.jpg



     2、網絡拓撲圖


wKiom1WATVuAWlLlAAKibo8x4uw222.jpg



    3、兩個http節點上的配置


       1)安裝並開啓http服務,確保80端口開啓可用;

       2)配置lvs-RS

# vim chk-lvs.sh               //寫個腳本配置方便多了,只要執行以下就可以了
#!/bin/bash
vip=172.16.13.1
interface="lo:0"
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $interface $vip broadcast $vip netmask 255.255.255.255 up
    route add -host $vip dev $interface
;;
stop)
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $interface down
;;
status)
    if ifconfig lo:0 |grep $vip &> /dev/null; then
echo "ipvs is running."
    else
echo "ipvs is stopped."
    fi
;;
*)
    echo "Usage: `basename $0` {start|stop|status}"
    exit 1
esac
# service httpd start
# bash chk-lvs start

      3)瀏覽器分別輸入172.16.113.13和172.16.113.14測試http服務是否可用



    4、準備兩個LVS節點並測試可用


      1) 安裝ipvsadm

      2)  配置ipvs規則

      3) 測試lvs負載均衡是不是可用

# yum install ipvsadm -y

# vim ipvs.sh 
#!/bin/bash
vip=172.16.13.1
rip=('172.16.113.13' '172.16.113.14')
weight=('1' '2')
port=80
scheduler=rr
ipvstype='-g'
case $1 in
start)
    iptables -F -t filter
    ipvsadm -C
    ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
    route add -host $vip dev eth0:0
    echo 1 > /proc/sys/net/ipv4/ip_forward
    ipvsadm -A -t $vip:$port -s $scheduler
    [ $? -eq 0 ] && echo "ipvs service $vip:$port added."  || exit 2
    for i in `seq 0 $[${#rip[@]}-1]`; do
        ipvsadm -a -t $vip:$port -r ${rip[$i]} $ipvstype -w ${weight[$i]}
        [ $? -eq 0 ] && echo "RS ${rip[$i]} added."
    done
    touch /var/lock/subsys/ipvs
;;
stop)
    echo 0 > /proc/sys/net/ipv4/ip_forward
    ipvsadm -C
    ifconfig eth0:0 down
    rm -f /var/lock/subsys/ipvs
    echo "ipvs stopped."
;;
status)
    if [ -f /var/lock/subsys/ipvs ]; then
echo "ipvs is running."
ipvsadm -L -n
else
echo "ipvs is stopped."
fi
;;
*)
    echo "Usage: `basename $0` {start|stop|status}"
exit 3
;;
esac
   
# bash ipvs.sh start
# ipvsadm -Ln

      4)瀏覽器輸入172.16.13.1測試DR模型能不能負載



    5、安裝配置keepalived


# yum install keepalived -y
# vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     [email protected]                        //目標郵箱,可以有多個
   }
   notification_email_from [email protected]           //發件人郵箱
   smtp_server 127.0.0.1                 //郵件服務器地址
   smtp_connect_timeout 30               //郵件服務器連接超時時長
   router_id LVS_DEVEL   //運行Keepalived服務器的一個標識。發郵件時顯示在郵件標題中的信息
}
vrrp_script chk_mt_down {           //定義一個函數,檢測外部因素決定權重的增加或刪除
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"     //如果檢測到down文件,就自動減5個數值的權重
    interval 1                     //一秒檢測一次
    weight -5 
}
vrrp_instance VI_1 {              //定義一個vrrp實例
    state BACKUP                  //裝態有兩個MASTER  /  BACKUP
    interface eth0                //指定網卡
    virtual_router_id 52    //虛擬路由標識,這個標識是一個數字,並且同一個vrrp實例使用唯一的標識,即同一個vrrp_instance下,MASTER和BACKUP必須是一致的,範圍0-255
    priority 95           //定義優先級,數字越大,優先級越高,在一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。
    advert_int 1          //設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {                 //設定認證機制
        auth_type PASS               //設置驗證類型,主要有PASS和AH兩種
        auth_pass 21111             //主備密碼必須相同
    }
    virtual_ipaddress {    //虛擬ip可以定義多個;格式:ip/16 dev eth2 label eth2:1  
        172.16.13.1
    }
        track_script {        //在這裏定義一個函數,追蹤上面定義的chk_mt_down函數
chk_mt_down
        }
 notify_master "/etc/keepalived/notify.sh master"     //下面三行定義消息通知機制的,需要在/etc/keepalived/目錄下創建執行腳本notify.sh,腳本內容下面給出
 notify_backup "/etc/keepalived/notify.sh backup"
 notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 172.16.13.1 80 {            //定義ipvs規則
    delay_loop 6                           //健康狀態檢查間隔
    lb_algo rr                             //lvs的調度算法
    lb_kind DR                             //lvs的工作模式有DR/NAT/TUN
    nat_mask 255.255.255.255        //掩碼netmask 255.255.255.255
#    persistence_timeout 10         //這裏是定義會話保持的,單位是秒,因爲要測試高可用,所以註釋掉了
    protocol TCP                                           //轉發協議的類型有tcp/udp兩種
    real_server 172.16.113.13 80 {                //定義後端http服務器的
        weight 1                                                     //權重
    TCP_CHECK {                                        //定義健康狀態檢測方式
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
        }
       }
    real_server 172.16.113.14 80 {
        weight 1
    TCP_CHECK {                                   //定義TCP_CHECK方式
          connect_timeout 3                         //定義連接超時
          nb_get_retry 3                              //定義重試次數
          delay_before_retry 3                    //定義重試間隔
        }
    }
}
# vim /etc/keepalived/notify.sh           //郵件通知機制的運行腳本
 vip=172.16.13.1
contact='kaadmin@localhost'    //必須有kaadmin這個用戶存在纔可以收到郵件;su - kaadmin 後使用mail查看郵件
notify() {
 mailsubject="`hostname` to be $1: $vip floating"
 mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
       notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
 ;;
esac
# chmod +x  /etc/keepalived/notify.sh                //添加執行權限
# service keepalived start          //啓動keepalived

    

    6、測試高可用的LVS


              1)瀏覽器輸入172.16.13.1查看負載均衡是否可用   

wKiom1WAUQHjPi8RAAHLlAzrIPs438.jpg

wKioL1WAUsKgHxlUAABjANAwtTE908.jpg

wKiom1WAUROTNseHAABc_Rqnyd8527.jpg


         2)將後端http服務器下線,測試健康狀態檢測是否可用

# service httpd stop
# ipvsadm -Ln                                //查看規則顯示113.13節點已經下線

wKioL1WAU3PDaXJbAACvYF6FxyU874.jpg

wKiom1WAUcWCOjZFAAGruyOFwLc338.jpg


         3)創建down文件,測試keepalived是不是可以自動轉變"主備"

# touch /etc/keepalived/down
# tail -f /var/log/messages                       //日誌顯示節點轉變爲backup節點

wKiom1WAUiig6HJSAAV3Hw07TqE892.jpg

# rm  -f /etc/keepalived/down                        
# tail /var/log/messages      //日誌顯示當前節點轉變爲master節點

wKioL1WAVACB8QBAAAUwlPDJ9x0117.jpg


        4)將主節點keepalived關閉,查看備節點能不能轉變爲主節點

# service keepalived stop
# tail -6 /var/log/messages

wKiom1WAUprChe0FAADSA_IHU5o089.jpg

wKioL1WAVEiQhbEaAAOp8M6x018678.jpg


       5)最後檢查郵件通知能不能正常接收查看

# su - kaadmin
# mail                             //我已經收到了6封郵件了

wKiom1WAUsjRkypYAANwiKk4gXQ989.jpg

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