1. 程式人生 > >LVS和Keepalived簡介

LVS和Keepalived簡介

LVS簡介

  1. LVS是Linux Virtual Server的縮寫,其主要的功能是實現負載均衡。其可用性=可用時間/(可用時間+故障恢復時間),通常用百分比來表示;99.9%表示一年的故障時間少於8小時;99.99%表示一年的故障時間少於53分鐘;99.999%表示一年的故障時間小於5分鐘。

  2. 核心元件:
    lp_vs:linux核心功能模組,工作在核心,依賴該核心模組實現負載均衡功能。lp_vs:linux核心功能模組,工作在核心,依賴該核心模組實現負載均衡功能。
    ipvsadm:應用層程式,可與lp_vs通訊實現對負載均衡的管理和控制。

  3. LVS的工作模式
    lvs有四種工作模式分別為DR模式、NET模式、TUNNEL模式、FULLNET模式。


    *DR模式直接路由
    原理:使用者先向DNS伺服器傳送域名解析,DNS向用戶返回解析結果此結果為代理伺服器的ip地址和mac地址,使用者正式向代理伺服器傳送請求,代理伺服器接受請求後會重新分裝該請求,通過預先設定的演算法找出一個後端的web伺服器的mac地址將資料包的目標mac地址改為此mac地址;然後在內網中廣播,後端的web伺服器接收資料包後會判斷其目標mac地址與自己的mac地址是否相同,如果相同就會處理該資料包,處理完成後直接傳送給使用者;如果不相同則丟棄該資料報。
    *NAT模式
    原理:使用者先向DNS傳送域名解析,DNS將解析結構返回給使用者,這裡的返回結果是代理伺服器上的一個虛擬ip,我們稱之為vip;使用者向vip傳送資料報這時代理伺服器會接收此資料報;然後通過預先設定的演算法找出一個後端節點的真實ip我們稱之為RIP,代理伺服器重新封裝資料包將目標ip改為RIP;web伺服器收到代理伺服器的轉發資料包後,處理資料包,處理完成後將處理結果返回給代理伺服器,再由代理伺服器轉發給使用者。
    *TUNNEL模式

    這裡我們不做詳細介紹,TUNNEL會在原有的報文基礎上新增一個新的ip報頭。
    *FULLNAT模式
    是NAT模型的擴充套件代理伺服器和web伺服器可以不在同一網段。

  4. LVS的排程演算法分為兩大類靜態演算法動態演算法
    *靜態演算法:無視後端節點的負載情況,按照固定的方式給後端節點分配使用者請求。

  • rr:Round Bobin 輪詢,將使用者請求交替分配給後端節點。
  • wrr:Weighted Round Bobin:加權輪詢,按照不同的比例分配給後端節點。
  • dh:Destination Hashing目標地址雜湊排程,基於使用者的地址做雜湊表。將相同地址的使用者的請求排程到同一個後端主機上。
  • sh:Source Hashing原地址雜湊排程,基於使用者的ip地址做雜湊表。將同一客戶排程到同一後端節點。
    *動態演算法:代理伺服器會監測後端的節點的負載情況,將新使用者的請求排程到一個負載較少的後端節點。
  • lc:Least Connection最小連線數排程。
  • wlc:Weighted Least Connection加權最小連線數
  • SED:是wlc的補充,為了降低overhead出現重複的情況
  • NQ:Never Queue基本和SED相同,為了避免效能較差的後端節點長時間空閒
  • lblc:基於目標地址的最小連線數排程
  • lblcr:帶有複製功能的lblc

Keepalived

keepalived最初是為LVS負載均衡設計的,用來管理並監控LVS叢集中各個節點的狀態,後加入了實現高可用的VRRP功能。VRRP(Virtual Router Redundancy Protocol)虛擬路由冗餘協議,是為了解決靜態路由中的單點故障問題,VRRP是一種基於優先順序的競選機制來完成處理,競選出的主節點會一直髮送廣播包,備用節點一直監聽這些廣播包,當備用節點無法接受到主節點發出的廣播包時就會再次競選出一個新的主節點來提供服務,保證服務的高可用。

keepalived的配置檔案說明
在這裡插入圖片描述

keepalived對RS做健康檢查的方式

  1. HTTP_GET:向後端的RS傳送http請求,如果請求成功,說明後端節點正常(RS是web服務的時候比較常用)
  2. TCP:嘗試與後端RS建立TCP連線,如果成功,說明後端節點正常【僅僅是檢查RS系統是否正常工作,不能檢查具體的業務】
  3. SMTP:對郵件伺服器做健康檢測
  4. MISC:通過指令碼的方式實現健康檢測
  • TCP健康檢測方式舉例
    TCP_CHECK { # 通過TcpCheck判斷RealServer的健康狀態
    connect_timeout 10 # 連線超時時間
    nb_get_retry 3 # 重連次數
    delay_before_retry 3 # 重連時間間隔
    connect_port 80 # 檢測埠
    }

  • HTTP_GET健康檢測方式舉例
    HTTP_GET {
    url {
    path check/t.html # 檢查的uri地址
    digest 1362a91278f0 # 用keepalived自帶的genhash生成
    connect_timeout 3 # 連結超時時間
    nb_get_retry 3 # 重連次數
    delay_before_retry 3 # 重連時間間隔
    connect_port 6500 # 檢測埠
    }

  • MISC健康檢測方式舉例
    MISC_CHECK {
    misc_path “/tmp/check.sh http://1.2.3.4:80/c/200.jsp” # 呼叫外部程式或者指令碼的路徑和引數
    misc_timeout 10 # 指令碼執行的超時時間
    misc_dynamic # 動態權重標誌。
    # 指令碼返回0 則檢測成功,權重不變
    # 返回1表示失敗,權重設定為0
    }

    check.sh指令碼示例

    #!/bin/bash
    if [ $# -ne 1 ]; then
        echo "Warning: command param error."
        exit 1
    else
        CHECK_URL=$1
        CMD=/usr/bin/curl -I ${CHECK_URL} 2>/dev/null | grep "200 OK" | wc -l`    
         if [ ${CMD} -eq 1 ]; then
             echo "Succ: Check proxy ${CHECK_URL} is succeed."
            exit 0
        else
            echo "Fail: check proxy ${CHECK_URL} is failed."
            exit 1
        fi
    fi