1. 程式人生 > >Linux集群技術之LB之LVS

Linux集群技術之LB之LVS

LVS

時間:2018.3.1
作者:李強
參考: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