Linux集群技術之LB之LVS
作者:李強
參考:man,info,magedu講義,萬能的internet
實驗環境:VMware? Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
聲明:以下英文純屬個人翻譯,英文B級,歡迎糾正,以下內容純屬個人理解,並沒有對錯,只是參考,盜版不糾,才能有限,希望不誤人子弟為好。
版本:v1-2018.3.11
1、 集群相關概念
大容量網站相關技術概念 一個網站的體驗度,註冊用戶數>在線用戶數>並發數 而並發數量達到一定值的時候,用戶打開一個頁面所需的時間就是體驗度 當一臺服務器無法滿足用戶體驗度的時候,2中方式 scale up 向上擴展,提高更強大的機器處理能力,有上限,成本高 scale out 向外擴展,增加多臺設備負載 所謂凡事有2面性,因此scale out 帶來的問題就是基於何種方式把響應發給多臺服務器,多臺服務器之前如何保證數據的同步性。 解決問題的解決方案,不停的升級改變,形成一定的架構。 各種應用場景,各種需求下,使用的是不一樣的架構,不一樣的解決方案。 解決老問題的同時又必然會帶來新的問題, 通過前端調度器/負載均衡設備等多種稱呼的設備,來解決如何將相應轉發給多臺服務器,但是產生的問題就是這臺LB設備存在SPOF的問題,因此LB要做HA,多臺服務器如果有設備出現問題如法相應要怎麽解決,這就需要LB能夠用戶健康檢查的機制,及時將故障設備剔除服務池,當故障恢復後再自動加入到服務池提供服務 解決的問題 1、如何解決把何種方式響應發給多臺服務器 2、當服務器無法響應時怎麽辦 3、基於無連接的http協議訪問,session如何保存。
-
cluster分類:
LB(load balance)
權重LB Cluster的實現 硬件: F5 Citrix NetScaler A10 等如浪潮inspair,深信服sangfor國產的硬件設備 軟件: lvs:Linux Virtual Server nginx:支持四層調度 haproxy:支持四層調度 ats perbal pound 各種軟件適用於各種平臺,需求都不一樣等等 但是萬變不離其宗的是原理都是一樣的,只不過在處理方式上,功能性能上各有千秋罷了,所以一開始的解決方案帶給我了理解處理問題的思路後,其實許多其他也只是其功能的擴展或者增強而已。 會話保持 調度算法 健康檢查
HA(high available)
SPOF single point of failtrue heartbeat keepalived
HPC(high-)
分布式部署
CDN
2、LVS
2.1 LVS介紹
-
官網
[http://www.linuxvirtualserver.org]
-
工作原理
VS根據請求報文的目的IP地址和協議及端口將其調度轉發至某RS,根據調度算法來選擇RS
VS為virtual server,RS為real server就是個老鴇子,有人來了請求,小班的有一批人,大班的有一批人,一批人中業務熟練就多給幾個人,老鴇子就是LVS。
計算機是人的思想產物,人的思想產物造就了社會系統,同樣適用於計算機系統。LVS類似於iptables中
內核中用ipvs實現
通過ipvsadm來配置先關的調度策略
ipvs工作與類似iptables中的netfilter的INPUT前,當數據包來了之後,在INPUT前做了ipvs,然後根據報文的ip地址和端口信息然後截胡,將其按照ipvsadm指定的轉發規則,重新發給響應的RS服務器。所以LVS工作在OSI模型的四層,
-
LVS的優缺點
優點:
1、性能好
2、應用在並發鏈接很多的情況下使用
缺點:
1、功能單一,只能基於4層調度
2、不能檢查後端的RS的健康狀態
2.2 LVS相關概念
VS
RS
CIP:client ip
VIP:virtual server ip
DIP:director ip
RIP:real server ip
lvs: ipvsadm/ipvs
ipvsadm:用戶空間的命令行工具,規則管理器
用於管理集群服務及RealServer
ipvs:工作於內核空間netfilter的INPUT鉤子上的框架
-
lvs集群的類型:
lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
lvs-dr:操縱封裝新的MAC地址
lvs-tun:在原請求IP報文之外新加一個IP首部
lvs-fullnat:修改請求報文的源和目標IP - 1、LVS-NAT模式
工作原理:
主要是數據到達VS後,VS根據VSIP和調度算法,去服務地址池中去查找哪些節點提供此服務,然後將數據包的Dip改為RSip,可能還會改變Dport。然後RS上的網關需指向DIP。
VS最終對用戶做響應
應用場景:
1、此模式對RS修改較少,
- 2、LVS-DR模式
工作原理:
主要是數據回去不經過VS,CIP數據到網關,然後網關去找VIP地址,數據到達VIP之後,VIP根據調度算法,轉發給響應的RIP,此時目標MAC構建為RIP的MAC地址,此時數據轉發出去,不經過TCP/IP的ip層檢查。不會經過網關,通過交換機時查看mac表,然後轉發給RIP,因此VS和RS必須在同一個交換機下,但是不用在同一個ip網絡中,然後RIP收到ip地址,查看mac是自己的,然後再看DIP是VIP,為本機的lo地址,所以處理響應,然後響應時,通過查找路由表,源ip為VIP,源mac為RS MAC,目的ip為CIP,目的mac為CMAC
換句話只有VS的VIP是真實的對外提供arp響應的,RS的VIP是虛擬的值只是用於對VS轉發來的報文進行本地處理和本地路由轉發,可以不經過來時的路,因為VS直接通過目的MAC為RS轉發給RS,當報文從VS的接口發出後直接到達交換機,交換機通過MAC table去進行二層轉發到RS上,RS收到報文後發現目的ip為本機lo的地址,則進行處理,然後封裝報文,源ip為vip,目的ip為cip,然後通過路由轉發。因此前提VS和RS必須在同連接到同一個廣播域的物理設備上。否則通過二層轉發,vs不能將數據包發給rs。
RS最終對用戶做響應
修改ARP不處理:
要使RS的VIP稱為虛的VIP,不對外提供arp的響應和發布,
1、arptables工具
2、sysctl修改內核參數
3、在路由器上做arp靜態幫助,發往vip的數據包只發給VS,但是rs的內核參數依然要改,要不然如windows os上如果ip地址沖突會報警的。而且會有一些不必要的影響。
應用場景:
1、對服務器操作較多。
2、VS和RS不能跨廣播域
- 3、LVS-TUN模式
工作原理:
方式和DR類似,不同的是不是封裝目的MAC地址,而是通過在IP報文首部前加上新的IP首部(源ip為DIP,目的ip為RIP),將報文發往調度的RS,RS直接響應給客戶端。
應用場景:
1、VS和RS可以不在同一廣播域。
2、VS對外提供真實的VIP地址
3、
- 4、LVS-FULLNAT模式
工作原理:
此類型kernel默認不支持
同時修改請求報文的源ip和目的ip地址進行轉發,CIP改為DIP,VIP改為RIP
應用場景:
1、VS和RS可以跨網段,這個我在浪潮負載上做的就是LVS-NAT和LVS-FULLNAT模式。
FULLNAT就要給VIP做一個NAT地址池,此處用於將CIP改為地址池的中的地址,RS指定的網關為源網關只要能到達NAT地址池中的地址也就是DIP即可。RS服務器本身也不需要修改內核arp參數,配置VIP地址。
-
5、LVS工作模式對比分析
LVS-NAT和LVS-FULLNAT:請求報文和響應報文都要經過VS,因為有nat session
LVS-DR和LVS-TUN:
2.3 調度算法
ipvs scheduler
根據其調度時是否考慮服務器的負載情況分為兩種:靜態和動態方法,共10種
-
靜態方法:
1、RR:RoundRobin 輪詢
2、WRR:Weigh RoundRobin 加權
3、SH:Source Hash 源地址哈希
4、DH:Destination Hash 目的地址哈希,應用於RS前有多臺防火墻時
- 動態方法:
通過計算RS的overload,負載越小,優先轉發
1、LC:Least Connnections
overload=active*256+inactive
2、WLC:Weighted LC,默認調度算法
overload=(active*256+inactive)/weight
3、SED:Shortest Expection Delay
overload=(active+1)*256/weight
4、NQ:Never Queue
5、LBLC:Locality-Based LC
6、LBLCR:
- 另一種解釋
我又要開始扯了,調度算法就像工廠裏幹活一樣。
接了一批活,然後有一批人,那麽怎麽分配活給這些工人呢,活就是客戶端的請求,一批工人就是服務器RS,分配怎麽幹活的就是VS調度器了。老板接活員工幹,有4種靜態的方法分配工作。
1、輪詢的方式:就是流水線。
2、加權的方式:這個員工幹的快,多給他些活幹,加工資
3、源地址哈希:這個A公司的活你幹過你熟悉,你來
4、目的地址哈希:這個是給B公司的活你幹活你熟悉,你來
以上不考慮員工死活的做法,老板早晚得倒閉
所以有根據員工工作量的情況來分配的方法
1、誰現在工作最少給誰優先多些活幹,但是沒有考慮到你給他活,但是它幹的慢啊
2、因此在上個基礎上又有了新的解決方案,wlc,權重高又工作量少的優先幹
3、
LVS實現 ipvsadm/ipvs
ipvs為內核中代碼,ipvsadm為用戶空間命令,用來配置LVS
yum install ipvsadm
- 格式
Usage:
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 --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
Commands:
Either long or short options are allowed.
--add-service -A add virtual service with options
--edit-service -E edit virtual service with options
--delete-service -D delete virtual service
--clear -C clear the whole table
--restore -R restore rules from stdin
--save -S save rules to stdout
--add-server -a add real server with options
--edit-server -e edit real server with options
--delete-server -d delete real server
--list -L|-l list the table
--zero -Z zero counters in a service or all services
--set tcp tcpfin udp set connection timeout values
--start-daemon start connection sync daemon
--stop-daemon stop connection sync daemon
--help -h display this help message
-
選項
集群服務相關:
-A|E:添加/修改集群服務
-t:tcp -u:udp -f:firewall_mark service_address -t:ip:port -u:ip:port -f:firewall_mark -s:指定調度算法 默認wlc -p:president connection timeout
-D:刪除集群服務
-C:清空定義的集群服務
-L|l:查看集群服務
-n: 數字形式
--stats:
--rate:
-c:connnection-Z:清零集群服務的統計信息
RS相關:
-a|e:添加/修改指定集群服務的節點
-t|u|f service_address:指名添加到那個集群服務 -r service_address:指定RS的地址,ip[:port]當允許端口映射時,可以指定端口 -g|i|m:指定LVS模式類型 -g gateway,DR模式;-i ipip,TUN模式;-m manquerade,NAT模式,默認-g -w:weight當調度算法有權重時使用
-d:刪除指定集群服務的節點/real server
備份(到標準輸出)
ipvsadm -S
ipvsadm-save恢復(從標準輸入)
ipvsadm -R
ipvsadm-restore
2.4 會話保持
1、session綁定:始終將統一請求的鏈接調度到同一服務器,沒有容錯能力,有損調度效果
2、session同步:在RS之間同步session,RS上有所有集群的session,大規模集群模式下不適用
3、session服務器:部署一臺session服務器,專門存放session信息。存在SPOF,需要做HA
2.5 LVS持久性連接
對共享同一組RS的多個集群服務,需要統一進行綁定,無法使用lvs sh算法進行調度。
實現無論使用任何調度算法,在一段時間內(默認360s ),能夠實現將來自同一個地址的請求始終發往同一個RS
PCC:每客戶端持久,來自同一客戶端訪問某個VIP的所有鏈接統一轉發個某個RS,範圍太大
PPC:每端口持久,來自同一客戶端訪問某個VIP的某個端口的連接統一轉發給某個RS,範圍太小
PFMC:每防火墻標記持久,基於firewall mark的,將來自同一客戶端訪問某個VIP的多個端口的連接統一轉發給某個RS,
ipvsadm -A -t 172.18.0.1:0 -p 200
ipvsadm -A -t 172.18.0.1:80 -p 200
ipvsadm -A -f 1 -p 200
對應以上三種持久性連接配置
ipvsadm -vnL --persistent-conn 查看持久性連接信息
2.6 LVS高可靠性
1 Director不可用,整個系統將不可用;SPoF Single Point of Failure
解決方案:高可用
keepalived heartbeat/corosync
2 某RS不可用時,Director依然會調度請求至此RS
解決方案: 由Director對各RS健康狀態進行檢查,失敗時禁用,成功時啟用
keepalived heartbeat/corosync ldirectord
檢測方式:
(a) 網絡層檢測,icmp
(b) 傳輸層檢測,端口探測
(c) 應用層檢測,請求某關鍵資源
3、RS全不用時:backup server, sorry server
- ldirectord
? ldirectord:監控和控制LVS守護進程,可管理LVS規則
? 包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm yum install ldirectord
? 文件:
/etc/ha.d/ldirectord.cf 主配置文件
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
/usr/lib/systemd/system/ldirectord.service 服務
/usr/sbin/ldirectord 主程序
/var/log/ldirectord.log 日誌
/var/run/ldirectord.ldirectord.pid pid文件
Ldirectord配置文件示例
checktimeout=3
checkinterval=1
autoreload=yes
logfile=“/var/log/ldirectord.log“ #日誌文件
quiescent=no #down時yes權重為0,no為刪除
virtual=5 #指定VS的FWM或IP:port
real=172.16.0.7:80 gate 2
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate #sorry server
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request="index.html"
receive=“Test Ldirectord"
-
實例
參考普通筆記之LVS之DR,NAT模式配置
Linux集群技術之LB之LVS