前言html
淘寶架構師李智慧大牛的書籍《大型網站技術架構》以及旭龍兄的博客 ---》【大型網站技術實踐】初級篇:藉助LVS+Keepalived實現負載均衡。linux
從上參考而得來本文,本文旨在記錄本身的學習過程,同時給你們參考,不對的地方歡迎你們拍磚,拍磚的同時也但願甚至懇請你們能寫出緣由,讓你們都有所明白和收穫!nginx
相關的概念我這裏就很少講了,能夠從如上的書籍和旭龍兄的博客中去了解,那麼下面直接開始咱們的實踐!web
相關文章:算法
環境準備shell
本機 + virtualBox + 4臺centOs虛擬機,以下圖vim
virtualBox安裝以及CentOS安裝這裏就再也不演示,你們自行搭建;本機在本次試驗中扮演的角色就是客戶端,起到一個發送請求的做用,兩臺CentOS作負載均衡服務器(一臺爲主機,一臺爲備機),另外兩臺做爲真實的Web服務器(安裝有tomcat)。centos
本次實驗基於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服務器tomcat
和本地部署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 { 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 } } }
配置從負載服務器
和主負載服務器同樣,先安裝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
效果展現
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這樣的搭配類型,靜態文件和動態文件分開進行處理,也不失爲一種有效的嘗試。在之後的日子裏,我會陸續進行實踐,並分享給你們!