1. 程式人生 > >主從熱備+負載均衡(LVS + keepalived)

主從熱備+負載均衡(LVS + keepalived)

前言

  淘寶架構師李智慧大牛的書籍《大型網站技術架構》以及旭龍兄的部落格 ---》【大型網站技術實踐】初級篇:藉助LVS+Keepalived實現負載均衡

  從上參考而得來本文,本文旨在記錄自己的學習過程,同時給大家參考,不對的地方歡迎大家拍磚,拍磚的同時也希望甚至懇請大家能寫出原因,讓大家都有所明白和收穫!

  相關的概念我這裡就不多講了,可以從如上的書籍和旭龍兄的部落格中去了解,那麼下面直接開始我們的實踐!

環境準備

  本機 + virtualBox + 4臺centOs虛擬機器,如下圖

  virtualBox安裝以及CentOS安裝這裡就不再演示,大家自行搭建;本機在本次試驗中扮演的角色就是客戶端,起到一個傳送請求的作用,兩臺CentOS做負載均衡伺服器(一臺為主機,一臺為備機),另外兩臺作為真實的Web伺服器(安裝有tomcat)。

  本次實驗基於DR負載均衡模式(直接路由,旭龍兄的部落格有講解),設定一個VIP(Virtual IP)為192.168.1.200,使用者只需要訪問這個IP地址即可獲得網頁服務。其中,負載均衡主機為192.168.1.114(master),備機為 192.168.1.112(brucelee)。Web伺服器A為192.168.1.111(youzhibing),Web伺服器B為192.168.1.115(youzhibing03),四臺機器命名除了master外都不太規範,但不影響實驗。四臺CentOS的防火牆都需要關閉。利用Xshell連結CentOS,如下圖

配置兩臺web伺服器

  和本地部署web專案一樣,將myWeb部署到tomcat中,開啟tomcat,宿主機訪問(virtualBox安裝linux,並搭建tomcat請點這),如下圖

  將這兩臺web伺服器都配置成lvs的real server,編輯realserver指令碼檔案,進入指定資料夾:cd /etc/init.d/,編輯指令碼檔案:vim realserver,如下圖

  /etc/init.d/realserver 內容如下

複製程式碼

#vi /usr/local/sbin/realserver.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
#Written by :NetSeek http://www.linuxtone.org

SNS_VIP=192.168.1.200
 
. /etc/rc.d/init.d/functions
 
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0               
      echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1              
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
 
exit 0

複製程式碼

  儲存指令碼檔案後更改該檔案許可權:chmod 755 realserver,開啟realserver服務:service realserver start;

  注意:配置real server是web伺服器都需要配置的,有多少臺就配置多少臺!

配置主負載伺服器

  1.安裝Keepalived相關包

yum install -y keepalived

  在CentOS下,通過yum install命令可以很方便地安裝軟體包,但是前提是你的虛擬機器要聯網,若沒有聯網則先從有網的地方下載壓縮包,然後拷貝或者上傳到linux系統,再進行安裝;

  2.編輯keepalived.conf配置檔案

    ①進入keepalived.conf所在目錄:cd /etc/keepalived

    ②首先清除掉keepalived原有配置:> keepalived.conf

    ③重新編輯keepalived配置檔案:vi keepalived.conf

    內容如下:

複製程式碼

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 192.168.1.114
    smtp_connection_timeout 30
    router_id LVS_MASTER         # 設定lvs的id,在一個網路應該是唯一的
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface eth0            # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡)
    virtual_router_id 66        # 虛擬路由編號,主從要一直
    priority 100            # 優先順序,數值越大,獲取處理請求的優先順序越高
    advert_int 1            # 檢查間隔,預設為1s(vrrp組播週期秒數)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200        # 定義虛擬ip(VIP),可多設,每行一個
    }
}
# 定義對外提供的LVS的VIP以及port
virtual_server 192.168.1.200 8080 {
    delay_loop 6             # 設定健康檢查時間,單位為秒
    lb_algo wrr            # 設定負載排程的演算法為wrr
    lb_kind DR            # 設定lvs實現負載的機制,有NAT、TUN、DR三個模式
    nat_mask 255.255.255.0
    persistence_timeout 0        # 同一IP 0秒內的請求都發到同個real server
    protocol TCP
    real_server 192.168.1.111 8080 { # 指定real server1的ip地址
        weight 3        # 配置節點權值,數值越大權重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.115 8080 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}    

複製程式碼

配置從負載伺服器

  和主負載伺服器一樣,先安裝keepalived,然後編輯keepalived.conf,內容如下,與主負載伺服器有些許差別

複製程式碼

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 192.168.1.112
    smtp_connection_timeout 30
    router_id LVS_BACKUP         # 設定lvs的id,在一個網路應該是唯一的
}
vrrp_instance VI_1 {
    state BACKUP            # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface eth0            # 當前進行vrrp通訊的網路介面卡(當前進行vrrp通訊的網路介面卡)
    virtual_router_id 66        # 虛擬路由編號,主從要一致
    priority 99            # 優先順序,數值越大,獲取處理請求的優先順序越高
    advert_int 1            # 檢查間隔,預設為1s(vrrp組播週期秒數)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200        # 定義虛擬ip(VIP),可多設,每行一個
    }
}
# 定義對外提供的LVS的VIP以及port
virtual_server 192.168.1.200 8080 {
    delay_loop 6             # 設定健康檢查時間,單位為秒
    lb_algo wrr            # 設定負載排程的演算法為wrr
    lb_kind DR            # 設定lvs實現負載的機制,有NAT、TUN、DR三個模式
    nat_mask 255.255.255.0
    persistence_timeout 0        # 同一IP 0秒內的請求都發到同個real server
    protocol TCP
    real_server 192.168.1.111 8080 { # 指定real server1的ip地址
        weight 3        # 配置節點權值,數值越大權重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.115 8080 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}    

複製程式碼

  啟動keepalive服務,主從都要啟動!

service keepalived start

效果展示

  1.負載均衡演示

    這裡出現了問題,發現同一個瀏覽器一段時間內重新整理,得到的結果是同一個,也就是說同一個ip某一段時間內的請求交給了同一臺real server處理,用centos上的瀏覽器測試也是一段時間內的請求得到的是同一個結果,但是與宿主機卻有所不同,比如宿主機得到的是相同的192.168.1.115,而centos上得到的卻是192.168.1.111,,可明明我配置了persistence_timeout 0,找了不少資料,還是沒能解決!希望知道的朋友可以不吝賜教,在評論區進行留言,謝謝了!

  a.web伺服器出現故障

    192.168.1.115發生故障,關閉115也就是youzhibing03的tomcat服務

      那麼宿主機與虛擬機器上的結果都只有一個,都得到如下結果

  b.web伺服器修復,重新啟動115的tomcat服務

      宿主機得到如下結果

      可虛擬機器上顯示的卻還是192.168.111的結果

  2.主從熱備演示

    a.關閉主負載伺服器的keepalived服務

      重新整理頁面,依然能得到如下結果

      那麼也就說明從負載伺服器(brucelee)接管了,我們來看下日誌

      發現從負載伺服器確實接管了主負載伺服器的任務

    b.當之前的主負載伺服器(master)修復後,日誌檔案如下

      主負載伺服器恢復後,從負載伺服器讓出位置,回到最初的主從狀態了!

總結

  總的來說,最終的效果還是符合標題的,雖然在負載均衡那一塊有些許疑問,好像沒有達到負載均衡的目的,但是也確實只是好像,因為總體而言還是有負載均衡效果的,比如宿主機的得到的是115的結果,而虛擬機器上的得到的是111的結果;

  目前流行的LVS解決方案中,在Web伺服器端也有采用了Nginx+Tomcat這樣的搭配型別,靜態檔案和動態檔案分開進行處理,也不失為一種有效的嘗試。在以後的日子裡,我會陸續進行實踐,並分享給大家!

後話

  這篇部落格其實週六就寫好了,但是一直糾結負載均衡那個位置,遲遲沒有發表出來,也是希望對自己和對大家負責吧;但是有好心不一定就有好的結果,查閱了不少資料,也進行了不少修改,可負載均衡的效果一直沒有改變(不是沒有哦!),離我預期的有些出入,雖然有出入,但我認為負載均衡的效果是存在的,只是與單個瀏覽器重新整理而得到兩個效果之間輪流切換有一些不同罷了!

  另外提一點,如果大家想親手實踐下的話,我建議大家的硬體不要太低了,我的i7處理器 + 4G記憶體,執行主機 +4臺虛擬機器有點卡,建議大家記憶體上大點,最好8G以上;

  最後強調一點:實踐是檢驗真理的唯一標準! 有些許的衝動就趕快去實踐!