LVS+Nginx負載均衡、LVS高可用環境搭建、安裝Keepalived

上節課我們一起學習了LVS+Nginx負載均衡DR模式的環境搭建,這節我們一起學習下LVS四層+Nginx七層負載均衡環境的搭建和LVS高可用環境搭建。

LVS四層+Nginx七層負載均衡環境的搭建

   需求:lvs採用DR模式基本上沒有性能瓶頸,用戶請求輸入至lvs經過負載轉發到後臺服務上,通過後臺服務輸出響應給用戶。nginx的負載性能遠沒有lvs好,lvs四層+nginx七層負載的好處是最前端是lvs接收請求進行負載轉發,由多個nginx共同完成七層負載,這樣nginx的負載性能就可以線性擴展。

   環境準備,如下所示,可以看到,與上節課相比多了兩臺tomcat服務器。

vip:192.168.156.110
lvs-director:192.168.156.35

nginx1:192.168.156.36 安裝nginx
nginx2:192.168.156.37 安裝nginx

tomcat1:192.168.156.38 安裝tomcat
tomcat2:192.168.156.39 安裝tomcat

   lvs-director服務器的搭建與上節課一樣,我們用上節課那個lvs-director就可以了,lvs-nginx1和lvs-nginx2與上節課的唯一不同之處是在nginx.conf配置文件中添加了對tomcat的負載均衡設置,如下圖所示。(lvs-nginx1和lvs-nginx2的nginx.conf文件都做如下圖所示修改)

上圖修改的內容如下

upstream tomcat_server_pool{
server 192.168.156.38:8080;
server 192.168.156.39:8080;
}
location / {
proxy_pass http://tomcat_server_pool;
index index.html index.htm;
}

由於修改了nginx.conf文件,因此要重啓nginx服務
[root@lvs-nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload
[root@lvs-nginx2 conf]# /usr/local/nginx/sbin/nginx -s reload
下面我們便新建兩臺虛擬機,IP分別設置成192.168.156.38和192.168.156.39,關於如何新建虛擬機在上節說過了,這裏不囉嗦,要安裝tomcat,要有JDK環境,關於如何安裝JDK及tomcat,大家可以參考http://blog.csdn.net/u012453843/article/details/72599478這篇博客進行學習。爲了區分不同的tomcat首頁,我們修改下Tomcat的歡迎頁內容,大家可以參考http://blog.csdn.net/u012453843/article/details/72599478這篇博客進行修改。

安裝完Tomcat之後,我們訪問地址http://192.168.156.110,可以看到我們訪問到的tomcat歡迎頁出現的規律是兩次"lvs-tomcat1"之後是兩次"lvs-tomcat2"然後在兩次"lvs-tomcat1"如此循環往復,之所以會出現這種請款是因爲我們有兩個nginx,兩個nginx都對兩個tomcat進行了負載均衡,兩套負載均衡綜合在一起便會出現這種現象。如果停止任意一臺nginx或停止任意一臺tomcat不影響訪問。

這樣,LVS四層+Nginx七層負載均衡環境便搭建好了!

LVS高可用環境搭建

1.什麼是高可用?
lvs作爲負載均衡器,所有請求都先到達lvs,可見lvs處於非常重要的位置,如果lvs服務器宕機後端web服務將無法提供服務,影響嚴重。
爲了屏蔽負載均衡服務器的宕機,需要建立一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,通過傳送諸如“I am alive”這樣的信息來監控對方的運行狀況。當備份機不能在一定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。

2.keepalived+lvs實現主備
2.1 什麼是keepalived?
keepalived是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障。
Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。

2.2 keepalived工作原理
keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,可以認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由爲該vip),master會發組播,當backup收不到VRRP包時就認爲master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和VRRP。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。VRRP模塊是來實現VRRP協議的。

2.3 keepalived+lvs實現主備過程

    2.3.1 集羣初始狀態



    2.3.2 主機宕機



    2.3.3 主機恢復



     2.4 環境準備

vip:192.168.156.110
lvs-director:192.168.156.35 主lvs
lvs-director:192.168.156.40 備lvs

nginx1:192.168.156.36 安裝nginx
nginx2:192.168.156.37 安裝nginx

tomcat1:192.168.1.200 安裝tomcat(實際的服務器,如果沒有實際服務器就用虛擬機代替)
tomcat2:192.168.1.201 安裝tomcat(實際的服務器,如果沒有實際服務器就用虛擬機代替)
tomcat3:114.55.254.239 安裝tomcat(實際的服務器,如果沒有實際服務器就用虛擬機代替)

    2.5 安裝keepalived

    分別在主備lvs上安裝keepalived,關於keepalived的安裝,大家可以參考http://blog.csdn.net/u012453843/article/details/72808459這篇博客進行學習。

    2.6 配置keepalived

     2.6.1 修改主lvs下/etc/keepalived/keepalived.conf文件

! Configuration File for keepalived

global_defs {
notification_email {
[email protected] #發生故障時發送的郵箱
}
notification_email_from [email protected] #使用哪個郵箱發送
smtp_server smtp.163.com #發件服務器
smtp_connect_timeout 30 #連接smtp連接超時時間
router_id LVS_DR #機器標識,通常爲hostname,但不一定非得是hostname。故障發生時,郵件通知會用到
}

vrrp_script chk_lvs {
script “/etc/keepalived/lvs_check.sh” #監測lvs是否健康的腳本
interval 2 #每隔兩秒檢查一次
weight -20 #每執行成功一次權重減20
}

vrrp_instance VI_1 {
state MASTER #標示爲主lvs
interface eth0 #HA檢測端口
virtual_router_id 51 #主備的virtual_router_id 必須相同
priority 100 #優先級,備lvs要比主lvs稍小
advert_int 1 #VRRP Multicast廣播週期秒數
authentication { #定義認證
auth_type PASS #認證方式爲口令認證
auth_pass 1111 #定義口令
}
track_script {
chk_lvs #與上面vrrp_script chk_lvs的名稱要一致
}
virtual_ipaddress { #定義VIP
192.168.156.110 #多個VIP可換行添加
}
}

virtual_server 192.168.156.110 80 {
delay_loop 6 #每隔6秒查看realserver狀態
lb_algo wlc #調度算法爲加權最小連接數
lb_kind DR #lvs工作模式爲DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 50 #同一IP的連接50秒內被分配到同一臺realserver(測試時建議改爲0)
protocol TCP #用TCP監測realserver的狀態

real_server 192.168.156.35 80 {		#定義realserver
    weight 3						#定義權重
    TCP_CHECK {						#注意TCP_CHECK和{之間的空格,如果沒有的話只會添加第一個realserver
		connect_timeout 3			#連接超時時間爲3秒
		nb_get_retry 3				#重連次數3
		delay_before_retry 3		#每次嘗試間隔3秒
		connect_port 80				#連接端口號 80
	}
}

real_server 192.168.156.40 80 {		#定義realserver
    weight 3						#定義權重
    TCP_CHECK {						#注意TCP_CHECK和{之間的空格,如果沒有的話只會添加第一個realserver
		connect_timeout 3			#連接超時時間爲3秒
		nb_get_retry 3				#重連次數3
		delay_before_retry 3		#每次嘗試間隔3秒
		connect_port 80				#連接端口號 80
	}
}

}
2.6.2 修改備lvs下/etc/keepalived/keepalived.conf文件
配置備lvs時需要注意:需要修改state爲BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived

global_defs {
notification_email {
[email protected] #發生故障時發送的郵箱
}
notification_email_from [email protected] #使用哪個郵箱發送
smtp_server smtp.163.com #發件服務器
smtp_connect_timeout 30 #連接smtp連接超時時間
router_id LVS_DR_BACK #機器標識,通常爲hostname,但不一定非得是hostname。故障發生時,郵件通知會用到
}

vrrp_script chk_lvs {
script “/etc/keepalived/lvs_check.sh” #監測lvs是否健康的腳本
interval 2 #每隔兩秒檢查一次
weight -20 #每執行成功一次權重減20
}

vrrp_instance VI_1 {
state BACKUP #標示爲備份lvs
interface eth0 #HA檢測端口
virtual_router_id 51 #主備的virtual_router_id 必須相同
priority 99 #優先級,備lvs要比主lvs稍小
advert_int 1 #VRRP Multicast廣播週期秒數
authentication { #定義認證
auth_type PASS #認證方式爲口令認證
auth_pass 1111 #定義口令
}
track_script {
chk_lvs #與上面vrrp_script chk_lvs的名稱要一致
}
virtual_ipaddress { #定義VIP
192.168.156.110 #多個VIP可換行添加
}
}

virtual_server 192.168.156.110 80 {
delay_loop 6 #每隔6秒查看realserver狀態
lb_algo wlc #調度算法爲加權最小連接數
lb_kind DR #lvs工作模式爲DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 50 #同一IP的連接50秒內被分配到同一臺realserver(測試時建議改爲0)
protocol TCP #用TCP監測realserver的狀態

real_server 192.168.156.35 80 {		#定義realserver
    weight 3						#定義權重
    TCP_CHECK {						#注意TCP_CHECK和{之間的空格,如果沒有的話只會添加第一個realserver
		connect_timeout 3			#連接超時時間爲3秒
		nb_get_retry 3				#重連次數3
		delay_before_retry 3		#每次嘗試間隔3秒
		connect_port 80				#連接端口號 80
	}
}

real_server 192.168.156.40 80 {		#定義realserver
    weight 3						#定義權重
    TCP_CHECK {						#注意TCP_CHECK和{之間的空格,如果沒有的話只會添加第一個realserver
		connect_timeout 3			#連接超時時間爲3秒
		nb_get_retry 3				#重連次數3
		delay_before_retry 3		#每次嘗試間隔3秒
		connect_port 80				#連接端口號 80
	}
}

}
在/etc/keepalived目錄下我們新建上面提到的lvs_check.sh腳本,爲方便編輯我們還是使用NodePad++來操作,腳本內容如下:

#!/bin/sh
aa=ipvsadm -ln
str=“Route”
bb=echo $aa|grep $str|wc -l
if [ $bb = 0 ];then
service lvsdr start
sleep 3
aa=ipvsadm -ln
bb=echo $aa|grep $str|wc -l
if [ $bb = 0 ];then
killall keepalived
fi
fi
下面我來解釋下上面腳本的意思,其中aa=ipvsadm -ln用於查看lvs是否處於啓動狀態
當lvs沒有啓動時,回顯信息如下

[root@lvs-dr keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:80 wlc persistent 50
[root@lvs-dr keepalived]#
當lvs處於啓動狀態時,回顯信息如下:可以看到,與上面的信息相比,多了兩行(192.168.156.36:80 Route 1 0 0和192.168.156.37:80 Route 1 0 0)。
[root@lvs-dr keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:80 rr
-> 192.168.156.36:80 Route 1 0 0
-> 192.168.156.37:80 Route 1 0 0
[root@lvs-dr keepalived]#
腳本中str="Route"的意思是,如果lvs啓動了,那麼多出的兩行信息中包含"Route"字符串,而沒有啓動lvs時是沒有"Route"信息的,因此"Route"成了判斷條件。
腳本中bb=echo $aa|grep $str|wc -l這句代碼的意思是判斷"ipvsadm -ln"命令的回顯信息中包含"Route"的個數。如果是0就代表lvs沒有啓動,如果大於0就代表lvs已經啓動了。

     下面兩行代碼的意思就是如果lvs沒有啓動,那麼就啓動lvs服務

if [ $bb = 0 ];then
service lvsdr start
下面幾行代碼的意思是,我們啓動lvs服務後停3秒後再次判斷"ipvsadm -ln"的回顯信息中是否包含"Route",要判斷當前是否包含就必須重新獲取回顯信息並且重新獲取包含數量,如果還是沒有包含的話,說明lvs沒有正常啓動,這時便殺掉主設備的keepalived進程,讓備份keepalived進行工作。
sleep 3
aa=ipvsadm -ln
bb=echo $aa|grep $str|wc -l
if [ $bb = 0 ];then
killall keepalived
fi
寫完腳本我們要確保該腳本的格式爲unix格式,關於如何做,前面已經說過了,這裏不再囉嗦。
我們還需要給該腳本添加執行權限:

[root@lvs-dr keepalived]# chmod +x lvs_check.sh
添加完權限後,可以看到腳本的顏色變深綠色了。

          注意:在兩臺lvs服務器的/etc/keepalived目錄下都添加lvs_check.sh腳本。

        2.7 測試

         先確保沒有啓動keepalived和lvs,然後使用命令service keepalived start來啓動主備keepalived服務,啓動完之後,我們使用命令"ipvsadm -ln"來查看lvs的啓動狀態,發現正常啓動了。

[root@lvs-dr keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:80 rr
-> 192.168.156.36:80 Route 1 1 0
-> 192.168.156.37:80 Route 1 1 0
[root@lvs-dr keepalived]#
這時我們使用ip a來查看下虛擬IP,先來看主lvs設備的虛擬IP信息,如下圖所示,發現是有虛擬IP(192.168.156.110)的。

      接着,我們再來看下備份lvs設備的虛擬IP信息,如下圖所示,發現在eth0這個接口上並沒有虛擬IP,在eth0:0上有這個虛擬IP。



       出現這種情況似乎與我們想象的不太一樣,爲了與我們想象的結果一樣,我們可以先把主lvs設備的keepalived服務關閉,然後關掉備份lvs設備的keepalived服務之後重啓備份lvs設備的keepalived服務。爲了讓虛擬IP回到主lvs設備上,這時我們再啓動主lvs設備的keepalived服務。這時我們再看備份lvs設備,就與我們想象的一致了。


       下面我們來測試訪問tomcat首頁,我們需要在lvs-nginx1和lvs-nginx2兩臺設備上修改nginx的配置文件,兩臺設備修改的內容一樣,如下圖所示。



     修改的內容如下

upstream loadbalance {
server 192.168.1.200:8086;
server 192.168.1.201:8086;
server 114.55.254.239:8086;
}
location / {
proxy_pass http://loadbalance;
index index.html index.htm;
}
由於nginx修改了配置文件,因此我們需要重啓lvs-nginx1和lvs-nginx2兩臺服務器

[root@lvs-nginx1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@lvs-nginx2 ~]# /usr/local/nginx/sbin/nginx -s reload
爲了區分三臺不同的設備上的tomcat首頁,我對tomcat首頁進行了標記,這個前面也說過了,這裏不囉嗦了。
現在我們便來訪問虛擬IP192.168.156.110,刷新它,就會發現我們在tomcat1、tomcat2、tomcat3之間均勻切換,說明負載是起作用的。

        爲了測試高可用性,我們可以殺掉主keepalived服務,如下

[root@lvs-dr keepalived]# service keepalived stop
停止 keepalived: [確定]
[root@lvs-dr keepalived]#
我們繼續訪問虛擬IP,發現是沒有問題的,我們再重新啓動主lvs設備的服務,發現虛擬IP就又回到了主服務器。與我們所畫的圖是一致的。

————————————————
版權聲明:本文爲CSDN博主「在京奮鬥者」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012453843/article/details/72802116

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