lvs詳解

Linux Cluster:php

Cluster:計算機集合,爲解決某個特定問題組合起來造成的單個系統;html


Linux Cluster類型:前端

LB:Load Balancing,負載均衡;mysql

HA:High Availiablity,高可用;nginx

A=MTBF/(MTBF+MTTR)算法

(0,1):90%, 95%, 99%, 99.5%,  99.9%, 99.99%, 99.999%, 99.9999%sql

HP:High Performance,高性能;apache

www.top500.org後端

分佈式系統:緩存

分佈式存儲

分佈式計算

系統擴展方式:

Scale UP:向上擴展

Scale Out:向外擴展

Cluster

LB Cluster:

LB Cluster的實現:

硬件:

F5 Big-IP

Citrix Netscaler

A10 A10

軟件:

lvs:Linux Virtual Server

nginx

haproxy

ats:apache traffic server 

perlbal

pound


image.png


基於工做的協議層次劃分:

傳輸層(通用):(DPORT)

lvs:(四層 ,能爲各類基於udp、tcp協議工做的服務來完成 )

nginx:(stream)(僞四層調度)

haproxy:(mode tcp)(僞四層調度)

應用層(專用):(自定義的請求模型分類)

proxy server:

http:nginx(http), httpd, haproxy(mode http), ...

fastcgi:nginx, httpd, ...

mysql:ProxySQL,  ...

...

站點指標:

PV:Page View

UV:Unique Vistor

IP:

會話保持:

(1) session sticky

Source IP

Cookie

(2) session replication; 

session cluster

(3) session server

lvs:Linux Virtual Server 

                image.png

VS: Virtual Server

RS: Real Server

做者:章文嵩;alibaba --> didi

l4:四層路由器,四層交換機;

VS:根據請求報文的目標IP和目標協議及端口將其調度轉發至某RealServer,根據調度算法來挑選RS;

iptables/netfilter:

iptables:用戶空間的管理工具;

netfilter:內核空間上的框架;

流入:PREROUTING --> INPUT 

流出:OUTPUT --> POSTROUTING

轉發:PREROUTING --> FORWARD --> POSTROUTING

DNAT:目標地址轉換; PREROUTING;

SNAT:源地址轉換;POSTROUTING;

lvs: ipvsadm/ipvs

ipvsadm:用戶空間的命令行工具,規則管理器,用於管理集羣服務及相關的RealServer;

ipvs:工做於內核空間的netfilter的INPUT鉤子之上的框架;

lvs集羣類型中的術語:

vs:Virtual Server, Director, Dispatcher, Balancer

rs:Real Server, upstream server, backend server

CIP:Client IP, VIP: Virtual serve IP, RIP: Real server IP, DIP: Director IP

CIP <--> VIP == DIP <--> RIP 

lvs集羣的類型:

lvs-nat:修改請求報文的目標IP;多目標IP的DNAT;

lvs-dr:操縱封裝新的MAC地址;

lvs-tun:在原請求IP報文以外新加一個IP首部;

lvs-fullnat:修改請求報文的源和目標IP;


lvs-nat:

多目標IP的DNAT,經過將請求報文中的目標地址和目標端口修改成某挑出的RS的RIP和PORT實現轉發;

(1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP;

(2)請求報文和響應報文都必須經由Director轉發;Director易於成爲系統瓶頸;

(3)支持端口映射,可修改請求報文的目標PORT;

(4)vs必須是Linux系統,rs能夠是任意系統;

lvs-dr:

Direct Routing,直接路由;

經過爲請求報文從新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

Director和各RS都得配置使用VIP;

(1) 確保前端路由器將目標IP爲VIP的請求報文發往Director:

(a) 在前端網關作靜態綁定;

(b) 在RS上使用arptables;

(c) 在RS上修改內核參數以限制arp通告及應答級別;

arp_announce

arp_ignore

(2) RS的RIP可使用私網地址,也能夠是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director;

(3) RS跟Director要在同一個物理網絡;

(4) 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;

(5) 不支持端口映射;


回顧:

Linux Cluster:

LB/HA/HP

分佈式系統:存儲/計算

LB Cluster:

硬件:F5-BigIP/Netscaler/A10

軟件:

四層:lvs/nginx(stream)/haproxy(mode tcp)

七層:

http:nginx(http)/httpd/haproxy(mode http)/ats/perlbal/pound

mysql: ProxySQL, ...

lvs:Linux Virutal Server

vs/rs; cip/vip/dip/rip

lvs type:

nat/dr/tun/fullnat

nat類型:多目標IP的DNAT,經過修改請求報文的目標IP和PORT來實現調度;

dr類型:經過爲請求報文從新封裝一個MAC首部進行轉發:源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;

LVS(2)

lvs-tun:

轉發方式:不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而是在原IP報文以外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);

(1) DIP, VIP, RIP都應該是公網地址;

(2) RS的網關不能,也不可能指向DIP;

(3) 請求報文要經由Director,但響應不能經由Director;

(4) 不支持端口映射;

(5) RS的OS得支持隧道功能;

lvs-fullnat:

經過同時修改請求報文的源IP地址和目標IP地址進行轉發;

CIP <--> DIP 

VIP <--> RIP 

(1) VIP是公網地址,RIP和DIP是私網地址,且一般不在同一IP網絡;所以,RIP的網關通常不會指向DIP;

(2) RS收到的請求報文源地址是DIP,所以,只能響應給DIP;但Director還要將其發往Client;

(3) 請求和響應報文都經由Director;

(4) 支持端口映射;

注意:此類型默認不支持;

總結:

lvs-nat, lvs-fullnat:請求和響應報文都經由Director;

lvs-nat:RIP的網關要指向DIP;

lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通訊;

lvs-dr, lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client;

lvs-dr:經過封裝新的MAC首部實現,經過MAC網絡轉發;

lvs-tun:經過在原IP報文以外封裝新的IP首部實現轉發,支持遠距離通訊;

ipvs scheduler:

根據其調度時是否考慮各RS當前的負載狀態,可分爲靜態方法和動態方法兩種:

靜態方法:僅根據算法自己進行調度;

RR:roundrobin,輪詢;

WRR:Weighted RR,加權輪詢;

SH:Source Hashing,實現session sticky,源IP地址hash;未來自於同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定;

DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡;

動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;

Overhead=

LC:least connections

Overhead=activeconns*256+inactiveconns

WLC:Weighted LC

Overhead=(activeconns*256+inactiveconns)/weight

SED:Shortest Expection Delay

Overhead=(activeconns+1)*256/weight

NQ:Never Queue

LBLC:Locality-Based LC,動態的DH算法;

LBLCR:LBLC with Replication,帶複製功能的LBLC;

ipvsadm/ipvs:

集羣和集羣之上的各RS是分開管理的;

集羣定義

RS定義

ipvs:

~]# grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64

支持的協議:TCP, UDP, AH, ESP, AH_ESP,  SCTP;

ipvs集羣:

集羣服務

服務上的RS

ipvsadm:

程序包:ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

規則保存工具:/usr/sbin/ipvsadm-save

規則重載工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config

ipvsadm命令:

核心功能:

集羣服務管理:增、刪、改;

集羣服務的RS管理:增、刪、改;

查看:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_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]


管理集羣服務:增、改、刪;

增、改:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

刪:

ipvsadm -D -t|u|f service-address

service-address:

-t|u|f:

-t: TCP協議的端口,VIP:TCP_PORT

-u: UDP協議的端口,VIP:UDP_PORT

-f:firewall MARK,是一個數字;

[-s scheduler]:指定集羣的調度算法,默認爲wlc;

管理集羣上的RS:增、改、刪;

增、改:

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

刪:

ipvsadm -d -t|u|f service-address -r server-address

server-address:

rip[:port]

選項:

lvs類型:

-g: gateway, dr類型

-i: ipip, tun類型

-m: masquerade, nat類型

-w weight:權重;

清空定義的全部內容:

ipvsadm -C

查看:

ipvsadm -L|l [options]

--numeric, -n:numeric output of addresses and ports 

--exact:expand numbers (display exact values)

--connection, -c:output of current IPVS connections

--stats:output of statistics information

--rate :output of rate information

保存和重載:

ipvsadm -S = ipvsadm-save

ipvsadm -R = ipvsadm-restore 

負載均衡集羣設計時要注意的問題:

(1) 是否須要會話保持;

(2) 是否須要共享存儲;

共享存儲:NAS, SAN, DS(分佈式存儲)

數據同步:

課外做業:rsync+inotify實現數據同步 

lvs-nat:

設計要點:

(1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP;

(2) 支持端口映射;

(3) Director要打開核心轉發功能;

實踐做業(博客):負載均衡兩個php應用(wordpress,discuzx);

測試:(1) 是否須要會話保持;(2) 是否須要共享存儲;



lvs-dr:

dr模型中,各主機上均須要配置VIP,解決地址衝突的方式有三種:

(1) 在前端網關作靜態綁定;

(2) 在各RS使用arptables;

(3) 在各RS修改內核參數,來限制arp響應和通告的級別;

限制響應級別:arp_ignore

0:默認值,表示可以使用本地任意接口上配置的任意地址進行響應;

1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,纔給予響應;

限制通告級別:arp_announce

0:默認值,把本機上的全部接口的全部信息向每一個接口上的網絡進行通告;

1:儘可能避免向非直接鏈接網絡進行通告;

2:必須避免向非本網絡通告;


實踐做業(博客):負載均衡兩個php應用(wordpress,discuzx);

測試:(1) 是否須要會話保持;(2) 是否須要共享存儲;

RS的預配置腳本:

#!/bin/bash

#

vip=10.1.0.5

mask='255.255.255.255'


case $1 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


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 $(basename $0) start|stop"

exit 1

;;

esac

VS的配置腳本:

#!/bin/bash

#

vip='10.1.0.5'

iface='eno16777736:0'

mask='255.255.255.255'

port='80'

rs1='10.1.0.7'

rs2='10.1.0.8'

scheduler='wrr'

type='-g'


case $1 in

start)

ifconfig $iface $vip netmask $mask broadcast $vip up

iptables -F

ipvsadm -A -t ${vip}:${port} -s $scheduler

ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1

ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1

;;

stop)

ipvsadm -C

ifconfig $iface down

;;

*)

echo "Usage $(basename $0) start|stop"

exit 1

;;

esac


課外擴展做業:vip與dip/rip不在同一網段的實驗環境設計及配置實現; 

博客做業:lvs的詳細應用

講清楚類型、調度方法;而且給出nat和dr類型的設計拓撲及具體實現;

FWM:FireWall Mark 

netfilter:

target: MARK, This  target  is  used  to set the Netfilter mark value associated with the packet.

--set-mark value

藉助於防火牆標記來分類報文,然後基於標記定義集羣服務;可將多個不一樣的應用使用同一個集羣服務進行調度;

打標記方法(在Director主機):

# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 

基於標記定義集羣服務:

# ipvsadm -A -f NUMBER [options]

lvs persistence:持久鏈接

持久鏈接模板:實現不管使用任何調度算法,在一段時間內,可以實現未來自同一個地址的請求始終發往同一個RS;

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

port Affinity:

每端口持久:每一個端口對應定義爲一個集羣服務,每集羣服務單獨調度;

每防火牆標記持久:基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity;

每客戶端持久:基於0端口定義集羣服務,即將客戶端對全部應用的請求通通調度至後端主機,必須定義爲持久模式;

保存及重載規則:

保存:建議保存至/etc/sysconfig/ipvsadm

ipvsadm-save > /PATH/TO/IPVSADM_FILE

ipvsadm -S > /PATH/TO/IPVSADM_FILE

systemctl stop ipvsadm.service 

重載:

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

ipvsadm -R < /PATH/FROM/IPVSADM_FILE

systemctl restart ipvsadm.service 

考慮:

(1) Director不可用,整個系統將不可用;SPoF

解決方案:高可用 

keepalived 

heartbeat/corosync

(2) 某RS不可用時,Director依然會調度請求至此RS;

解決方案:對各RS的健康狀態作檢查,失敗時禁用,成功時啓用;

keepalived

heartbeat/corosync, ldirectord

檢測方式:

(a) 網絡層檢測;

(b) 傳輸層檢測,端口探測;

(c) 應用層檢測,請求某關鍵資源;

ok --> failure

failure --> ok

ldirectord:

Daemon to monitor remote services and control Linux Virtual Server. ldirectord is a daemon to monitor and administer real servers in a cluster of load balanced virtual servers. ldirectord typically is started from heartbeat but can also be run from the command line.

配置示例:

checktimeout=3

checkinterval=1

fallback=127.0.0.1:80

autoreload=yes

logfile="/var/log/ldirectord.log"

quiescent=no

virtual=5

real=172.16.0.7:80 gate 2

real=172.16.0.8:80 gate 1

fallback=127.0.0.1:80 gate

service=http

scheduler=wrr

checktype=negotiate

checkport=80

request="index.html"

receive="CentOS"

補充:共享存儲

NAS:Network Attached Storage

nfs/cifs

文件系統接口

SAN:Storage Area Network

「塊」接口

相關文章
相關標籤/搜索