LVS學習筆記

1、LVS(linux virtual server)定義html

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。前端

 

2、相關概念linux

1 cluster(集羣)nginx

爲了解決某個特定的問題,將多臺計算機組合起來,造成的單一系統。redis

隨着互聯網的發展,爲了知足高併發的要求,系統須要不斷的擴展。擴展的方式主要有兩種,scale up(向上擴展,增長配置)、scale out(向外擴展,增長設備)。集羣屬於scale out。算法

 

2 負載均衡LB(load balance)windows

 嚴格來講,負載平衡(Load balancing)是一種計算機網絡技術,用來在多個計算機(計算機集羣)、網絡鏈接、CPU、磁盤驅動器或其餘資源中分配負載,以達到最佳化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的,使用帶有負載平衡的多個服務器組件,取代單一的組件,能夠經過冗餘提升可靠性。負載平衡服務一般是由專用軟體和硬件來完成。後端

 

3 高可用HA(heigh availiablity)centos

高可用集羣就是當某一個節點或服務器發生故障時,另外一個節點可以自動且當即向外提供服務,即將有故障節點上的資源轉移到另外一個節點上去,這樣另外一個節點有了資源既能夠向外提供服務。高可用集羣是用於單個節點發 生故障時,可以自動將資源、服務進行切換,這樣能夠保證服務一直在線。在這個過程當中,對於客戶端來講是透明的。緩存

MTBF 平均無端障時間

MTTR平均恢復前時間

高可用集羣的衡量標準

高可用集羣通常是經過系統的可靠性(reliability)和系統 的可維護性(maintainability)來衡量的。一般用平均無端障時間(MTTF)來衡量系統的可靠性,用平均維護 時間(MTTR)來衡量系統的可維護性。所以,一個高可用集羣服務能夠這樣來定義:HA=MTTF/(MTTF+MTTR)*100%。

通常高可用集羣的標準有以下幾種:

99%:表示 一年宕機時間不超過4天

99.9% :表示一年宕機時間不超過10小時

99.99%: 表示一年宕機時間不超過1小時

99.999% :表示一年宕機時間不超過6分鐘

 

4 HPC高性能((High Performance Computing)

構建高性能計算系統的主要目的就是提升運算速度。

 

5 其餘

分佈式:一個任務分給多臺機器去作,減小單個任務的執行時間。

集羣:提升單位時間內執行任務數。

SPOF 單點失敗

keepalive 與lvs搭配,解決單點失敗問題

 

3、cluster分類

1 硬件

F五、big-ip

2 軟件

lvs、nginx、haproxy

lvs工做在傳輸層及如下,nginx、haproxy能夠工做在應用層。

 

 


 

思考一個問題

如上圖,A、B爲client,一、二、3分別爲負載均衡集羣中的真實服務器,當A第一次訪問時被調度到真實服務器1,A的登陸信息記錄在1上,若是A再次訪問被調度到2,2上沒有A的登陸信息,A須要從新登陸。如何解決?

方法1:

能夠經過調度算法,把來自同一個IP的請求調度到同一臺後端真實服務器。

方法2:

session綁定(session是啥,參考https://blog.csdn.net/xueqinna/article/details/51628984)

後端真實服務器將cookie信息發送到client上,client請求中攜帶cookie信息,lvs檢測到cookie信息,調度。

方法3:

session同步

在真實服務器一、二、3上同步session信息,或是用專有的session服務器,如redis。

 


 

 

4、LVS集羣中的術語

VS

virtual server  director server dispatcher(調度器) load balancer

RS

real server    upstream server(nginx) 上游服務器  backed server (haproxy)後端服務器

CIP

client ip

VIP

virtual server ip

DIP

director ip VS服務器用於內網鏈接的ip

RIP

real server ip

 

5、LVS原理

1 LVS原理-內核模型

**此處能夠了解一下iptable的原理**    地址 https://blog.csdn.net/sinat_36888624/article/details/78733484

LVS由工做在用戶空間(user space)的ipvsadm和工做在內核空間(kenel space)的ipvs組成。ipvsadm用來定義規則,ipvs工做在內核空間的input鏈上,當數據到達input鏈時,首先被ipvs檢測,若是數據包中的目的ip及端口沒有在規則中,則數據包會被放行到用戶空間。反之,數據包將會被修改目的地址(按照規則),並直接發往postrouting鏈,最後經由postrouting鏈發日後端服務器。以下圖所示。

  

 

2 LVS原理-lvs的包轉發模型

lvs-nat

lvs-dr(最經常使用,也是默認模型)

lvs-tun

lvs-fullnat

重點掌握lvs-nat、lvs-dr,另外兩種只作瞭解便可。

 

lvs-nat

 

1 客戶端將請求發往lvs服務器,源ip爲cip,目的ip爲vip。

2 lvs服務器收到報文後,發現目的地址爲規則中存在的地址,按照規則修改目的ip爲後端的rip,並按照調度算法轉發出去。

3 rs收到報文後,發現目的地址爲自身地址,響應請求並將響應返還給lvs服務器。

4 lvs服務器將報文的源ip改成自身ip(vip),發給客戶端。lvs服務器與real server之間的連接若是使用交換機,rs的網關應爲dip。

 

lvs-dr

1 client 發送請求給lvs。

2 lvs收到請求報文,發現目的地址爲規則中的地址,按照規則修改源mac爲dmac,目的mac爲rmac,按照調度算法轉發給後端服務器。

3 rs收到道文,發現mac地址爲自身mac,處理後響應請求,將報文直接發給client。

**dr模式不支持端口映射**

 

lvs-tun(隧道模式)--適合跨異地機房

|dip rip|cip vip|tcp|http|data|

原理詳情:
1.客戶請求數據包,目標地址VIP(調度器的IP地址)發送到調度器上
2.調度器接收到客戶請求包,進行IP Tunnel封裝,在原有的包頭加上IP Tunnel的包頭,而後發送給服務器
3.服務器根據IP Tunnel包頭信息(此時就又一種邏輯上的隱形隧道,只有調度器和服務器之間懂)收到請求包,而後解開IP Tunnel包頭信息,獲得客戶的請求包並進行響應處理
4.響應處理完畢以後,服務器使用本身的出公網的線路,將這個響應數據包發送給客戶端,源IP地址仍是VIP地址
**可參考  https://blog.csdn.net/ying_smile/article/details/81628176 **

 

lvs-fullnat(內核未集成)

lvs在轉發數據包是,同事修改源ip及目的ip

**可參考  https://blog.csdn.net/letter_a/article/details/81324767**

 

  vs/nat vs/tun vs/dr
server any tunneling non-arp device
server network private lan/wan lan
server number low(10-20) high(100) high(100)
server gateway load balance own router own router

 

3 lvs-調度算法

lpvs scheduler,根據是否考慮後端服務器的負載狀態,能夠分爲兩類。

靜態算法:

1 RR(round robin) 輪詢。

2 WRR(weighted RR)加權輪詢。

3 SH (source hash) 對源地址作hash運算,將值存放到lvs中,相同的ip調度到同一臺real server。

4 DH(destination hash) 當目的地址相同時,調度到同一臺real server。經常使用於正向代理服務器。例如緩存服務器。

動態算法:

1 LC (least connections)最少鏈接。

overhead=activeconns*256+inactiveconns

2 WLC 加權LC (系統默認的調度算法)

overhead=(activeconns*265+inactiveconns)/weight

3 SED(shortest expection delay)  WLC在系統剛開始工做時,鏈接爲0,系統沒法選擇分配對象,針對這個問題,SED遵循高權重優先。

overhead=(activeconns+1)256/weight

4 NQ (nerver queue)第一輪平均分配,後續遵循SED。

5 LBLC 動態的DH算法,根據負載狀態實現正向代理。

6 LBLCR 解決LBLC負載不均衡問題。

**DH LBLC LBLCR多爲寬帶運營商使用**

 

六 lvs-實驗

1 相關命令

ipvsadm -A|E -t|u|f service -S scheduler

ipvsadm -a|e -t|u|f service -r realserver -g(dr)|m(nat)|i(tun) -w

ipvsadm -C  //清除規則

ipvsadm -Ln 查看

      -- numberic,-n //以數字的形式輸出端口號和地址

      --exact //擴展信息,精確值。

      --connection,-c //當前lvs鏈接輸出

      --stats //統計信息

      --rate //輸出速率信息

相關文件

ipvs規則 /proc/net/ip_vs

ipvs鏈接 /proc/net/ip_vs_conn

保存

ipvsadm -Sn > /etc/sysconfig/ipvsadm   //將ipvs規則保存到文件中

ipvsadm -restore < /etc/sysconfig/ipvsadm //讀取文件中的規則

正常狀況下,每次重啓服務,規則都會清除

在/usr/lib/systemd/system/ipvsadm.service中定義了服務啓動和中止時讀取和保存ipvs規則的方式。

      

2 實驗-nat

 

1 client爲物理機,windows系統。lvs服務器及rs服務器爲虛擬機centos7.2系統。

2 虛擬機網卡均爲橋接,按照規劃圖設置好ip,關閉防火牆及selinux。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ip配置完成後,發現rs能夠ping通10.10.23.177,可是沒法ping通10.10.23.88。分析發現緣由爲client上沒有到30段的路由,在10.10.23.88上添加30段的路由(10.10.23.177)後解決,在實際工做中,並不須要此配置。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3 配置路由轉發。ip_forward

路由轉發:當主機擁有多塊網卡時,期中一塊網卡收到數據包,根據目的ip將數據包發往本機的另外一塊網卡,該網卡根據路由表發送數據包。這一般是路由器所要實現的功能。

處於安全考慮,linux系統默認是禁止數據包轉發的。

實驗過程當中,若是關閉ip_forward,client沒法ping通rs.

開啓路由轉發的方法:

方法一:echo 1 > /proc/sys/ipv4/ip_forward

方法二:vi /etc/sysctl.conf

  修改 net.ipv4.ip_forward = 1 //默認爲0

sysctl -p //查看修改結果

或者經過 sysclt -a |grep ip_forward

4 rs一、rs2安裝nginx,配置站點。index.html 內容分別爲本機ip。

5 ipvsadm規則配置

ipvsadm -A -t 10.10.23.177:80 -S rr

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.100:80 -m

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.102:80 -m

6 在client上 調用cmd窗口

curl 10.10.23.177

返回結果爲: 10.10.30.100(第一次訪問)  10.10.30.102(第二次訪問)

7 查看rs上nginx的訪問日誌 access.log 發現客戶端ip爲 cip.

 

2 實驗-dr

1 實際十堰過程當中,路由器用虛擬機代替,兩塊網卡配置路由轉發ip_forward。

2 vip與rip不一樣網段,而且經過各自網關鏈接「外網」。爲了讓lvs與rs之間通訊,啓用dip。

3 rs上要匹配dip和vip(理論上vip配置在lo上或與rip同一塊網卡均可以,但實際實驗過程當中配置在lo上遇到問題,最終配置到rip的網卡上)。

爲了不ip衝突,須要在rs修改內核參數,限制arp響應和經過級別,arp_ignore及arp_annouce。

在rs1上

ip a a 10.10.23.177/24 dev eno16777736 //添加ip地址到網卡

echo 1  > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/eno16777736/arp_annouce

在rs2上

ip a a 10.10.23.177/24 dev eno16777736 //添加ip地址到網卡

echo 1  > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/eno16777736/arp_annouce

---------------------------------------------------------

arp_ignore 

0:響應任意網卡上接收到的對本機IP地址的arp請求(包括環回網卡上的地址),而無論該目的IP是否在接收網卡上。
1:只響應目的IP地址爲接收網卡上的本地地址的arp請求。
2:只響應目的IP地址爲接收網卡上的本地地址的arp請求,而且arp請求的源IP必須和接收網卡同網段。
3:若是ARP請求數據包所請求的IP地址對應的本地地址其做用域(scope)爲主機(host),則不迴應ARP響應數據包,若是做用域爲全局(global)或鏈路(link),則迴應ARP響應數據包。
4~7:保留未使用
8:不迴應全部的arp請求

arp_annouce

0:容許使用任意網卡上的IP地址做爲arp請求的源IP,一般就是使用數據包a的源IP。
1:儘可能避免使用不屬於該發送網卡子網的本地地址做爲發送arp請求的源IP地址。
2:忽略IP數據包的源IP地址,選擇該發送網卡上最合適的本地地址做爲arp請求的源IP地址。
 
思考問題:實驗中遇到的client上10.10.23.177的arp信息錯誤問題,是否與「1:只響應目的IP地址爲接收網卡上的本地地址的arp請求。」有關。
--------------------------------------------------------------

 

4 lvs規則配置

yum install ipvsadm -y

ipvsadm -A -t 10.10.23.177:80 -S rr

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.100 -g

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.102 -g

5 在client上訪問站點,測試結果。

curl 10.10.23.177

 

---------------------------------------------------

此實驗中避免ip衝突的幾種方法:

1 在前端網關上作靜態綁定。

2 在rs上使用arptables工具。

3 在rs上修改內核參數以限制arp通告及應答級別。

 

 

參考地址**https://mp.weixin.qq.com/s/0c6c738zrZIwcCEJKjlMNA**

相關文章
相關標籤/搜索