LVS+Keepalived 實現高可用負載均衡

Fururur發表於2020-07-28

前言

在業務量達到一定量的時候,往往單機的服務是會出現瓶頸的。此時最常見的方式就是通過負載均衡來進行橫向擴充套件。其中我們最常用的軟體就是 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 中的 stateBACKUP

配置完成後,分別重啟 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。

NAT-3

因此,我們需要在 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 目前已經正確配置在網路卡上。

image-20200728165028112

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

image-20200723101409290

接下面我們試著訪問一下 VIP。

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

看到服務可正常輪詢。

image-20200723100952996

此時手動停止一個 RS,再次訪問 VIP,LVS 會自動剔除無法訪問的服務,重啟後,服務會被自動新增。

image-20200723103233100

image-20200723102858257

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

image-20200723103504355

image-20200723103315113

此時,如果重啟 MASTER 後,VIP 又會飄回去。MASTER 的優先順序高於 BACKUP,從而實現 HA。

image-20200723103538358

總結

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

參考文獻

相關文章