ipvsadm是用來配置、維護或者查看Linux內核當中virtual server table的一個工具, LVS(Linux virtual server)能基於一個集羣當中的兩個或者多個節點來建立彈性網絡服務, 集羣中的處於激活狀態的節點能將服務請求重定向到一組實際提供服務的主機當中, 提供包括TCP和UDP兩種協議, 三種數據包轉發模式(NAT / tunneling / direct routing), 和八種負載均衡算法(round robin, weighted round robin, least-connection, weighted least-connection, locality-based least-connection, locality-based least-connection with replication, destination-hashing, and source-hashing).linux
ipvsadm提供兩種基本的使用格式, 中括號表示可選, 兩種命令格式分別對應virtual server和real server算法
ipvsadm COMMOND [protocol] service-address [scheduling-method] [persistence options]
複製代碼
或者bash
ipvsadm command [protocol] service-address server-address [packet-forwarding-method] [weight options]
複製代碼
第一種命令格式用於配置虛擬服務(virtual service)和用於分配服務請求到真實服務器的算法, 另一個可選項爲用於持久化服務的持久化超時時間和網絡掩碼.服務器
第二種命令格式用於配置與一個已經存在的虛擬服務器相關聯的真實服務器, 當指定一個真實服務器時, 數據包轉發方式和該真實服務器相對於該虛擬服務器下面的其餘真實服務器的權重須要指定, 不然會採用默認值.網絡
[root@10-10-40-96 ~]# yum instal -y ipvsadm
複製代碼
慣例是大寫表示用於virtual server, 小寫表示用於real server負載均衡
-A, --add-service 添加virtual server, virtual server必須惟一(IP+端口+協議用於區分一個惟一的虛擬服務)
-E, --edit-service 編輯虛擬服務
-D, --delete-service 刪除一個虛擬服務, 包括與之關聯的真實服務器
-C, --clear 清空虛擬服務表
-R, --restore 經過標準輸入恢復虛擬服務表(IPVS table)
-S, --save 以能夠經過-R參數恢復的格式導出虛擬服務表到標準輸出
-a, --add-server 添加一個真實服務器到一個虛擬服務
-e, --edit-server 在一個虛擬服務當中編輯一個真實服務器
-d, --delete-server 從一個虛擬服務當中移除一個真實服務器
-L, -l, --list 列出虛擬服務表, 默認是列出全部虛擬服務表, 若須要列出某服務表, 後面指定服務地址便可
-Z, --zero 清零一個全部服務的數據包 / 字節 / 速率計數器
複製代碼
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
-> 172.16.130.20:7480 Masq 1 0 0
[root@10-10-88-192 ~]#
複製代碼
默認是輸出到標準輸出, 能夠重定向到文本保存, 方便後期再導入工具
[root@10-10-88-192 ~]# ipvsadm -S -n
-A -t 10.10.88.188:7480 -s wlc -p 1800
-a -t 10.10.88.188:7480 -r 172.16.130.20:7480 -m -w 1
[root@10-10-88-192 ~]# ipvsadm -S -n > ipvs_info
[root@10-10-88-192 ~]#
複製代碼
[root@10-10-88-192 ~]# ipvsadm -C
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@10-10-88-192 ~]#
複製代碼
注意: 默認是從標準輸入進行恢復ui
[root@10-10-88-192 ~]# cat ipvs_info | ipvsadm -R
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
-> 172.16.130.20:7480 Masq 1 0 0
[root@10-10-88-192 ~]#
複製代碼
[root@10-10-88-192 ~]# ipvsadm -d -t 10.10.88.188:7480 -r 172.16.130.20:7480
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
[root@10-10-88-192 ~]#
複製代碼
注: 移除real server以後會先將destination(endpoint)移到trash(暫存垃圾桶), 過一段時間再刪除, 若這個期間這個real server又能夠訪問了則會從trash中拿回來繼續用, 具體說明見IPVS源碼註釋
https://elixir.bootlin.com/linux/v3.0/source/net/netfilter/ipvs/ip_vs_ctl.c
, 下面爲打開IPVS debug模式(debug_level=8)後dmesg -Hew
的輸出spa
[Sep26 11:08] IPVS: Enter: ip_vs_del_dest, net/netfilter/ipvs/ip_vs_ctl.c line 1079
[ +0.000007] IPVS: Moving dest 172.16.130.20:7480 into trash, dest->refcnt=1
[ +0.000002] IPVS: Leave: ip_vs_del_dest, net/netfilter/ipvs/ip_vs_ctl.c line 1101
[ +11.076403] IPVS: Removing destination 0/172.16.130.20:7480 from trash
複製代碼
[root@10-10-88-192 ~]# ipvsadm -a -t 10.10.88.188:7480 -r 172.16.130.22:7480 -m
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
-> 172.16.130.22:7480 Masq 1 0 0
[root@10-10-88-192 ~]#
複製代碼
[root@10-10-88-192 ~]# ipvsadm -A -t 10.10.88.189:7480 -s wlc -p 1800
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
-> 172.16.130.22:7480 Masq 1 0 0
TCP 10.10.88.189:7480 wlc persistent 1800
[root@10-10-88-192 ~]#
複製代碼
[root@10-10-88-192 ~]# ipvsadm -D -t 10.10.88.189:7480
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.88.188:7480 wlc persistent 1800
-> 172.16.130.22:7480 Masq 1 0 0
複製代碼
若是直接移除virtual server的話, 如有real server, real server也會一併移除掉debug
[root@10-10-88-192 ~]# ipvsadm -D -t 10.10.88.188:7480
[root@10-10-88-192 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@10-10-88-192 ~]#
複製代碼