LVS:keepalived + lvs +tomcat 實現 主從熱備+負載平衡

來源:互聯網
上載者:User
前言

  淘寶架構師李智慧大牛的書籍《大型網站技術架構》以及旭龍兄的部落格 ---》【大型網站技術實踐】初級篇:藉助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.orgSNS_VIP=192.168.1.200 . /etc/rc.d/init.d/functions case "$1" instart)       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 1esac 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 {        997914490@qq.com    }    notification_email_from sns-lvs@gmail.com    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以及portvirtual_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 {        997914490@qq.com    }    notification_email_from sns-lvs@gmail.com    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以及portvirtual_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以上;

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.