?LVS

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種:

  1. Session Stick:Source IP or Cookie實現在單臺服務器時間最基本的Session保持;

  2. Session replication:Session Cluster實現在多臺服務器之間復制所有Session;

  3. 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種: 

    1. lvs-nat:修改請求報文的目標IP,報文的收發都由Director完成

    2. lvs-dr:封裝新的MAC地址,響應報文有Real Server直接響應給客戶端

    3. lvs-tun:在原請求報文中新加一個IP首部,遠程

    4. lvs-fullnat:同時修改請求報文的源和目標IP

LVS NAT

多目標的DNAT,通過修改請求報文的目標IP地址和PORT實現以Director為網關的調度與分發,正是因為RS的網關為Director,所以無需修改源IP,且Director和RS必須通過交換機相連接。可概括為以下特點:

  1. RIP和DIP屬于同一網絡,且使用私網地址,Real Server的網關必須指向DIP(保證響應報文經由Director);

  2. 請求和響應文本都經由Director;在高負載場景中,Director很可能成為系統性能瓶頸;

  3. Director主機為Linux系統,Real Server可以是任意支持集群服務的OS;

  4. 支持端口映射;

LVS DR(默認)

Direct Routing 直接路由,對請求報文封裝一個MAC地址,根據調度算法廣播發送給其中一臺Real Server,并且由Real Server直接響應客戶端請求。可概括為以下特點:

  1. Real Server的RIP可使用私網地址,也可使用公網地址,但Director與Real Server直接不能經過路由

  2. Real Server與Directory通過物理交換機連接

  3. 請求報文經由DIrector,但響應不經由Director,而是由Real Server直接發往Client

  4. 不支持端口映射

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。可概括為以下特點:

  1. DIP,VIP,RIP都是公網地址(Director通過公網給Real Server分發請求);

  2. Real Server的網關不能也不可能指向DIP(保證響應報文經由Director發出);

  3. 請求報文要經由Director,但響應報文不經由Director;

  4. 不支持端口映射;

  5. Real Server的內核需支持隧道功能;

LVS FULLNAT

與 NAT 類型不同的是 FULLNAT 則是同時修改請求報文的源IP與目標IP,經過路由分發給RS,響應報文也經過路由到達Director再發出,為了實現路由,要把目標地址和源地址改成DIP與RIP。此外FULLNAT也支持端口映射,但需做內核修補,LVS默認不支持此模型??筛爬橐韵绿攸c:

  1. VIP是公網地址,RIP與DIP是私網地址,且通常不在同一網絡,但必須能夠路由

  2. Director的VIP接收Client的CIP請求,但響應報文也需Director轉發給Client的RIP;

  3. Real Server收到請求報文源IP是Director的DIP(CIP –> DIP、VIP –> RIP),響應目標IP也是Director的DIP;

scheduling-method

ipvs的根據是否需要考慮Real Server的負載,可分為靜態調度算法動態調度算法

ipvs默認采用WLC調度算法,是較好的一種調度算法。其既考慮到活動與非活動connection的比重,又考慮到Real Server本身性能的權重,是一種較為綜合、均衡、通用的調度算法;

靜態調度算法

僅根據算法本身,輪詢Real Server分發請求;

  1. RR(Roundrobin),自上而下輪詢Real Server,逐一分發;

  2. WRR(Weighted RR),根據Real Server的權重進行分發,能夠分析一段時間內Real Server的處理能力對其進行加權;

  3. SH(Source Hashing),對源IP地址hash,將來自同一IP地址的請求始終發往一臺Real Server,實現Session Stick,其算法是基于WRR實現的; 
    此外,設置調度時的timeout,也可實現類似的會話保持功能;

  4. DH(Destination Hashing),對目標IP地址hash,將發往同一目標地址的請求始終發送給一臺Real Server,一般是緩存服務器,以負載均衡內網用戶對外部服務器的請求;

動態調度算法

根據算法本身以及實時Real Server負載狀態(Overhead),分發給負載較小的Real Server;

  1. LC(least connections),Overhead=activeconns*256+inactiveconns;

  2. WLC(Weighted LC),默認調度算法,Overhead=(acriveconns*256+inactiveconns)/weight;考慮非活動連接的負載

  3. SED(Shortest Expection Delay),最短期望延時,弱化非活動連接的負載,Overhead=(activeconns+1)*256/weight,活動連接相同(包括0個連接),優先分配給權重大的Real Server,但不公平,會導致權重小的Real Server空閑;

  4. NQ(Never Queue),每臺Real Server最少分發一個conn,再根據SED調度;

  5. LBLC(Locality-Based LC),動態的DH算法,考慮Real Server的負載,但損失命中率;

  6. 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

管理集群服務:

  1. 增加、修改Director及調度算法

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
  1. 刪除Director,關閉lvs:

    ipvsadm -D -t|u|f service-address
       -t|u|f service-address
       -t:TCP協議的端口
       -u:UDP協議的端口
       -f:firewall MARK,通過防火墻對相同服務的不同端口標記為同一數字

管理Real Server

  1. 增加、修改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使用
  1. 刪除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的配置,配置前需要準備好以下幾項條件:

  1. 同步時間:建立ntp服務器或使用chrony同步某一臺主機的時間

vi /etc/chrony.con
   #注釋默認設置,修改為某一主機的地址

systemctl restart chronyd.service
chronyc sources
  1. Director開啟包轉發功能:echo 1 > /proc/sys/net/ipv4/ip_forward

  2. RS的默認網關指向要正確

  3. lvs之前先測試每臺Real Server提供的服務是否正常

NAT方法示例

nat.jpg

可能用到的命令:

  1. 臨時修改網卡地址:ifconfig eth0 IP/PRX up

  2. 增加默認路由:route add defaule GATEWAY

  3. 禁用某塊網卡: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服務

dr.jpg

#
#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種類型的持久連接:

  1. 每端口持久:每集群服務單獨定義,各自持久

  2. 每FWM持久:基于防火墻標記定義持久連接,可實現將多個端口上的應用統一調度,即所謂的port Affinity;

  3. 每客戶端持久:基于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

(0)
hellochelloc
上一篇 2016-10-26
下一篇 2016-10-26

相關推薦

  • 自定義命令提示符

     命令提示符的格式放在變量PS1中         命令提示符特殊字符定義             \u  當前用戶      &…

    Linux干貨 2017-05-02
  • M20-1 8月3號 –權限、用戶和組的管理

    一、權限管理:            ls -l                  rwxrwxrwx:               &nb…

    Linux干貨 2016-08-08
  • CentOS7下的網絡配置管理

    一、讓配置永久有效的辦法:修改配置文件 與網卡相關(課配置網卡的IP,掩碼,網關,DNS)     /etc/sysconfig/network-scripts/ifcfg-INTERFACE 字段解釋: TYPE        &nbsp…

    Linux干貨 2016-03-28
  • Linux基礎知識之用戶和組管理

    系統環境:    該博文以CentOS6.8_x86_64和CentOS7.2_x86_64系統為基礎,Xshell5遠程登錄CentOS6.8和CentOS7.2系統,分別以root身份和sjsir用戶身份登錄系統。 學習的重要問題: 一、為什么要學習用戶和組?    首先Linux區別于其他的系統的最重要的特性就是…

    Linux干貨 2016-08-02
  • linux 計劃任務

    Linux之 計劃任務 介紹 相信每個人都有使用鬧鐘的習慣,我們設定鬧鐘的種類有很多。比如說,只提醒一次、工作日提醒、休息日提醒等。在設定鬧鐘之后,每天的設定時間都會按時的提醒你去做什么事情,以免自己忘記一些重要的會議等事情。像這樣在每天特定的時間安排做一些事情。這樣一種事情我們就稱之為例行任務計劃。 其實在個系統平臺上都有類似的例行性任務計劃功能,那如何去…

    Linux干貨 2017-09-04
  • keepalived的原理及安裝應用

    keepalived的主從模式,keepalived的日志功能和主主模式

    2018-03-13
欧美性久久久久