1. 程式人生 > 其它 >lvs中的持久連線詳解

lvs中的持久連線詳解

目錄

一.簡介

什麼是持久連線?
Lvs是負載均衡,後端會有多個真實提供服務的機器,當一個使用者訪問時,需要將這個使用者的請求持續的分配到一臺機器上,而不是在多臺機器上輪詢。

於電子商務網站來說,使用者在挑選商品的時候使用的是http:80埠來瀏覽的,當付款的時候則是通過https:443埠加密的方式;我們不希望http:80挑選商品的資訊在Real Server1,而https:443商品付款的時候跳轉到另外一臺Real Server2;並且https:443需要交換SSL金鑰,當啟用永續性連線時,只需要做一次驗證即可。

session方式:
session繫結(session sticky)
始終將同一個請求者的請求傳送到同一臺RS(第一次請求由演算法排程)
缺陷:沒有容錯能力,若此RS宕機,則會話丟失,並且將同一請求傳送到同一RS有損均衡效果。

session複製(session cluster)
在RS之間同步session,因此每個RS都保持叢集中的所有session
缺陷:增加了RS的負擔,對大規模的叢集不適用

session伺服器(session server),redis:
用單獨一組伺服器來管理session

持久連線方式:
後端RS可以使用redis等方式共享session,來識別客戶端。
使用輪詢演算法中的SH演算法。
Lvs自帶持久連線選項,可以將同ip的請求分配到同後端RS。

Lvs持久連線:
ipvs內有一個LVS持久連線模板,模板中記錄了每一個請求的來源、排程至的Real Server、維護時長等等,在新的請求進入時,首先在此模板中檢查是否有記錄(有內建的時間限制,比如限制是300秒,當在到達300秒時依然有使用者訪問,那麼持久連線模板就會將時間增加兩分鐘,再計數,依次類推,每次只延長2分鐘)。

如果該記錄未超時,則使用該記錄所指向的Real Server,如果是超時記錄或者是新請求,則會根據排程演算法先排程至特定RS,再將排程的記錄新增至此表中。這並不與SH演算法衝突,LVS持久連線會在新請求達到時,檢查後端Real Server的負載狀況,這就是比較精細的排程和會話保持方法

持續時間:
把同一個client發來請求到同一臺Real Server的持久超時時間,預設300秒

二.型別

PPC

persistent port connections。持久的埠連線,將來自於同一個客戶端對同一個服務(埠)的請求,始終定向至此前選定的RS。

例如,來自同一個IP的使用者第一次訪問叢集的80埠分配到Real Server1,433號埠分配到Real Server2。當之後這個使用者繼續訪問80埠仍然分配到Real Server1,433號埠仍然分配到Real Server2。

配置:
Director加上-p timeout選項即可
ipvsadm -A -t 192.168.1.100:80 -s wrr–p 300

PCC

persistent client connections。將來自於同一個客戶端的所有請求統統定向至此前選定的RS;也就是隻要IP相同,分配的伺服器始終相同。

例如,來自同一個IP的使用者訪問叢集的80埠分配到Real Server1,然後使用者訪問433號埠仍然分配到Real Server1。但如需要SSH:22連線管理Director時,也被分配到Real Server就不好了,下面的PNMPP可以解決這個問題。

配置:
配置Director時使用0號埠,加上-p timeout選項,這樣把所有埠統統定義為叢集服務,全部向Real Server轉發
ipvsadm -A -t 192.168.1.100:0 -s wrr–p 300
ipvsadm -a -t 192.168.1.100:0 -r 192.168.1.102 -g -w 1
ipvsadm -a -t 192.168.1.100:0 -r 192.168.1.103 -g -w 3

PNMPP

Persistent Netfilter Marked Packet Persistence。基於防火牆標記的永續性連線,這種防火牆標記僅在資料包在分發器上時有影響,資料包一旦離開Director,就不再被標記。

需要用到iptables的mangle表為資料包設定Mark標記,mangle表主要用於修改資料包的TOS(Type Of Service,服務型別)、TTL(Time To Live,生存週期)指以及為資料包設定Mark標記。

它可以將兩個毫不相干的埠定義為一個叢集服務,例如:合併http的80埠和https的443埠定義為同一個叢集服務,而不會出現上面PCC據說的問題。

配置:
配置Director時先配置iptables的mangle表為資料包設定Mark標記,下面設定80和22(SSH)埠的資料包都加上標記10,然後ipvs配置就可用-f mask選項,將兩個毫不相干的埠定義為一個叢集服務
iptables -t mangle -A PREROUTING -d 192.168.1.100 -i eth0 -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -d 192.168.1.100 -i eth0 -p tcp --dport 22 -j MARK --set-mark 10
ipvsadm -A -f 10 -s wrr -p 600
ipvsadm -a -f 10 -r 192.168.1.102 -g -w 1
ipvsadm -a -f 10 -r 192.168.1.103 -g -w 3

本文版權歸作者所有,歡迎轉載,請務必新增原文連結。