當前位置: 妍妍網 > 碼農

Linux運維應知必會的LVS高可用負載均衡方案

2024-06-04碼農

關註上方 浩道Linux ,回復 資料 ,即可獲取海量 L inux Python 網路通訊、網路安全 等學習資料!

前言

大家好,這裏是 浩道Linux ,主要給大家分享 L inux P ython 網路通訊、網路安全等 相關的IT知識平台。

今天浩道跟大家分享LVS高可用負載均衡方案相關的硬核幹貨,作為一名Linux運維人員,建議大家都將此方案玩一遍!

文章來源:https://www.cnblogs.com/Sinte-Beuve/p/13392747.html

背景

在業務量達到一定量的時候,往往單機的服務是會出現瓶頸的。此時最常見的方式就是透過負載均衡來進行橫向擴充套件。其中我們最常用的軟體就是 Nginx。透過其反向代理的能力能夠輕松實作負載均衡,當有服務出現異常,也能夠自動剔除。但是負載均衡服務自身也可能出現故障,因此需要引入其他的軟體來實作負載均衡服務的高可用。本文就介紹了一種基於 LVS+Keepalived 的方式,來實作高可用 Web 集群。

LVS 與 Keepalived

LVS 是一種預裝在 Linux 系統中,基於四層、具有強大效能的反向代理伺服器。ipvsadm 是 LVS 的命令列管理工具。

LVS 特點是:

  1. 首先它是基於 4 層的網路協定的,抗負載能力強,對於伺服器的硬體要求除了網卡外,其他沒有太多要求;

  2. 配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,大大減少了人為出錯的機率;

  3. 套用範圍比較廣,不僅僅對 web 服務做負載均衡,還可以對其他套用(mysql)做負載均衡;

  4. LVS 架構中存在一個虛擬 IP 的概念,需要向 IDC 多申請一個 IP 來做虛擬 IP。

Keepalived 是一個基於 VRRP 協定來實作的服務高可用方案,可以利用其來避免 IP 單點故障,一般與其它負載均衡技術(如 LVS 、HAProxy 、Nginx)一起工作來達到集群的高可用。Keepalived 是 LVS 的擴充套件計畫, 因此它們之間具備良好的相容性,可直接透過 Keepalived 的配置檔來配置 LVS。

LVS 的工作原理可見參考文獻

關於 LVS 和 Keepalived 詳細的結構和原理,以及 LVS 和我們常用的 LB 軟體 Nginx 的異同,可以閱讀末尾提供的參考文獻。接下來將介紹如何部署一個高可用的負載均衡集群。

相關術語

  • LB (Load Balancer 負載均衡)

  • HA (High Available 高可用)

  • Failover (失敗切換)

  • Cluster (集群)

  • LVS (Linux Virtual Server Linux 虛擬伺服器)

  • DS (Director Server),指的是前端負載均衡器節點

  • RS (Real Server),後端真實的工作伺服器

  • VIP (Virtual IP),虛擬的 IP 地址,向外部直接面向使用者請求,作為使用者請求的目標的 IP 地址

  • DIP (Director IP),主要用於和內部主機通訊的 IP 地址

  • RIP (Real Server IP),後端伺服器的 IP 地址

  • CIP (Client IP),存取客戶端的 IP 地址

  • 測試環境

    軟體環境:CentOS7、Keepalived1.3.5、ipvsadm1.27

    DS1(MASTER):172.17.13.120

    DS1(BACKUP):172.17.13.123

    RS1:172.17.13.142:80 Nginx

    RS1:172.17.13.173:80 Nginx

    VIP:172.17.13.252

    |
    +----------------+-----------------+
    | |
    172.17.13.120|---- VIP:172.17.13.252 ----|172.17.13.123
    +-------+--------+ +--------+-------+
    | DS1 | | DS2 |
    | LVS+Keepalived | | LVS+Keepalived |
    +-------+--------+ +--------+-------+
    | |
    +----------------+-----------------+
    |
    +------------+ | +------------+
    | RS1 |172.17.13.142 | 172.17.13.173| RS2 |
    | Web Server +--------------+---------------+ Web Server |
    +------------+ +------------+

    集群的架構圖如上圖所示。DS1、DS2 為兩個 LB 節點,RS1、RS2 為兩個真實的服務節點,透過一個虛擬的 IP 地址對外提供服務。

    最終我們要達到的目標為:

    1. Client 透過 VIP 存取服務能夠將請求根據配置的規則進行分發(LB)

    2. 當 MATSER 的 LB 節點故障時,自動切換到 BACKUP 的 LB 節點上,保證服務正常存取;MASTER 恢復後,再次作為主 LB 負載節點

    3. 當某個 RS 節點故障時,自動剔除該節點;恢復後,再次加入集群

    詳細配置流程

    安裝相關軟體

    [root@localhost ~]# yum install ipvsadm keepalived -y

    配置 Keepalived

    1. DS1(MASTER) 節點

    [root@localhost ~]# vi /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
    router_id LVS_DEVEL
    }
    vrrp_instance VI_1 {
    state MASTER # 兩個 DS,一個為 MASTER 一個為 BACKUP
    interface enp1s0 # 當前 IP 對應的網路介面,透過 ifconfig 查詢
    virtual_router_id 62 # 虛擬路由 ID(0-255),在一個 VRRP 例項中主備伺服器 ID 必須一樣
    priority 200 # 優先級值設定:MASTER 要比 BACKUP 的值大
    advert_int 1 # 通告時間間隔:單位秒,主備要一致
    authentication { # 認證機制,主從節點保持一致即可
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    172.17.13.252 # VIP,可配置多個
    }
    }
    # LB 配置
    virtual_server 172.17.13.252 80 {
    delay_loop 3 # 設定健康狀態檢查時間
    lb_algo rr # 排程演算法,這裏用了 rr 輪詢演算法
    lb_kind DR # 這裏測試用了 Direct Route 模式
    persistence_timeout 50 # 持久連線超時時間
    protocol TCP
    real_server 172.17.13.173 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    retry 3 # 舊版本為 nb_get_retry
    delay_before_retry 3
    connect_port 80
    }
    }
    real_server 172.17.13.142 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    retry 3
    delay_before_retry 3
    connect_port 80
    }
    }
    }

    1. DS2(BACKUP) 節點

    復制之前的配置檔,修改 vrrp_instance VI_1 中的 state BACKUP

    配置完成後,分別重新開機 Keepalived 服務。

    [root@localhost ~]# systemctl restart keepalived

    配置 RS

    RS 配置主要分兩部份,一部份是 web 服務,另一部份是網路轉發配置。

    web 服務部署不多展開了,根據實際情況來,可以是 Tomcat 也可以是 Nginx,只要能透過 ip:port 能存取到即可。

    在網路轉發配置上,LVS 支持多種通訊模型(NAT、DR、TUN),本文采用 DR 模型來進行通訊,大致的流程如下圖所示。請求封包從到達 LB 後,LVS 會將這個封包的 MAC 地址改成輪詢到的 RS 的 MAC 地址,並丟給交換機;RS 收到後進行處理並從網卡的 lo 埠發送出去,響應報文到達交換機後直接轉發給 Client。

    因此,我們需要在 RS 的網卡上配置 lo 為 VIP。配置指令碼如下

    #!/bin/bash
    SNS_VIP=172.17.13.252
    case "$1" in
    start)
    ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
    /sbin/route add -host $SNS_VIP dev lo:0
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p >/dev/null 2>&1
    echo "RealServer Start OK"
    ;;
    stop)
    ifconfig lo:0 down
    route del $SNS_VIP >/dev/null 2>&1
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "RealServer Stoped"
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    esac
    exit 0

    本地建立完後,並執行。

    [root@localhost ~]# chmod a+x lvs-web.sh
    [root@localhost ~]# ./lvs-web.sh start

    配置完成後,透過 VIP 就可以存取到 RS 上的服務了。

    HA 測試

    配置完雙機熱備後,我們就可以測試下,節點發生故障後以及 LB 切換失敗後,能否保證服務的 HA。

    在 LB 的主節點上輸入 ip a ,可以看到 VIP 目前已經正確配置在網卡上。

    輸入 watch ipvsadm -Ln --stats 可即時看到負載均衡的結果,正常。

    接下面我們試著存取一下 VIP。

    [root@localhost ~]# while true ; do curl 172.17.13.252; sleep 1;done

    看到服務可正常輪詢。

    此時手動停止一個 RS,再次存取 VIP,LVS 會自動剔除無法存取的服務,重新開機後,服務會被自動添加。

    如果此時,手動停止 MASTER 上的 Keepalived,模擬 LB MASTER 節點掛了,VIP 會自動飄到 BACKUP LB 上。

    此時,如果重新開機 MASTER 後,VIP 又會飄回去。MASTER 的優先級高於 BACKUP,從而實作 HA。

    總結

    本文介紹了使用 LVS+Keepalived 來實作高可用負載均衡,這能使得我們的服務能夠更加的穩定。Keepalived 預設是執行在 LVS 之上的,有較好的相容性,當然我們也可以使使用者 Nginx 作為 LB 的軟體,可根據業務和兩者的異同進行選擇。

    更多精彩

    關註公眾號 浩道Linux

    浩道Linux ,專註於 Linux系統 的相關知識、 網路通訊 網路安全 Python相關 知識以及涵蓋IT行業相關技能的學習, 理論與實戰結合,真正讓你在學習工作中真正去用到所學。同時也會分享一些面試經驗,助你找到高薪offer,讓我們一起去學習,一起去進步,一起去漲薪!期待您的加入~~~ 關註回復「資料」可 免費獲取學習資料 (含有電子書籍、視訊等)。

    喜歡的話,記得 點「贊」 「在看」