什麼是持久連結
把某個客戶端的請求始終定向到同一應用伺服器上。對於LVS來說持久連線和演算法沒有關係。也就是使用任何演算法LVS都可以實現同一客戶端的請求轉發到之前選定的應用伺服器,以保持會話。而且還能實現同一客戶端的不同請求都可以定向到同一應用伺服器,比如叢集中2臺應用伺服器,每個應用伺服器都提供WEB服務和TELNET服務,那麼只要客戶端一樣,即使它兩次請求不同服務,也可以定向到同一應用伺服器上。
所以LVS支援2中模式
- PPC:持續埠連線,將來自同一客戶端對同一服務定向到同一應用伺服器上
- PCC:持續客戶端連線,將來自同一客戶端對所有服務定向到同一應用伺服器上
- PNMPP:持久防火牆標記連線
LVS會在自己的記憶體緩衝區內維護一個持久連線表,每一個客戶端以及為其分配的應用伺服器都有一個對應關係,前提是沒有會話沒有超時。LVS本身有檢視持久連線的命令。
Ipvsadm –L –persistent-conn # 顯示持久連線
ipvsadm –L –c # 顯示持久連線表
對於LVS來說啟用持久連線就是在建立叢集服務的時候制定-P引數,也就超時時長,預設300秒。
Ipvsadm –A|E…… -P
在基於SSL的會話中,通常都會用到持久連線,因為在建立連線的時候雙發需要進行認證、加密等等,如果會話不能維持,那就會出現一重新整理就去協商,這樣很浪費資源而且效率低下。
設定預設持久連線
我們測算持久連線,我們先把演算法改成RR,這樣是輪訓的,比較好看出效果:
這樣瀏覽器沒重新整理一次就會變換一次WEB服務
設定持久連線,使用-p引數的預設值,預設是360秒,這樣在360秒內,怎麼重新整理都是同一個應用伺服器。即便是同一主機的不同瀏覽器也是一樣。
因為同一主機都定向到同一伺服器,所以它的非活動連結就比較大。
設定同一主機發起的不同服務請求持久連線(PPC模式,同埠保持持久)
我們這裡使用WEB和TELNET,80埠目前就有,然後我們在應用伺服器上啟動TELNET服務,也就是23號埠。
在Linux上是不允許root賬號TELNET上來的,所以要測試Telnet連線需要單獨建立賬號,就是普通的賬號就行。
在2臺應用伺服器上都進行安裝:
啟動服務
在每臺應用伺服器上建立一個使用者,過程略。測試TELNET如下:
再建立一個叢集服務針對23號埠,如下:
連線測試,開啟2個終端
這時候TELENT都定向到同一伺服器,雖然開啟了不同的終端。下面我們同時在訪問以下WEB,如下
可以看到,這就是PPC模式,也就是同一主機的訪問不同服務,都定位到相同主機上。在超時時長內,你訪問80埠永遠都會是定向到同一主機,訪問23也一樣,不同服務定的主機可能會不相同,但是同一服務定向的主機肯定相同。
如果要實現不管是否是相同服務,只要是來自同一主機的,在超時時長內都定向到同一應用伺服器,這就是PCC模式。
設定同一主機發起的不同服務請求持久連線(PCC模式,同客戶端保持持久)
PCC模式的原理就是,無論使用者請求哪個服務埠,都向應用伺服器轉發,說白了就是它只看客戶端IP,不看客戶端訪問埠,只要IP是同一個,就向之前選定的應用伺服器轉發,如果它請求的埠在應用伺服器上沒有,那就報錯了,這個報錯就是找不到服務,也並不是說嚴重的錯誤。
我們使用ipvsadm –C清除所有叢集服務,然後重新建立。
我們看到埠設定的是0,其實就是意味著所有埠,當你設定埠是0的時候,就必須制定-p引數。其實是否是PCC還是PPC模式關鍵就是看叢集服務設定的是0埠還是特定埠。我們再來測試一下:
這時候我們看到無論只要第一次訪問定位到一個主機,那麼在超時時長內,無論放訪問什麼服務都會定向到同一主機。
PCC可以把同一主機的不同服務都定向到同一應用伺服器,但是這要允許所有埠請求,如果我想實現指定的某幾個埠服務而不是全部埠,那該如何實現?那就只能是把不同埠繫結到同一叢集服務,這就要用防火牆標記功能。
設定指定埠的來自同一主機定向到同一應用伺服器(PNMPP,持久防火牆標記)
在防火牆的PREROUTING鏈上定義埠標記,比如把80、23等等都設定為同一個標記,然後在叢集服務上很對標記來做。
如何定義標記呢?清空現有額IPVS規則:
設定防火牆的PREROUTING規則:
意思是 –t 指定為mangle表;-A 新增在PREROUTING鏈上(剛進入的時候就需要打標記,這是IPTABLES的4個鏈條中的第一個);-d 目標地址(VIP);-I eth0 設定流入網路卡,也可以不設定;-p tcp設定為TCP協議;--dport 80是指定80埠;-j MARK 打標記;--set-mark 10標記號為10(任何一個沒有被佔用的)。
建立叢集服務
注意我這裡還沒有設定持久連線,因為沒有加-p引數。-f 10是指定防火牆標記為10的,這個在上面IPTABLES中已經配置了。
新增應用伺服器
配置好以後,你可以透過80訪問網頁,也可以透過TELNET登入。如果要用持久連線,就直接加-p引數。這裡我修改一下,還是防火牆標記10,這裡設定了持久連線時長-p,預設360秒。
訪問測試:130就是WEB2
注意:在生產環境中80一般和443繫結一起,所以就用防火牆標記。 雖然使用持久連線會破壞負載均衡,但是對於WEB這種服務尤其是電商、論壇、部落格、微博等等網站必須使用,否則會話就中斷了。
總結
雖然LVS可以做持久連線但是通常我們也不這樣來做,一般都是用快取伺服器來儲存使用者的會話。下面用一個非常簡單結構來說明
上面是一個論壇架構,透過LVS做負載均衡,同時為了不增加LVS的負擔不開啟連線持久化功能,但是為了保證使用者會話的一致性,使用了Memcached快取伺服器,PHP可以將使用者的會話資訊儲存在Memcached伺服器上,無論有多少WEB前端伺服器,都可以去Memcached伺服器上去獲取使用者會話資訊。這樣就實現了會話的一致和共享。Memcached本身不是服務,它是一個程式設計API。
因為是多個WEB前端伺服器,網站更新頁面是正常的,為了批次快速更新頁面檔案,就需要一種檔案同步機制,因為這些頁面檔案都儲存在WEB伺服器本地,所以就使用Sersync(C/S結構)來完成,WEB伺服器安裝客戶端,當它們收到inotify通知以後就去伺服器上拉取檔案進行更新。
使用者上傳的附件這些事不能儲存在資料庫上的,所以使用檔案伺服器來存放。
對於電商網站來說,80和443繫結在一起,因為付款的時候都會用到443安全連線上。但是雖然80和433都頁面,但是他們是不同服務,所以還要用LVS持久連線,無論是否用了會話共享,如果付款的時候可以把這些資訊抽取出來轉移到一個新的服務上去,而不是WEB服務,那就是另外一回事。上面這種場景如果用443,那麼所有WEB伺服器都要繫結證照,他們使用同一個證照就行,因為對外域名一樣。
小作業:在WEB伺服器上開啟80和433服務,然後使用持久連線方式保持回話。