lvs是linux virtual server的簡稱,也就是linux虛拟伺服器, 是一個由章文嵩博士發起的自由軟體項目,它的官方站點是www.linuxvirtualserver.org。現在lvs已經是 linux标準核心的一部分,在linux2.4核心以前,使用lvs時必須要重新編譯核心以支援lvs功能子產品,但是從linux2.4核心以後,已經完全内置了lvs的各個功能子產品,無需給核心打任何更新檔,可以直接使用lvs提供的各種功能。
lvs:四層路由,四層交換
根據目标ip和port實作請求轉發至後端的多個主機中的一個(根據挑選法則)
借助于netfilter
檢視核心是否編譯進來lvs指令
grep –i “ipvs” /boot/config-version,否則重新編譯核心
lvs:
ipvsadm:使用者空間用于轉發規則的程式
ipvs:工作于核心空間的input鍊根據規則完成請求排程的程式
支援的協定:tcp udp sctp ah esp ah_esp
lvs中常用術語
director:主要作用類似于一個路由器,它含有完成lvs功能所設定的路由表,通過這些路由表把使用者的請求分發給server array層的應用伺服器(real server)上。同時,在director server上還要安裝對real server服務的監控子產品ldirectord,此子產品用于監測各個real server服務的健康狀況
real server:real server可以是web伺服器、mail伺服器、ftp伺服器、dns伺服器、視訊伺服器等
client ip:cip
director ip:dip
director virtual ip:vip
real server ip:rip
lvs類型
lvs-nat:
1、rs應用使用私有位址;rs的網關必須指向dip;
2、請求和響應都要經過director;高負載場景中,director易成為性能瓶頸;
3、支援端口映射;
4、rs可以使用任意
5、rip和dip要在同一網段
lvs-dr:修改目标mac,直接送給網卡驅動,目标mac是基于排程方法選出某rs的網絡接口的mac位址
1、保證前端路由将目标位址為vip的封包統統發往directory,而不能是rs;
解決方案:
(1) 靜态位址綁定:在前端路由器上操作
問題:未必有路由操作權限
(2) aprtables
(3) 修改rs上核心參數,将rs上的vip配置在lo接口的别名上,并限制其不能響應對vip位址解析請求;
2、rs可以使用私有位址;但也可以使用公網位址,此時可通過網際網路通過rip對其直接發起管理通路;
3、rs跟directory必須在同一實體網絡中;
4、請求封包經由director,但響應封包必須不能經過director;
5、不支援端口映射;
6、rs可以是大多數常見的os;
7、rs的網關絕不允許指向dip;
lvs-tun:不修改請求封包ip首部,通過隧道機制在ip首部外部再封裝一個ip首部(sip:dip,dip:rip),進過網絡發往伺服器
1、rip、vip、dip全部是公網位址;
2、rs的網關不會也不可能指向dip;
3、請求封包經由director,但響應封包必須不能經過director;
4、不支援端口映射;
5、rs的os必須支援隧道功能;
lvs-fullnat:
lvs scheduler:wlc預設排程算法
# grep -i 'vs' /boot/config-version
靜态方法:僅根據排程算法本身進行排程
rr: round robin,輪流,輪詢,輪叫
wrr: weighted round robin, 權重輪詢
sh: source hashing,源位址hash,表示來源于同一個cip的請求将始終被定向至同一個rs;session保持;
dh: destination hashing, 目标位址hash,
動态方法:根據算法及各rs目前的負載狀況進行排程
lc: least connection,最少連接配接
overhead=active*256+inactive
wlc: weighted lc
overhead=(active*256+inactive)/weight
sed: shortest expection delay
overhead=(active+1)*256/weight
lvs排程基于定義的叢集服務進行的。
定義叢集服務
為叢集添加各rs
ipvsadm用法:
管理叢集服務:
ipvsadm -a|e -t|u|f service-address [-s scheduler]
ipvsadm -d -t|u|f service-address
-a:添加
-e:修改
-d:删除
-t:tcp協定
-u:udp協定
-f:fwm,防火牆标記,标記用數字表示,将多個端口綁定在一起定義成一個叢集服務時使用
service-address:
-t|u: vip:port
-f: #
向一個已經存在叢集服務添加一個rs:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
-a:添加rs
-e:修改rs
-d:删除rs
-r server-address:rs的位址 ip[:port]port省略預設使用相同端口
-g:gateway
-i:ipip
-m:masquerade
-w:權重
檢視已經定義的叢集服務及rs:
ipvsadm -l -n
-c: 檢視各連接配接
--stats: 統計資料
--rate: 速率
--exact: 精确值
清空所有的叢集服務:
ipvsadm -c
儲存叢集服務定義:
ipvsadm -s > /path/to/some_rule_file
ipvsadm-save > /path/to/some_rule_file
讓規則檔案中的規則生效:
ipvsadm -r < /path/from/some_rule_file
ipvsadm-restore < /path/from/some_rule_file
rs: 配置核心參數
arp_ignore: 如何響應接收arp位址請求;預設0;1表示僅在請求的位址配置在請求封包的接口進行響應;
arp_announce: 如何通告本地位址;預設0;2表示僅通過網絡直連的接口的位址;
rs:首先配置核心參數
配置vip時使用:
ifconfig lo:0 vip netmask 255.255.255.255 broadcast vip up
route add -host vip dev lo:0
keepalived:
結合netfilter來實作一種叢集服務定義機制;
(1) 在mangle表的prerouting鍊定義規則,實作指定防火牆标記;
# iptables -t mangle -a prerouting -d vip -p {tcp|udp} --dport port -j mark --set-mark #
(2) 基于此前的标記定義叢集服務;
# ipvsadm -a -f # [-s method]
# ipvsadm -a -f # -r rs [options]
功能:将同屬于同一組應用的多個不同端口的服務定義成一個叢集服務,統一排程;
lvs持久連接配接功能:
無論使用什麼排程方法,持久連接配接功能都能保證在指定的一段時間内,來自同一個使用者的請求始終被定向至同個rs;其排程基準為叢集服務;
持久連接配接的類型:
pcc:
在基于tcp或udp定義叢集服務時,其端口為0,格式為vip:0,表示将來自于使用者請求的任何一種請求(無論請求指定協定的哪個端口)統統轉給後端的rs;基于持久連接配接時,來自于同一個client的所有請求統統被轉發至同一個rs;
ipvsadm –a –t ip:0 –s rr –p 300
ipvsadm –a –t ip:0 –r rip –g -w
ppc:每端口持久
持久機制;單服務排程;各叢集服務分開排程
pfm:單服務排程;可以通過防火牆标記将多個協定定義為同一個服務;
ipvs:對rs的健康狀态檢查可以借助于keepalived實作
檢查思路:
1.ip:icmp
2.傳輸層:端口開放狀态
3.應用層:請求關鍵性資源
rs的健康狀态檢測:
1、自動上下線各rs;
如果狀态發生了改變:
online --> fail
探測三次及以上;
offline --> ok
一次即可;
2、所有rs均故障時,應該提供一個back server;
如何檢測rs的健康狀态:
利用叢集服務依賴的協定進行檢測
利用端口掃描或探測類工具對指定協定的端口進行探測
在網絡層探測