LVS(Linux virual server)
系統性能擴展方式
Scale UP:增強單臺服務器性能,適合單體應用,但有硬件限制。
Scale Out:增加服務器數量,適合分布式和集群系統,可靈活擴展。
集群(Cluster)
定義:多臺計算機組合成一個系統,解決特定問題。
類型
- LB(負載均衡):多主機分擔訪問請求,提高并發處理能力。
- HA(高可用):避免單點故障,用MTBF(平均無故障時間)和MTTR(平均恢復時間)衡量可用性,目標是達到高可用性(如99.9%)。
- HPC(高性能計算):用于大規模計算任務,是國家戰略資源。
分布式
定義:將業務拆分成多個子業務,部署在多臺服務器上。
應用
- 分布式存儲:如Ceph、GlusterFs、FastDFS等。
- 分布式計算:如Hadoop、Spark。
- 分布式應用:服務拆分、靜態資源分布、分布式數據存儲等。
集群和分布式對比
集群:多臺服務器運行相同業務,功能和數據一致,通過負載均衡和冗余提高并發和可靠性。
分布式:多臺服務器運行不同子業務,功能和數據不同,通過并行處理縮短任務執行時間,提升效率。
總結
集群:適合高并發、高可用場景,通過增加服務器數量提升性能。
分布式:適合大規模數據處理和復雜業務,通過任務拆分和并行處理提升效率。
LVS概念
概念名 | 概念 | |
---|---|---|
VS | Virtual Server 虛擬服務器 | 負責調度 |
RS | Real Server 真實服務器 | 負責真正提供服務 |
Client | Client 客戶端 | 客戶大大 |
VIP | Virtual server IP VS外網的IP | \ |
RIP | Real server IP RS的IP | \ |
DIP | Director IP VS內網的IP | \ |
CIP | Client IP 客戶端的IP | \ |
訪問流程:CIP <–> VIP == DIP <–> RIP
工作原理: VS根據請求報文的目標IP和目標協議及端口將其調度轉發至某RS,根據調度算法來挑選RS
ipvsadm命令
參數 | 描述 |
---|---|
-A | 添加一個新的虛擬服務器 |
-E | 編輯現有的虛擬服務器 |
-D | 刪除一個虛擬服務器 |
-C | 清除所有虛擬服務器配置 |
-L | 顯示虛擬服務器的詳細信息 |
-a | 向虛擬服務器添加一個真實服務器 |
-d | 從虛擬服務器中刪除一個真實服務器 |
-n | 以數字形式顯示 IP 地址和服務端口,不進行解析 |
-s | 指定調度算法,默認WLC |
-f | 指定防火墻標簽 |
-w | 指定權重 |
-p | 設置持久連接超時 |
-t | tcp服務 |
-u | udp服務 |
備份與還原
命令 | 描述 |
---|---|
ipvsadm-save > /你的規則文件要保存去哪 | 備份 |
ipvsadm-restore < /你的規則文件 | 還原 |
參數和對應模式
參數 | |
---|---|
-g | DR模式(直連路由模式) |
-m | NAT模式 |
-i | TUN模式(ipip隧道模式) |
集群的類型
類型 | 解釋 | 參數 |
---|---|---|
lvs-nat | 修改請求報文的目標IP,多目標IP的DNAT | -m |
lvs-dr | 操縱封裝新的MAC地址 | -g |
lvs-tun | 在原請求IP報文之外新加一個IP首部 | -i |
lvs-fullnat | 修改請求報文的源和目標IP | / |
NAT
原理
IVS-NAT 原理:修改請求數據包的目標地址(RIP)和端口(PORT)到選定的真實服務器(RS)的地址和端口。
- 網絡要求:RIP和DIP(Director IP)應在同一個網絡,使用私有地址;RS的網關應指向DIP。
- 轉發要求:請求和響應數據包都必須通過Director(負載均衡器)轉發,這可能導致Director成為瓶頸。
- 端口映射:支持修改請求數據包的目標端口。
- 系統兼容性:Director必須是Linux系統,RS可以是任何操作系統。
[!CAUTION]
注意:這里我們就省略了路由器
實驗
主機 | IP—Port | 網絡模式 | |
---|---|---|---|
Client | 172.25.254.111—eth0 | CIP | NAT |
LVS | 172.25.254.100—eth0 192.168.0.100—eth0 | VIP | 僅主機 |
RS1 | 192.168.0.10—eth0 | RIP | 僅主機 |
RS2 | 192.168.0.20—eth0 | RIP | 僅主機 |
[!NOTE]
網絡配置方面省略,直接開始LVS的配置
在LVS上配置
[root@LVS ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
當我們配置完上面這三條命令后,我們可以用以下命令進行查看是否配置正確
ipvsadm -Ln
在客戶端上初嘗試
[root@client ~]# curl 192.168.0.10
RS1 - 192.168.0.10
[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done;
我們可以看到客戶端卡住了訪問不了,可以看到上面的LVS顯示20的RS服務器收到了數據包,ActiveConn為1了
所以是RS那邊出了問題,而不是LVS的問題
我們可以看到我們之前用腳本配置的網關是錯誤的,所以我們需要重新修改網關的配置
修改網關配置
#在RS1中
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.10/24,192.168.0.100 #改這里
dns=8.8.8.8[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0#在RS2中
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.20/24,192.168.0.100 #改這里
dns=8.8.8.8[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0
重新加載網絡配置
lvs上需要開啟內核的IP轉發功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
測試訪問
我們可以看到流量已經可以正常由lvs通過rr算法進行輪詢分發
DR
原理
- 客戶端發送數據幀給vs調度主機幀中內容為客戶端IP+客戶端的MAC+VIP+VIP的MAC
- VS調度主機接收到數據幀后把幀中的VIP的MAC該為RS1的MAC,此時幀中的數據為客戶端IP+客戶端 的MAC+VIP+RS1的MAC
- RS1得到2中的數據包做出響應回傳數據包,數據包中的內容為VIP+RS1的MAC+客戶端IP+客戶端IP的 MAC
特點
- Director和各RS都配置有VIP
- 確保前端路由器將目標IP為VIP的請求報文發往Director
- 在前端網關做靜態綁定VIP和Director的MAC地址
實驗
主機 | IP—Port | 網絡模式 | |
---|---|---|---|
Client | 172.25.254.111—eth0 | CIP | NAT |
Router | 172.25.254.100—eth0 192.168.0.100—eth1 | NAT 僅主機 | |
LVS | 192.168.0.200—eth0 192.168.0.220—eth0 | DIP VIP | 僅主機 |
RS1 | 192.168.0.220—lo 192.168.0.10—eth0 | VIP RIP | 僅主機 |
RS2 | 192.168.0.220—lo 192.168.0.20—eth0 | VIP RIP | 僅主機 |
Client
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.254.100 0.0.0.0 UG 100 0 0 eth0
172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
Router
#開機啟動
[root@Router ~]# systemctl enable --now firewalld.service
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.#啟用火墻的偽裝(NAT,網絡地址轉換)功能
[root@Router ~]# firewall-cmd --add-masquerade
success
[root@Router ~]# firewall-cmd --reload
success
DRlvs
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.100
address2=192.168.0.220/24route -n
#DRlvs的網關可以寫可以不寫 都可以
[root@DRlvs ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@DRlvs ~]# dnf install ipvsadm-1.31-6.el9.x86_64 -y
#開機啟動
[root@DRlvs ~]# systemctl enable --now ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.[root@DRlvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10:80 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20:80 -g
[root@DRlvs ~]# 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.0.220:80 rr-> 192.168.0.10:80 Route 1 0 0-> 192.168.0.20:80 Route 1 0 0
RS1
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32 #添加RS1的VIP[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
#查看當前系統中所有與 ARP相關的內核參數配置
[root@RS1 ~]# sysctl -a | grep arp#設置rs主機lo接口不對外響應
#注意需要先設置全局內核參數配置再設置對應接口的內核參數配置
[root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf#刷新剛剛配置的內核參數,同時檢查是否更改成功
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
RS2
[root@RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS2 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32 #添加VIP[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up lo
[root@RS2 ~]# echo net.ipv4.conf.all.arp_ignore=1 >> /etc/sysctl.conf
[root@RS2 ~]# echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
[root@RS2 ~]# echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
[root@RS2 ~]# echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf
[root@RS2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
檢驗
主機上的網卡MAC地址
主機與網卡設備 |
---|
router: eth0: 00:0c:29:ca:24:99 eth1: 00:0c:29:ca:24:a3 |
lvs: eth0: 00:0c:29:b1:18:8c |
RS1: eth0: 00:0c:29:6c:51:af |
RS2: eth0: 00:0c:29:1c:94:31 |
我們可以通過抓包來查看整個流程
WireShark抓包
1.客戶端發送出請求來到路由器給到lvs的Director
①
客戶端發送訪問來到路由器111
對應端口eth1的MAC地址24:a3然后路由器給到lvs的Director
對應端口eth0的MAC地址18:8c
2.Director收到請求后分發給RS1
②
Director收到請求后分發給RS1,這里顯示的還是VIP220
但是我們仔細看MAC地址可以看出是RS1
現在包里攜帶的是
CIP VIP(RS)
CMAC RIPMAC
3.RS1回包跳過lvs發給路由器
③
RS1回包跳過Director直接來到路由器
所以現在包里攜帶的是
VIP CIP
RMAC CMAC
4.還原了MAC地址
最后這里
可以理解為
回包到這一步時,顯示源MAC是router的MAC,目標MAC是lvs的Director的MAC
但是還有后面一步是變成了
源MAC是lvs的Director的MAC,目標的MAC是router的MAC
注意:這一步防止RS服務器的MAC的泄露,所以有RMAC轉換為DMAC
再下一步就是
路由器發往客戶端
思考
1.為什么lvs上要有DIP?只在Director上配置一個VIP不可以嗎?
MAC地址轉換:在DR模式下,LVS通過修改請求數據包的MAC地址來實現轉發,而不是修改IP地址。Director將請求數據包的源MAC地址改為自己的DIP對應的MAC地址,目標MAC地址改為選定的Real Server(RS)的MAC地址。這樣,數據包會被發送到正確的RS。網絡隔離:DIP用于在Director內部網絡中標識負載均衡器,確保內部網絡通信不會與外部網絡混淆。DIP通常配置在Director的內部網絡接口上,用于與RS通信。ARP響應:Director需要能夠響應ARP請求,以便在網絡中正確地解析VIP到MAC地址。如果只配置VIP,Director可能無法正確地參與ARP過程,從而影響數據包的轉發。安全性:通過配置DIP,可以限制Director的網絡暴露,增強系統的安全性。
2.在RS上配置的arp_ignore=1和arp_arp_announce=2有什么作用?
arp_ignore=1:
防止RS響應那些目標硬件地址不是自己的ARP請求。這樣可以避免RS的IP地址被其他設備錯誤地解析到錯誤的MAC地址,從而防止ARP欺騙攻擊。
通俗的說,我的理解是
防止了RS暴露自己的MAC地址,只會響應lvs發來的請求,防止客戶端直接訪問RS。arp_announce=2:
防止RS發送可能引起網絡混亂的ARP響應。當RS接收到一個ARP請求,請求的源IP和目標IP都在RS的IP列表中時,RS不會發送ARP響應。這可以避免RS在DR模式下發送不必要的ARP響應,從而減少網絡中的ARP流量和潛在的ARP沖突。
通俗的說,我的理解是
只響應本機所有網絡接口的溝通(e.g. lo與eth0就可以溝通),不會響應外面的網絡接口和溝通
TUN
轉發方式
不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原IP報文之外再封裝一個IP首部 (源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP 是CIP)
- 客戶端發送請求數據包,包內有源IP+vip+dport
- 到達vs調度器后對客戶端發送過來的數據包重新封裝添加IP報文頭,新添加的IP報文頭中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并發送到RS1
- RS收到VS調度器發送過來的數據包做出響應,生成的響應報文中包含SRCIP(VIP)+DSTIP(CIP) +port,響應數據包通過網絡直接回傳給client
特點
- DIP, VIP, RIP都應該是公網地址
- RS的網關一般不能指向DIP
- 請求報文要經由Director,但響應不能經由Director
- 不支持端口映射 5.RS的OS須支持隧道功能
fullnat
fullnat:通過同時修改請求報文的源IP地址和目標IP地址進行轉發
CIP --> DIP VIP --> RIP
- VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP
- RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client
- 請求和響應報文都經由Director
- 支持端口映射
[!WARNING]
注意:此類型kernel默認不支持
LVS工作模式總結
NAT模式 | TUN模式 | DR模式 | |
---|---|---|---|
RS操作系統 | 不限 | 支持隧道 | 禁用ARP |
調度器和服務器網絡 | 可跨網絡 | 可跨網絡 | 不可跨網絡 |
調度服務器數量服務器數量 | 少 | 多 | 多 |
RS服務器網關 | 指向到調度器DIP | 指向到路由 | 指向到路由 |
- Ivs-nat與lvs-fullnat:請求和響應報文都經由Director
- Ivs-nat:RIP的網關要指向DIP
- Ivs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信
- Ivs-dr與lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client
- Ivs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發
- Ivs-tun:通過在原IP報文外封裝新IP頭實現轉發,支持遠距離通信
LVS調度算法
靜態算法
靜態算法 | 描述 |
---|---|
RR | roundrobin輪詢RS分別被調度,當RS配置有差別時不推薦 |
WRR | WeightedRR,加權輪詢根據RS的配置進行加權調度,性能差的RS被調度的次數少 |
SH | Source Hashing,實現session sticky,源IP地址hash;將來自于同一個IP地址的請求始終發往 第一次挑中的RS,從而實現會話綁定 |
DH | Destination Hashing;目標地址哈希,第一次輪詢調度至RS,后續將發往同一個目標地址的請 求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,如:寬帶運營商 |
動態算法
動態算法 | 描述 | 調度方法 |
---|---|---|
LC | least connections(最少鏈接發) | 適用于長連接應用Overhead(負載值)=activeconns(活動鏈接數) x 256+inactiveconns(非活動鏈接數) |
WLC | Weighted LC(權重最少鏈接) | 默認調度方法Overhead=(activeconns x 256+inactiveconns)/weight |
SED | Shortest Expection Delay | 初始連接高權重優先Overhead=(activeconns+1+inactiveconns) x 256/weight |
NQ | Never Queue | 第一輪均勻分配,后續SED |
LBLC | Locality-Based LC | 動態的DH算法 |
LBLCR | LBLC with Replication | 帶復制功能的LBLC |
[!NOTE]
SED:當node1的權重為1,node2的權重為10,經過運算前幾次的調度都會被node2承接,注意服務器權重設置的合理性
LBLC:使用場景:根據負載狀態實現正向代理
LBLCR:解決LBLC負載不均衡問題,從負載重的復制 到負載輕的RS
在4.15版本內核以后新增調度算法
1.FO(WeightedFaiOver)調度算法
常用作灰度發布
在此FO算法中,遍歷虛擬服務所關聯的真實服務器鏈表,找到還未過載(未設置IP_VS_DEST_FOVERLOAD標志)的且權重最高的真實服務器,進行調度
當服務器承接大量鏈接,我們可以對此服務器進行過載標記(IP_VS_DEST_FOVERLOAD),那么Vs調度器就不會把鏈接調度到有過載標記的主機中。
2.OVF(Overflow-connection)調度算法
基于真實服務器的活動連接數量和權重值實現。將新連接調度到權重值最高的真實服務器,直到其活動
連接數量超過權重值,之后調度到下一個權重值最高的真實服務器,在此OVF算法中,遍歷虛擬服務相關
聯的真實服務器鏈表,找到權重值最高的可用真實服務器。一個可用的真實服務器需要同時滿足以下條件:
- 未過載(未設置IP_VS_DEST_FOVERLOAD標志)
- 真實服務器當前的活動連接數量小于其權重值
- 其權重值不為零
防火墻標簽解決輪詢錯誤
輪詢規則中可能會遇到的錯誤
以http和https為例,當我們在RS中同時開放80和443端口,那么默認控制是分開輪詢的,這樣我們就出 現了一個輪詢錯亂的問題 當我第一次訪問80被輪詢到RS1后下次訪問443仍然可能會被輪詢到RS1上
火墻標記
在RS1和RS2中安裝mod_ssl
yum install mod_ssl -y
標記前
[root@DRlvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10:80 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20:80 -g
[root@DRlvs ~]# ipvsadm -A -t 192.168.0.220:443 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.10:443 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.20:443 -g
[root@DRlvs ~]# 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.0.220:80 rr-> 192.168.0.10:80 Route 1 0 0-> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.220:443 rr-> 192.168.0.10:443 Route 1 0 0-> 192.168.0.20:443 Route 1 0 0
當訪問vip時兩次調度都到了RS1上,說明80端口和443端口并沒有組合到一起被lvs調度器調配
因為我們設置的是rr輪詢,那么第一次訪問如果是RS1的話,第二次訪問將會分配給RS2
[root@Router ~]# curl -k http://192.168.0.10;curl -k https://192.168.0.10
RS1 - 192.168.0.10
RS1 - 192.168.0.10
這么來看訪問調度都不能滿足rr,80端口和443端口是獨立的,我們需要告訴lvs調度器80端口和443端口要一起調度,所以我們需要火墻標記。
標記后
[!CAUTION]
在此之前務必清除ipvsadm
[root@DRlvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666[root@DRlvs ~]# iptables -t mangle -L -n -v
Chain PREROUTING (policy ACCEPT 6 packets, 432 bytes)pkts bytes target prot opt in out source destination0 0 MARK 6 -- * * 0.0.0.0/0 192.168.0.220 multiport dports 80,443 MARK set 0x29a
......[root@DRlvs ~]# ipvsadm -A -f 666 -s rr
[root@DRlvs ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g
[root@DRlvs ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 666 rr-> 192.168.0.10:0 Route 1 0 0-> 192.168.0.20:0 Route 1 0 0
為什么是mangle表,是因為數據包既不是進也不是出,也不是進入調度器本機,而是對于數據包進行附加的說明
-A添加,PREROUTING在路由之前,進來之前馬上打標記,-d目的地地址VIP -p協議 tcp協議 -m 指定我們標記的是接口(多端口) --dports 目標端口 -j 指定動作做標記 --set-mark 設定標記值
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 666 rr-> 192.168.0.10:0 Route 1 8 0-> 192.168.0.20:0 Route 1 8 0
可以正常輪詢,80端口和443端口也可以組合調配了
lvs持久鏈接
在我們客戶上網過程中有很多情況下需要和服務器進行交互,客戶需要提交響應信息給服務器,如果單純的進行調度會導致客戶填寫的表單丟失,為了解決這個問題我們可以用sh算法,但是sh算法比較簡單 粗暴,可能會導致調度失衡
**解決方案 **
在進行調度時,不管用什么算法,只要相同源過來的數據包我們就把他的訪問記錄在內存中,也就是把這個源的主機調度到了那個RS上 如果在短期(默認360S)內同源再來訪問我仍然按照內存中記錄的調度信息,把這個源的訪問還調度到 同一臺RS上。如果過了比較長的時間(默認最長時間360s)同源訪問再次來訪,那么就會被調度到其他的RS上。
[root@DRlvs ~]# ipvsadm -E -f 666 -s rr -p 300
[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 666 rr persistent 300-> 192.168.0.10:0 Route 1 0 0-> 192.168.0.20:0 Route 1 0 0
在進行調度時,不管用什么算法,只要相同源過來的數據包我們就把他的訪問記錄在內存中,也就是把這個源的主機調度到了那個RS上 如果在短期(默認360S)內同源再來訪問我仍然按照內存中記錄的調度信息,把這個源的訪問還調度到 同一臺RS上。如果過了比較長的時間(默認最長時間360s)同源訪問再次來訪,那么就會被調度到其他的RS上。
[root@DRlvs ~]# ipvsadm -E -f 666 -s rr -p 300
[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 666 rr persistent 300-> 192.168.0.10:0 Route 1 0 0-> 192.168.0.20:0 Route 1 0 0