1. 程式人生 > >LVS+Keepalived 實現高可用負載均衡

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

## 前言 在業務量達到一定量的時候,往往單機的服務是會出現瓶頸的。此時最常見的方式就是通過負載均衡來進行橫向擴充套件。其中我們最常用的軟體就是 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 節點故障時,自動剔除該節點;恢復後,再次加入叢集 ## 詳細配置流程 ### 安裝相關軟體 ```bash [root@localhost ~]# yum install ipvsadm keepalived -y ``` ### 配置 Keepalived 1. DS1(MASTER) 節點 ```bash [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 } } } ``` 2. DS2(BACKUP) 節點 複製之前的配置檔案,修改 `vrrp_instance VI_1` 中的 `state` 為 `BACKUP`。 配置完成後,分別重啟 Keepalived 服務。 ```bash [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](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/NAT-3.png?x-oss-process=style/logo) 因此,我們需要在 RS 的網絡卡上配置 lo 為 VIP。配置指令碼如下 ```shell #!/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 ``` 本地建立完後,並執行。 ```bash [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](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200728165028112.png?x-oss-process=style/logo) 輸入 `watch ipvsadm -Ln --stats` 可實時看到負載均衡的結果,正常。 ![image-20200723101409290](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723101409290.png?x-oss-process=style/logo) 接下面我們試著訪問一下 VIP。 ```bash [root@localhost ~]# while true ; do curl 172.17.13.252; sleep 1;done ``` 看到服務可正常輪詢。 ![image-20200723100952996](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723100952996.png?x-oss-process=style/logo) 此時手動停止一個 RS,再次訪問 VIP,LVS 會自動剔除無法訪問的服務,重啟後,服務會被自動新增。 ![image-20200723103233100](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723103233100.png?x-oss-process=style/logo) ![image-20200723102858257](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723102858257.png?x-oss-process=style/logo) 如果此時,手動停止 MASTER 上的 Keepalived,模擬 LB MASTER 節點掛了,VIP 會自動飄到 BACKUP LB 上。 ![image-20200723103504355](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723103504355.png?x-oss-process=style/logo) ![image-20200723103315113](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723103315113.png?x-oss-process=style/logo) 此時,如果重啟 MASTER 後,VIP 又會飄回去。MASTER 的優先順序高於 BACKUP,從而實現 HA。 ![image-20200723103538358](https://blog-20190524.oss-cn-hangzhou.aliyuncs.com/images/LVS%2BKeepalived-HA-LB/image-20200723103538358.png?x-oss-process=style/logo) ## 總結 本文介紹了使用 LVS+Keepalived 來實現高可用負載均衡,這能使得我們的服務能夠更加的穩定。Keepalived 預設是執行在 LVS 之上的,有較好的相容性,當然我們也可以使使用者 Nginx 作為 LB 的軟體,可根據業務和兩者的異同進行選擇。 ## 參考文獻 - [LVS Keepalived 雙機高可用負載均衡搭建](https://www.centos.bz/2017/07/lvs-keepalived-ha-loadbalace/) - [LVS 和 Keepalived 的原理介紹和配置實踐](https://wsgzao.github.io/post/lvs-keepalived/) - [【大型網站技術實踐】初級篇:藉助 LVS+Keepalived 實現負載均衡](https://www.cnblogs.com/edisonchou/p/4281978.html) - [Centos7 LVS+Keepalived 實現負載 / 高可用之 DR 獨立部署及詳解](http://jiangyu86.cn/2018/03/08/cluster/lvs_normal_dr/) - [Keepalived 原理介紹和配置實踐](https://wsgzao.github.io/post/keep