LVS
Linux Virtual Server 傳輸層的包轉發工具,通過VS對RS的調度實現負載均衡:
-
VS:Virtual Server(Director、Dispatcher、Balancer);
-
RS:Real Server(upstream server,backend server);
LVS工作在傳輸層,主要根據目標端口進行分發,相當于4層交換機,不受應用層套接字和端口的數量的限制,而是直接把報文轉發給后端服務器,并發量極高。支持TCP、UPD、ESP、AH、SCTP等協議報文的轉發。相同功能的模擬傳輸層進行任務調度的應用還用:nginx(stream)、haproxy(mod tcp)等。
相比較而言:
Nginx作為反向代理服務器實現負載均衡時工作應用層,因此只能模擬傳輸層進行任務調度,主要根據請求模型的分類進行分發,例如把SELECT語句分發至一臺MySQL服務器,把php請求分發至fpm服務器等。這類應用層的均衡調度器主要有:nginx(upstream)、httpd(balance)、haproxy(mod http)、ats、perlbal、mysql-proxy等。
在與客戶端通信的過程中常常涉及到會話追蹤的需求,比如用戶在不同的終端上完成的一次購物行為等待。但是http協議本身是無狀態的,服務器與客戶端如何實現會話追蹤,尤其是集群服務如何實現Session保持成為一大問題。集群服務的Session保持方案主要由以下3種:
-
Session Stick:Source IP or Cookie實現在單臺服務器時間最基本的Session保持;
-
Session replication:Session Cluster實現在多臺服務器之間復制所有Session;
-
Session Server:由獨立的Session服務器實現Session同步和共享;
LVS工作類型
LVS有兩部分組成:ipvsadm/ipvs,分別是用戶空間的規則定義和Real Server管理工具;內核空間的調度分發組件;
-
ipvsadm:用戶空間的規則定義和Real Server管理工具;
-
ipvs:工作于內核空間的Netfilter的INPUT Function之上,請求報文經路由到達用戶空間進程之前,ipvs改變了報文的流向直接轉給POSTROUTING,并根據調度算法選擇一個Real Server,并對請求報文做相應的修改之后轉發給Real Server。Director與Real Server之間的packet-forwarding-method有4種:
-
lvs-nat:修改請求報文的目標IP,報文的收發都由Director完成
-
lvs-dr:封裝新的MAC地址,響應報文有Real Server直接響應給客戶端
-
lvs-tun:在原請求報文中新加一個IP首部,遠程
-
lvs-fullnat:同時修改請求報文的源和目標IP
LVS NAT
多目標的DNAT,通過修改請求報文的目標IP地址和PORT實現以Director為網關的調度與分發,正是因為RS的網關為Director,所以無需修改源IP,且Director和RS必須通過交換機相連接。可概括為以下特點:
-
RIP和DIP屬于同一網絡,且使用私網地址,Real Server的網關必須指向DIP(保證響應報文經由Director);
-
請求和響應文本都經由Director;在高負載場景中,Director很可能成為系統性能瓶頸;
-
Director主機為Linux系統,Real Server可以是任意支持集群服務的OS;
-
支持端口映射;
LVS DR(默認)
Direct Routing 直接路由,對請求報文封裝一個MAC地址,根據調度算法廣播發送給其中一臺Real Server,并且由Real Server直接響應客戶端請求。可概括為以下特點:
-
Real Server的RIP可使用私網地址,也可使用公網地址,但Director與Real Server直接不能經過路由
-
Real Server與Directory通過物理交換機連接
-
請求報文經由DIrector,但響應不經由Director,而是由Real Server直接發往Client
-
不支持端口映射
Direct Routing帶來的問題
每個Real Server與VS共用VIP才能實現Real Server直接響應Client,但是多塊網卡共用VIP是不被允許的,可能會造成路由器把請求報文直接給Real Server而不經過Director調度。因此,Real Server必須把VIP隱藏起來,或者通過設定路由器策略及ARP廣播策略,以實現只是Director接收請求以完成調度,且Real Server直接響應客戶端的工作方式:
-
方案一:在前端網關做靜態綁定,依賴于路由器設定,一般不可取
-
方式二:禁止廣播,需arptables組件,較難適用
-
方式三:內核開啟應答與通告級別(arp_annouce、arp_ignore)設定,避免內核使用不在對應網卡上的ip地址進行交叉通告,限制內核僅對對應接口的ARP請求做出響應,把VIP綁定在 lo 網卡上,達到隱藏的效果。這樣在Director封裝MAC后廣播發送給Real Server,并且由Real Server解包的報文中目標地址VIP就可以被Real Server的lo網卡所綁定的VIP相對應,不至于被丟棄。Real Server發送報文時則先經過 lo 網卡轉發至物理網卡再發送出去,原因是 Linux 內核會根據響應報文的源IP選擇網卡,因此,回應報文必須先經過 lo 網卡,再由物理網卡發送。
限制響應模型的內核參數
-
arp_annouce:
0:默認值,把本機所有接口的所有信息向每個接口上的網絡進行通告
1:盡量避免向非直接連接網絡進行通告
2:必須避免向非本網絡通告 -
arp_ignore:
0:默認值,內核使用任意地址響應網卡的
1:僅在請求的目標IP配置在本地主機的收到請求報文接口
LVS TUN
由于DR類型的Director與Real Server工作在同一物理網絡上,而LVS TUN則針對Real Server工作在不同網絡中的情況,利用IP隧道(把報文經公網IP再次封裝)將請求報文送達至遠程Real Server,并實現有Real Server直接響應客戶端的一種LVS類型。
LVS TUN的轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在源IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文通過路由分發給Real Server。可概括為以下特點:
-
DIP,VIP,RIP都是公網地址(Director通過公網給Real Server分發請求);
-
Real Server的網關不能也不可能指向DIP(保證響應報文經由Director發出);
-
請求報文要經由Director,但響應報文不經由Director;
-
不支持端口映射;
-
Real Server的內核需支持隧道功能;
LVS FULLNAT
與 NAT 類型不同的是 FULLNAT 則是同時修改請求報文的源IP與目標IP,經過路由分發給RS,響應報文也經過路由到達Director再發出,為了實現路由,要把目標地址和源地址改成DIP與RIP。此外FULLNAT也支持端口映射,但需做內核修補,LVS默認不支持此模型??筛爬橐韵绿攸c:
-
VIP是公網地址,RIP與DIP是私網地址,且通常不在同一網絡,但必須能夠路由
-
Director的VIP接收Client的CIP請求,但響應報文也需Director轉發給Client的RIP;
-
Real Server收到請求報文源IP是Director的DIP(CIP –> DIP、VIP –> RIP),響應目標IP也是Director的DIP;
scheduling-method
ipvs的根據是否需要考慮Real Server的負載,可分為靜態調度算法和動態調度算法;
ipvs默認采用WLC調度算法,是較好的一種調度算法。其既考慮到活動與非活動connection的比重,又考慮到Real Server本身性能的權重,是一種較為綜合、均衡、通用的調度算法;
靜態調度算法
僅根據算法本身,輪詢Real Server分發請求;
-
RR(Roundrobin),自上而下輪詢Real Server,逐一分發;
-
WRR(Weighted RR),根據Real Server的權重進行分發,能夠分析一段時間內Real Server的處理能力對其進行加權;
-
SH(Source Hashing),對源IP地址hash,將來自同一IP地址的請求始終發往一臺Real Server,實現
Session Stick
,其算法是基于WRR實現的;
此外,設置調度時的timeout
,也可實現類似的會話保持功能; -
DH(Destination Hashing),對目標IP地址hash,將發往同一目標地址的請求始終發送給一臺Real Server,一般是緩存服務器,以負載均衡內網用戶對外部服務器的請求;
動態調度算法
根據算法本身以及實時Real Server負載狀態(Overhead
),分發給負載較小的Real Server;
-
LC(least connections),Overhead=activeconns*256+inactiveconns;
-
WLC(Weighted LC),默認調度算法,Overhead=(acriveconns*256+inactiveconns)/weight;考慮非活動連接的負載
-
SED(Shortest Expection Delay),最短期望延時,弱化非活動連接的負載,Overhead=(activeconns+1)*256/weight,活動連接相同(包括0個連接),優先分配給權重大的Real Server,但不公平,會導致權重小的Real Server空閑;
-
NQ(Never Queue),每臺Real Server最少分發一個conn,再根據SED調度;
-
LBLC(Locality-Based LC),動態的DH算法,考慮Real Server的負載,但損失命中率;
-
LBLCR(LBLC with Replication),帶復制功能的LBLC,在考慮Real Server負載的情況下,優先從另一Real Server中復制緩存;
CentOS 7 中的ipvs組件
RHEL 7系統的內核中默認已經編譯了ipvs,可通過查看發行版編譯內核時的config文件是否有相關選項:
grep -i -C 10 ipvs /boot/config-xxx.x86_64
# IPVS transport protocol load balancing support
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
# IPVS scheduler
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
安裝ipvsadm程序
yum -y install ipvsadm
rpm -ql ipvsadm
主要文件
Unit File:/usr/lib/systemd/system/ipvsadm.service
程序文件:/usr/sbin/ipvsadm
, /usr/sbin/ipvsadm-restore
,/usr/sbin/ipvsadm-save
ipvsadm命令
用法與iptables類似,可分為管理集群服務、管理Real Server、查看當前狀態、規則保存等幾個部分的命令選項。
使用ipvs應開啟內核的ip_forward功能;
ipvs支持調度防火墻的MARK捆綁,可同時對一組或單個應用的設定集群服務;
ipvs有兩種方式實現 Session 保持功能,原理是讓客戶端可以持續連接同一臺Real Server;一種是設定默認為300s的persistent,另一種是使用SH調度算法;前一種可在任意一種調度算法上實現會話保持;such as SSL or FTP where it is important that clients consistently connect with the same real server.
ipvsadm -h
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe peReal Serveristence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address] #清空packet, byte and rate counteReal Server
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
管理集群服務:
-
增加、修改Director及調度算法
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-
刪除Director,關閉lvs:
ipvsadm -D -t|u|f service-address
-t|u|f service-address
-t:TCP協議的端口
-u:UDP協議的端口
-f:firewall MARK,通過防火墻對相同服務的不同端口標記為同一數字
管理Real Server
-
增加、修改Real Server及工作模型:
ipvsadm -a|e -t|u|f service-address -r server-address [options]
[options]:
lvs類型:
-g:gateway,dr類型
-l:ipip,tun類型
-m:masquerade,nat類型
權重:
-w weight,權重,wrr,wlc使用
-
刪除Real Server:
ipvsadm -d -t|u|f service-address -r server-address
server-address:
RemotAddress[:port] #默認與請求服務的端口相同
#dr、tun不支持端口轉發,nat、fullnat支持端口轉發
查看狀態
不反解的ip與端口、權重、活動連接、非活動連接、精確顯示數值、當前的IPVS連接、統計數據、每秒連接數、接收、發送字節數等
ipvsadm -L|l [options]
--numeric,-n:numeric output of addresses and ports
--exact:expand numbeReal Server (display exact values)
--connection,-c:output of current IPVS connections
--stats:output of statistics information
--rate:output of rate information
清空內容
ipvsadm -C #清空所有集群服務的定義,造成集群服務立即斷開
ipvsadm -Z [-t|u|f service-address] #清空單集群或所有集群的統計數據
保存和重載
ipvsadm -R #接收標準輸入
ipvsadm -S [-n] #保存在/etc/sysconfig/ipvsadm 文件中
配置集群服務
man ipvsadm
通俗易懂的配置示例。主要配置兩部分的規則:
集群服務 + Real Server的配置,配置前需要準備好以下幾項條件:
-
同步時間:建立ntp服務器或使用chrony同步某一臺主機的時間
vi /etc/chrony.con
#注釋默認設置,修改為某一主機的地址
systemctl restart chronyd.service
chronyc sources
-
Director開啟包轉發功能:echo 1 > /proc/sys/net/ipv4/ip_forward
-
RS的默認網關指向要正確
-
lvs之前先測試每臺Real Server提供的服務是否正常
NAT方法示例
可能用到的命令:
-
臨時修改網卡地址:ifconfig eth0 IP/PRX up
-
增加默認路由:route add defaule GATEWAY
-
禁用某塊網卡:ip link set down ethX
使用rr調度算法輪詢RS
ipvsadm -A -t 10.1.253.29:80 -s rr
ipvsadm -a -t 10.1.253.29:80 -r 192.168.22.15 -m
ipvsadm -a -t 10.1.253.29:80 -r 192.168.22.16 -m
ipvsadm -Ln
for i in {1..5}; do curl http://10.1.253.29
#結果為交替響應
使用wrr調度算法靜態加權輪詢
ip -E -t 10.1.253.29:80 -s wrr
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.15 -m -w 1
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
for i in {1..5}; do curl http://10.1.253.29
#結果為rs1:rs2=2:1
使用sh調度算法實現持久連接
ip -E -t 10.1.253.29:80 -s sh
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 2
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
for i in {1..5}; do curl http://10.1.253.29
#結果為該客戶端ip只由某一RS響應
使用wlc調度算法實現動態負載加權
ip -E -t 10.1.253.29:80 -s wlc
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
#結果為2:1
DR方法示例
通用的Real Server配置
#
#Real Server
#
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_annouce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_annouce
ifconfig lo:0 10.1.253.11 netmask 255.255.255.255 broadcast 10.1.253.11 up
route add -host 10.1.253.11 dev lo:0
負載均衡http服務
#
#Director Server
#
ifconfig eno16777736:0 10.1.253.11 netmask 255.255.255.255 broadcast 10.1.253.11 up
ipvsadm -A -t 10.1.0.11:80 -s wlc
ipvsadm -a -t 10.1.0.11:80 -r 10.1.0.51 -g -w 1
ipvsadm -a -t 10.1.0.11:80 -r 10.1.0.69 -g -w 2
負載均衡mysql服務
ipvsadm -E -t 10.1.0.11:3306 -s wrr
ipvsadm -e -t 10.1.0.11:80 -r 10.1.0.51 -g -w 1
ipvsadm -e -t 10.1.0.11:80 -r 10.1.0.69 -g -w 2
負載均衡FWM捆綁的服務
FWM(FireWall Mark):借助防火墻標記分類報文,可將多個不同應用使用同一個集群服務jingx當做一類請求進行輪詢
iptables -t mangle -A PREROUTING -p tcp -d 10.1.253.11 -m multiport --dports 80,443 -j MARK --set-mark 01
iptables -t mangle -vnL
ipvsadm -A -f 01 -s wrr
ipvsadm -a -f 01 -r 10.1.253.51 -g -w 1
ipvsadm -a -f 01 -r 10.1.253.69 -g -w 1
lvs persistence(持久連接)
lvs通過定義集群服務的persistent
時間實現持久連接,可在任一的調度算法中實現持久連接。其不同于SH算法,而是在timeout
時間內始終把同一客戶端IP請求分發給某一Real Server。根據需求,LVS可實現以下3種類型的持久連接:
-
每端口持久:每集群服務單獨定義,各自持久
-
每FWM持久:基于防火墻標記定義持久連接,可實現將多個端口上的應用統一調度,即所謂的port Affinity;
-
每客戶端持久:基于
0端口
定義集群服務,將客戶端對所有應用請求都調度至Real Server,且可使用持久連接進行Session綁定
#每端口持久
ipvsadm -A -t 10.1.253.11:80 -s rr -p 60
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1
#每FWM持久
ipvsadm -A -f 01 -s rr -p 360
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1
#每客戶端持久
ipvs -A -t 10.1.253.11:0 -s wrr -p
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1
規則保存與恢復
#獲取幫助
man ipvsadm-save
cat /usr/lib/systemd/system/ipvsadm.service
#保持保存
ipvsadm -S > /etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl stop ipvsadm.service #自動保存規則
#規則恢復
ipvsadm -R < /etc/sysconfig/ipvsadm
ipvsadm-restore < /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
附錄
DR方法的Director配置腳本
#/bin/bash
#
#setting for the Director.
iface='eth0:0'
vip='10.1.253.11'
rs1='10.1.253.51'
rs2='10.1.253.69'
mask='255.255.255.255'
scheduler=$2
method='-g'
port='3306'
weight=$3
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F #don't compatibility with Netfilter
ipvsadm -A -t ${vip}:$port -s ${scheduler:=wlc}
ipvsadm -a -t ${vip}:$port -r ${rs1} $method -w ${weight:=1}
ipvsadm -a -t ${vip}:$port -r ${rs2} $method -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop [scheduler] [weight]"
exit 1
;;
esac
運行幫助
[root@cent7]~>bash dr_vs.sh
Usage dr_vs.sh start|stop [scheduler] [weight]
DR方法的Real Server配置腳本
#!/bin/bash
#setting for real server.
vip='10.1.253.11'
mask='255.255.255.255'
case i in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0
;;
stop)
ifconfig lo:0 down
route del -host $vip
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage start|stop"
;;
esac
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/56303