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


前言

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

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

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

  路漫漫其修遠兮,吾將上下而求索!

  github:https://github.com/youzhibing

  碼雲(gitee):https://gitee.com/youzhibing

環境准備

  本機 + 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服務器都需要配置的,有多少台就配置多少台!

配置負載服務器(master)

  安裝Keepalived

yum install -y keepalived

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

  配置keepalived

    ①進入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以及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
        }
    }
}    

配置負載服務器(slave)

  和主負載服務器一樣,先安裝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以及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

效果展示

  負載均衡演示

    這里出現了問題,發現同一個瀏覽器一段時間內刷新,得到的結果是同一個,也就是說同一個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的結果

  主從熱備演示

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

      刷新頁面,依然能得到如下結果

      那么也就說明從負載服務器(brucelee)接管了,我們來看下日志

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

    b.當之前的主負載服務器(master)修復后,日志文件如下

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

總結

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

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

后話

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM