負載均衡 LoadBlance

名詞概念

CIP Client IP,訪問用戶自身的IP
VIP Virtual IP,用戶訪問的目的IP
RIP Real IP,后端webserver的真實IP
DIP 負載均衡器自身的IP

概述

  • 負載均衡是實現將用戶訪問流量分發的方法,自身有高可用(保證存活)的能力(但并不是高可用集群),是以提高服務的并發處理能力為目標的集群搭建方法。

  • 實現負載均衡一般可以使用順序、比重、流量、服務類別等進行分配,LB的部署方式也分為路由和服務直接返回模式。

  • 負載均衡可以通過“軟硬”兩種方法實現:

    • 軟件LB:LVS(四層路由設備)、Nginx(七層負載均衡,主要針對http, smtp, pop3, imap)、Haproxy(通Nginx)

    • 硬件LB:最著名的就F5.(型號 F5 BIG-IP-1500, F5 BIG-IP LTM8800),價格昂貴是它的唯一缺點

LB的主要方式

  • http重定向

    • 根據用戶的http請求計算出一個真實的web服務器的IP地址,并將該web服務器IP地址寫入http重定向中,重新返回給瀏覽器,由瀏覽器重新訪問新的Ip。多應用于下載網站中。
    • 優點:簡單
    • 缺點:瀏覽器需要兩次請求服務器才能完成一次訪問,性能差。http重定向服務器自身的處理能力可能成為其瓶頸。使用http302相應重定向,有可能會使搜索引擎判定為SEO作弊,降低搜索排名。
  • DNS LB

    • DNS LB提供域名到IP解析的過程,將LB部署在DNS解析服務器上。此時DNS服務器也就充當了LB。主要使用了域名運營商提供的只能DNS以及多線解析技術(不過這些跟我們沒多大關系)。具體實現即DNS上配置多個域名對應的IP記錄,域名解析式通過DNS服務器的算法(輪詢)將一個域名請求分配到真實的服務器上。
    • 優點:工作都交給了DNS服務器,省卻了功夫。同時多個DNS還支持基于地理位置的域名解析,將域名解析成距離用戶地理位置最近的一個服務器地址,加快訪問速度,極大程度改善性能。
    • 缺點:①DNS目前為多級解析,每一級(包括本地)都可能存在緩存記錄。當一臺存在于緩存中的服務器下線之后,該服務器對應的DNS記錄可能仍然存在,導致用戶的訪問失敗。②DNSLB的控制權在域名服務商的手中,網站可能無法做出過多的改善和管理,也不能實現按照服務器的處理能力來分配負載。DNS負載均衡采用的是簡單的輪詢算法,不能區分服務器之間的差異,不能反映服務器運行的狀態。
  • 反向代理負載均衡

    • 主要的代表即為代表Nginx,其工作原理是根據負載均衡算法將請求的瀏覽器訪問抓發到不同的web服務器來處理,處理結果經過反向服務器再發送回瀏覽器。
    • 優點:部署簡單,處于http協議層面。
    • 缺點:使用了反向代理服務器后,web服務器RIP不能直接暴露在外,因此web服務器不需要使用外部IP地址,而反向代理服務作為溝通橋梁就需要配置雙網卡、外部內部兩套IP地址。
  • IP負載均衡 代表lvs-nat

    • 在網絡層通過修改目標地址進行負載均衡。用戶訪問請求到達負載均衡服務器后,負載均衡服務器在操作系統內核進程獲取網絡數據包,根據算法得到一臺RIP,然后將用戶請求的目標地址修改成RIP,數據處理完成后返回給負載均衡服務器,負載均衡服務器收到響應后將自身的地址修改為CIP后再將數據返回回去。類似于反向代理。
    • 優點:在響應請求時速度叫反向代理要快。
    • 缺點:當請求數據較大時,速度較慢。
  • 數據鏈路層負載均衡 代表lvs-dr

    • 數據鏈路層修改MAC地址進行負載均衡。負載均衡服務器的DIP和它管理的web服務器集群使用的VIP一致,負載均衡服務器分發過程中不修改訪問地址的IP地址,而是修改MAC地址。
    • 優點:不需要負載均衡服務器進行IP地址的轉換。數據相應時,不需要經過負載均衡服務器。
    • 缺點:負載均衡服務器網卡帶寬要求較高。
  • 物理層負載均衡 代表F5

    • ①F5 BIG-IP提供12種靈活的算法將所有的流量均衡的分配到各個服務器而面對用戶,只是一臺虛擬服務器。②自帶健康性檢查,F5 BIG-IP可以確認應用程序能否對請求返回對應的數據。③F5 BIG-IP具有動態的Session的會話保持功能。④F5 BIG-IP的iRules功能可以做到HTTP內容過濾,根據不同的域名,URL,將訪問請求傳送到不同的服務器。
    • 優點:性能好
    • 缺點:貴

LB中的幾種輪詢算法

  • Fixed Scheduling Method 靜態調度方法
    • RR 輪詢
    • WRR 加權輪詢(需要設置權重)
    • DH 目標地址hash(哈希映射)
    • SH 源地址hash
  • Dynamic Scheduling Method 動態調度方法
    • LC 最小連接
    • WLC 加權最小鏈接
    • LBLC 基于本地的最少連接(找出最近使用的服務器,若該服務器是可用的且沒有超載,則會優先選擇該服務器)
    • LBLCR 帶復制的基于本地的最少連接(與LBLC的不同在于,對應的一個RIP可能所屬與一個集群映射)

LVS

概述

  • LVS是Linux Virtual Server的簡稱,其工作在一臺服務器上提供Directory的功能,本身并不提供任何服務,只是把特定的請求轉發給對應的RealServer,從而實現集群環境中的LB。

NAT轉發模式

NAT

工作原理

  • 客戶端將請求法王前端的Director,請求報文中包含CIP和VIP。
  • Director接收到報文后,若VIP為規則內存在的地址,那么它將客戶端請求報文的VIP改為后端的RIP,并根據算法發送出去。
  • 報文送到Real Server后,由于報文的RIP為自身IP,故會響應該請求,處理完成后返回給LB。
  • Director接收到RS處理完成的報文后將RIP修改為VIP發送給CIP。

配置中注意

  • NAT中RS的網關必須指向LVS,否則報文無法發送給CIP

缺點

因為所有的請求報文都需要Director處理應答,Director自身很可能成為架構的性能瓶頸

DR直接路由模式

DR

工作原理

  • 客戶端將請求發往前段的Director,請求報文包含CIP,VIP
  • Director收到報文后,發現為規則內存在的地址,則將客戶端請求報文源MAC改為自身的DIP的MAC,目標MAC改為RIP的MAC地址,并將其轉發給RS
  • RS接收到報文后,對報文進行處理,然后啟用回環網卡接口(lo)發送到默認網卡(eth0)直接發送給CIP

特點

  • 集群節點和director必須處于一個物理網絡內
  • RIP可以使用公網IP或私有IP
  • director僅處理入站請求,director服務器的壓力小
  • 集群節點網卡不知想director,故出站不經過director
  • 不支持端口映射
  • 大多數系統都可以作為realserver,需要支持ARP廣播

關于ARP的特殊處理法

在配置RS的lo時,需要吧netmask配置為255.255.255.255,防止ARP廣播的影響

TUN-IP隧道模式

TUN

工作原理

  • 客戶端將請求發往前端的Director,請求報文中包含CIP,VIP
  • Director接收到報文后,識別VIP為規則內存在的IP,則Director在客戶端請求的報文前封裝一層IP報文,將源地址改為DIP,轉發到RIP
  • RS接收后,首先拆封第一次IP報文,之后第二層IP報文對應自身lo接口上的VIP,所以會處理請求報文,并將響應報文通過lo結構發給eth0網卡直接發送給CIP

特點

  • 優點
    • Director只負責將請求報文發送給RS,而RS應答發送給CIP。減少Director的數據流。Director不再是系統的瓶頸,能處理巨大的請求量。區別于DR模式,此方法可以實現異地LB。
  • 缺點
    • 隧道模式的RS節點需要合法IP,需要所有的RS都支持"IP Tunneling"(IP Encapsulation)協議,RS可能只能部署Linux服務器

LVS-DR的實際操作

  • 1.在DirectorServer上添加VIP和設置路由
    ifconfig eth0:0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 up
      # 設置VIP和VIP的廣播域和子網掩碼
    echo 'route add -host 192.168.1.2 dev eth0:0' >> /etc/rc/local
      # 永久添加路由
    
  • 2.LVS設置路由條目
    yum -y install ipvsadm 
    #下載安裝LVS
    
    ipvsadm -C
    #清空LVS的規則
    
    ipvasadm -A -t 192.168.1.2:80 -s rr
    # -A為添加virtual_server -t使用tcp協議 -s指定調度策略 rr 輪詢
    
    ipvsadm -a -t 192.168.1.2:80 -r 192.168.1.3:80 -g
    ipvsadm -a -t 192.168.1.2:80 -r 192.168.1.4:80 -g
    # -a 添加realserver -g 指定模式為DR
    
  • 3.讓配置永久生效
    ipvsadm -save > /etc/sysconfig/ipvsadm
    systemctl enable ipvsadm
    
  • 4.在RealServer上進行配置
    RS_1
    ifconfig lo:0 192.168.1.3/32
    #配置lo網卡
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    #忽略arp響應,不允許接受
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    #允許arp發送
    
    在RS_2上執行類似的操作

LVS-NAT的實際操作

  • 1.前期工作
    Director需要兩個網卡,一個外網一個內網,其中外網網卡為VIP,此處取外網網卡IP為10.10.10.2,內網網卡IP為192.168.1.2,兩個RSIP分別為192.168.1.3 192.168.1.4
  • 2.在RS上將Director作為網關
    echo 'route add -net 10.10.10.2/24 gw 192.168.1.2'
    
    RS_2上有相同操作
  • 3.在LVS上的操作
    echo 1 > /proc/sys/net/ipv4/ip_forward    #啟動路由功能
    yum -y install ipvsadm
    ipvsadm -A -t 10.10.10.2:80 -s rr
    ipvsadm -a -t 10.10.10.2:80 -r 192.168.1.3:80 -m
    ipvsadm -a -t 10.10.10.2:80 -r 192.168.1.4:80 -m
    

LVS上的其他操作匯總

# 1.管理虛擬服務
    ipvsadm -A -t IPADDR:PORT -s rr     #添加采用輪詢算法      
    ipvsadm -E -t IPADDR:PORT -s -wrr   #修改算法為加權輪詢   
    ipvsadm -D -t IPADDR:PORT           #刪除虛擬服務          
# 2.管理RS
    ipvsadm -a -t RIP:PORT -r VIP -g -w 2 #加使用DR權重2   
    ipvsadm -e -t RIP:PORT -r VIP -g -w 5 #改權重          
    ipvsadm -d -t RIP:PORT -r VIP         #刪除            
# 3.查看統計
    ipvsadm -Ln                #查看當前              
    ipvsadm -lnc               #查看當前轉發情況       
    ipvsadm -Ln --stats --rate #查看ipvs模塊的轉發     

keepalived高可用集群

keepalived是集群管理中保證集群高可用的一個服務軟件,用于防止單點故障。

工作原理

  • 1.keepalived是以VRRP協議為實現基礎的,VRRP全程Virtual Rou8ter Redundacy Protocol,即虛擬路由冗余協議。
  • 2.實際上,keepalived是將相同功能的server構成一個組,在組中存在一個master和多個backup,master上面對外有對外提供服務的vip,master會發組播,當backup收不到vrrp包時就認為master宕機了,此時按照VRRP的優先級,會選舉一個backup作為master
  • 3.keepalived中主要有三個模塊,為core, check, vrrp
    • core 為keepalived的核心,負責主程序的啟動維護和全局配置文件的加載和解析
    • check負責健康檢查
    • vrrp實現vrrp協議

實際配置

  • 1.環境準備 需準備兩臺以上服務器(此處以兩臺為例),其中一臺搭載Keepalived

    • RS1:192.168.1.3
    • RS2:192.168.1.4
    • VIP:192.168.1.2
  • 2.配置

    • RS1 作為master
    yum -y install keepalived
    
    vi /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    global_defs {
        router_id 1       #設備在組中的標識,可相同
    }
    #vrrp_script chk_nginx {          #健康檢查
        #script "/etc/keepalived/ck_ng.sh"    #檢查腳本
        #interval 2           #檢查頻率
        #weight -5            #priority減5
        #fall 3               #失敗三次
    }
    
    vrrp_instance VI_1 { #VI_1 實例名,兩臺路由器相同
        state MASTER      #主或者從狀態
        interface eth0    #監控網卡
        mcast_src_ip 192.168.1.3      #心跳源IP
        virtual_router_id 55          #虛擬路由編號,主從需一致
        priority 100      #優先級
        advert_int 1      #心跳間隔
    
        authentication {      #秘鑰認證(1-8位)
            auth_type PASS
            auth_pass 123456
        }
    
        virtual_ipaddress{    #VIP
            192.168.0.1/24
        }
    
        #track_script {       #引用腳本
            #chknginx
        }
    }
    
    #修改完成后
    systemctl enable keepalived
    
    • 在RS2上需要修改
      state MASTER 修改為 state BACKUP
      mcat_src_ip 改為自身RIP
      priority 100 改為 99

HAproxy

概述

是一款高性能LB軟件,因為專注負載均衡,相比在七層上的NginxLB,他做的更好,更專業。其處理模式分為單進程模式和多進程模式,分別適應于CPU過剩和內存過剩環境

特點

  • 1.支持tcp/http 兩種協議層的LB,使得LB功能非常豐富
  • 2.支持8種LB算法
  • 3.性能優秀
  • 4.擁有一個出色監控頁面,實時亮節系統的當前情況
  • 5.功能強大的ACL支持(ACL 訪問控制列表)

示例1

HAproxy
  • 環境

    • 三臺以上(此處三臺為例子)互相做好域名解析
    • HAproxy IP: 192.168.1.2/24
    • web1 IP: 192.168.1.3/24
    • web2 IP: 192.168.1.4/24
  • 操作步驟

    • 1.安裝HAproxy
    yum -y install epel-release
    yum -y install haproxy
    
    • 2.配置HAproxy
    global                          #全局配置
        log 127.0.0.1 local3 info   #日志配置
        maxconn 4096                #最大連接限制(優先級低)
        uid nobody
        gid nobody
        daemon                      #守護進程運行
        nbproc 1                    #可生成的進程數
    
    defaults        #默認配置,無配置時啟用該配置
        log     global              #日志使用全局配置
        mode    http                #模式
        maxconn 2048                #最大連接數(優先級中)
        retries 3                   #健康檢查(此處若三此無應答則不可用)
        option  redispatch          #服務不可用后的操作(重定向到別的服務器)
        stats   uri     /haproxy    #狀態模塊
        stats   auth    aaa:123     #狀態模塊認證,可用此用戶名密碼來登錄網頁查看當前負載均衡狀態
        contimeout      5000        #HA和RS請求超時時常
        clitimeout      50000       #客戶端連接時常
        srvtimeout      50000       #HA作為服務器和Cli的鏈接時長
    
    frontend http-in                #前端模塊,后名字隨意
        bind 0.0.0.0:80             #面向用戶監聽的端口和地址
        mode http                   #http模式的LB
        log  global
        option  httplog             #使用httplog格式
        option  httpclose           #防止產生多余的cookie信息
        acl html url_reg -i \.html$     #訪問控制列表名稱html,規則要求url以html結尾
        use_backend html-server if html     #若滿足acl html規則,則推送給后端的服務器 htmlserver
        default_backend html-server     #默認的后端服務器為html-server
    
    backend html-server             #后端,后名字隨意
        mode http                   #模式為http協議層
        balance roundrobin          #輪詢算法
        opption httpchk GET /index.html     #允許使用http協議檢查健康
        cookie SERVERID insert indirect nocache     #轉發CLI請求時插入cookie再轉給RS,若第二次訪問就把cookie除掉
        server html-A web1:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5          #2000毫秒一次檢查甲亢 連續兩次測試通過視為有效,連續失敗5次則服務器宕機
        server html-B web2:80 wight 1 cookie 3 check inter 2000 rise 2 fall 5
    
  • 查看HAproxy的狀態

  • 組群的配置文件配置樣式參考

  • HAproxy_2
      global
          log 127.0.0.1 local3 info      
          maxconn 4096                 
          uid nobody                     
          gid nobody                   
          daemon                       
          nbproc 1                          
          
      
      defaults                     
          log        global
          mode       http     
          maxconn 2048        
          retries     3           
          option  redispatch  
          stats   uri  /haproxy   
          stats auth           wing:123     
          contimeout  5000         
          clitimeout      50000       
          srvtimeout      50000     
          
          
      frontend http-in
          bind 0.0.0.0:80                        
          mode http
          log global
          option httplog  
          option httpclose
          acl php url_reg  -i  \.php$
          acl html url_reg  -i  \.html$
          use_backend php-server if  php
          use_backend html-server if  html
          default_backend html-server
      
    
      backend php-server
          mode http
          balance roundrobin
          option httpchk GET /index.php
          cookie SERVERID insert indirect nocache
          server php-A 192.168.122.30:80 weight 1 cookie 1 check inter 2000 rise 2 fall 5
          server php-B 192.168.122.40:80 weight 1 cookie 2 check inter 2000 rise 2 fall 5
          #cookie 1 標識 serverid 為 1
          #check inter 2000          
          #rise 2    
          #fall 5
      
      backend html-server
          mode http
          balance roundrobin
          option httpchk GET /index.html
          cookie SERVERID insert indirect nocache
          server html-A 192.168.122.10:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
          server html-B 192.168.122.20:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5        
    

Nginx

概述

老熟人

特點和優缺點

  • 特點
    • 1.功能強大,性能卓越,運行穩定
    • 2.配置簡單靈活
    • 3.能夠自動剔除工作不正常的后端服務器
    • 4.上傳文件需要使用異步模式
    • 5.支持多種分配策略,可以分配權重,分配方式靈活
  • 優點
    • Nginx復制用戶請求在后端服務器出現問題是,nginx會再復制一份請求給另一臺后端服務器(LVS在這種情況下只能等待用戶重新發送請求)
  • 缺點
    • 流量會經過nginx,nginx會成為集群架構網絡效率的瓶頸
Nginx

配置

  • 1.同步時間,域名解析,準備IP
  • 2.配置Nginx
    • yum -y install epel-release
    • yum -y isntall nginx
    • vim /etc/nginx/nginx.comf
    upstream html {
        server web1:80 weight=1 max_fails=2 fail_timeout=2;
        server web2:80 weight=1 max_fails=2 fail_timeout=2;
    }
    upstream php{
        server web3:80 weight=1 max_fails=2 fail_timeout=2;
        server web4:80 weight=1 max_fails=2 fail_timeout=2;
    }
    upstream 
    server {
        location / {
            proxy_pass http://html;
        }
        location ~*\.php$ {
            proxy_pass http://php;
        }
    }
    

Nginx支持的狀態參數

  • down 暫停對該服務器的調度
  • backup 類似于LVS Sorry Server,當所有的非backup服務器掛了,則會抓發到這臺服務器
  • max_fails 轉發請求失敗次數
  • fail_timeout 在經歷max_fails次失敗后,暫停真實服務器的事件。

Nginx支持的負載均衡算法

  • RR
  • WRR
  • ip_hash IP摘要,根據每個請求Ip進行調度,可以解決Session的問題,不能使用weight(同一個IP發往同一個服務器)
  • fair 可以根據頁面的大小和加載時間長短進行調度,使用第三方的upstream_fair 模塊,需要加載第三方插件
  • url_hash 按請求的url的hash進行調度,從而使每個url定向到同一個服務器,使用第三方的hash模塊
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 負載均衡集群是 load balance 集群的簡寫,翻譯成中文就是負載均衡集群。常用的負載均衡開源軟件有ngin...
    jiangmo閱讀 1,338評論 0 1
  • 【摘要】 面對大量用戶訪問、高并發請求,海量數據,可以使用高性能的服務器、大型數據庫,存儲設備,高性能Web服務器...
    靜修佛緣閱讀 4,593評論 0 24
  • Linux Cluster: Cluster:計算機集合,為解決某個特定問題組合起來形成的單個系統; Linux ...
    Net夜風閱讀 564評論 0 1
  • 一、負載均衡LVS基本介紹 二、LVS的基本工作原理 1. 當用戶向負載均衡調度器(Director Server...
    梅_梅閱讀 645評論 0 2
  • 一、軟件負載均衡概述 硬件負載均衡性能優越,功能全面,但是價格昂貴,一般適合初期或者土豪級公司長期使用。因此軟件負...
    程序員技術圈閱讀 571評論 0 0