LVS學習筆記-lvs+nginx+keepalived

準備

準備3臺centos服務器172.20.x.40,172.20.x.41,172.20.x.42作爲一個LVS+nginx的負載集羣,其中172.20.x.40作爲LVS-master,172.20.x.36.41作爲LVS-Backup;172.20.x.42172.20.x.44作爲nginx負載向後面業務服務器負載。

第一次接觸lvs+nginx+keepalived的集羣負載,好多不懂,中間折騰了好久,截圖與實際的ip有些不符合,最終的集羣服務信息如下

名稱 ip 說明 備註
虛擬地址 172.20.36.222:81 對外的ip地址 虛擬的IP地址,注意不能與局域網中的IP地址重複
lvs-master 172.20.36.41 lvs主節點 真實IP地址,需要該機器上的keepalived配置端口,用於VIP的漂移
lvs-backup 172.20.36.42 lvs備節點 真實IP地址,需要該機器上的keepalived配置端口,用於VIP的漂移
nginx-01 172.20.36.43:81 nginx節點01 真實IP地址,實現應用層的業務負載
nginx-02 172.20.36.44:81 nginx節點02 真實IP地址,實現應用層的業務負載

一、環境配置

1. 防火牆

查看防火牆狀態firewall-cmd --state,對於運行的將防火牆關閉systemctl stop firewalld.servicesystemctl disablefirewalld.service
在這裏插入圖片描述

2.selinux設置

關閉每臺服務器selinux,修改/etc/selinux/config,將SELINUX由enforcing修改爲disabled,重啓服務器。
修改selinux的命令# sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
重啓之後,查看服務器selinux狀態sestatus -v
在這裏插入圖片描述

二、ipvs和keepalived安裝及配置

1.LVS服務器上安裝虛擬服務

1)ivps安裝

在LVS-Master和LVS-Backup的服務器上安裝ipvs,輸入命令行:yum -y install ipvsadm,安裝完畢如下:
在這裏插入圖片描述

2)keepalived安裝

在LVS-Master和LVS-Backup的服務器上安裝keepalive,輸入命令行:yum -y install keepalived,如下:
在這裏插入圖片描述

2.配置

分別配置兩臺LVS服務器上的keepalive配置信息。

1)配置Master

配置LVS-Master上的keepalive配置,打開/etc/keepalived/keepalived.conf,修改爲以下配置:

! Configuration File for keepalived
global_defs {
   router_id lvs01
}
vrrp_instance VI_1 {
    state MASTER    
    interface ens33 
    virtual_router_id 100
    priority 100         
    advert_int 1         
    authentication {     
        auth_type PASS   
        auth_pass 1111   
    }
    virtual_ipaddress {  
        172.20.36.222 
    }
}
virtual_server 172.20.36.222 81 {
    delay_loop 6                 
    lb_algo wrr                  
    lb_kind DR                   
    #persistence_timeout 50        
    protocol TCP               
    real_server 172.20.36.43 81 {
    weight 1               
    TCP_CHECK {            
       connect_timeout 10  
       retry 3             
       delay_before_retry 3
       connect_port 81     
       }
    }
     real_server 172.20.36.44 81 {   
     weight 1                  
     TCP_CHECK {               
       connect_timeout 10       
       retry 3              
       delay_before_retry 3       
       connect_port 81          
       }
     }
}

2)配置Backup

打開/etc/keepalived/keepalived.conf,修改爲以下配置:

! Configuration File for keepalived
global_defs {
   router_id lvs02   
}
vrrp_instance VI_1 { 
    state BACKUP     
    interface ens33  
    virtual_router_id 100 
    priority 99           
    advert_int 1          
    authentication {      
        auth_type PASS    
        auth_pass 1111    
    }
    virtual_ipaddress {   
        172.20.36.222 
    }
}
virtual_server 172.20.36.222  81 {
    delay_loop 6
    lb_algo wrr 
    lb_kind DR  
    #persistence_timeout 50          
    protocol TCP             
    real_server 172.20.36.43  81 {      
    weight 1               
    TCP_CHECK {            
       connect_timeout 10  
       retry 3             
       delay_before_retry 3
       connect_port 81     
       }
    }
     real_server 172.20.36.44  81 {   
     weight 1               
     TCP_CHECK {
       connect_timeout 10    
       retry 3            
       delay_before_retry 3      
       connect_port 81        
       }
     }
}

3)Master和Backup的區別

在這裏插入圖片描述
配置說明:
==router_id ==設置當前節點的名稱
==virtual_ipaddress == 設置了虛擬的IP地址172.20.36.100開放端口81,真實的兩個LVS的IP地址爲172.20.36.40172.20.36.41,LVS開放端口80
以上示例的配置採用DR負載均衡和wrr負載調度算法。

3.ipvs簡單介紹
1)三種的ip負載方式:
  • VS/NAT (Virtual Server via Network Address Translation)
    也就是網絡地址翻譯技術實現虛擬服務器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標端口也改成選定的Real Server的相應端口,最後將報文請求發送到選定的Real Server。在服務器端得到數據後,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源端口改成虛擬IP地址和相應端口,然後把數據發送給用戶,完成整個負載調度過程。
    可以看出,在NAT方式下,用戶請求和響應報文都必須經過Director Server地址重寫,當用戶請求越來越多時,調度器的處理能力將稱爲瓶頸
  • VS/TUN(Virtual Server via IP Tunneling)
    也就是IP隧道技術實現虛擬服務器。它的連接調度和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,調度器採用IP隧道技術將用戶請求轉發到某個Real Server,而這個Real Server將直接響應用戶的請求,不再經過前端調度器,此外,對Real Server的地域位置沒有要求,可以和Director Server位於同一個網段,也可以是獨立的一個網絡。因此,在TUN方式中,調度器將只處理用戶的報文請求,集羣系統的吞吐量大大提高。
  • VS/DR(Virtual Server via Direct Routing)
    也就是用直接路由技術實現虛擬服務器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一物理網段上,且真實服務器網絡設備或設備別名不作 ARP 響應。
2)八種負載調度算法
  • 輪叫(Round Robin)
    調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。

  • 加權輪叫(Weighted Round Robin)
    調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

  • 最少鏈接(Least Connections)
    調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集羣系統的真實服務器具有相近的系統性能,採用"最小連接"調度算法可以較好地均衡負載。

  • 加權最少鏈接(Weighted Least Connections)
    在集羣系統中的服務器性能差異較大的情況下,調度器採用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

  • 基於局部性的最少鏈接(Locality-Based Least Connections)
    “基於局部性的最少鏈接” 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務 器,將請求發送到該服務器。

  • 帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
    "帶複製的基於局部性最少鏈接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不同之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小連接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集羣中選出一 臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製的 程度。

  • 目標地址散列(Destination Hashing)
    "目標地址散列"調度算法根據請求的目標IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

  • 源地址散列(Source Hashing)
    "源地址散列"調度算法根據請求的源IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

三、啓動LVS-Master和LVS-Backup上的ipvs服務和keepalived服務

1.ipvs啓動

執行sudo lsmod |grep ip_vs查看ipvs是否已經啓動,若沒有什麼結果則需要啓動ipvs,分別在機器172.20.36.40172.20.36.41上執行啓動命令啓動ipvs,如下:
啓動systemctl start ipvsadm.service
停止systemctl stop ipvsadm.service
重啓systemctl restart ipvsadm.service
查看ipvs的狀態systemctl status ipvsadm.service

在這裏插入圖片描述在這裏插入圖片描述
查看狀態如下,說明ipvs已經啓動。
遇到一個啓動錯誤時的日誌:
在這裏插入圖片描述
最後查詢一圈使用ipvsadm --save > /etc/sysconfig/ipvsadm成功解決,啓動成功:
在這裏插入圖片描述
在這裏插入圖片描述

2.keepalived啓動

查看狀態systemctl status keepalived
啓動systemctl start keepalived
停止systemctl stop keepalived
重啓systemctl restart keepalived
未執行啓動前,查看狀態:
在這裏插入圖片描述
執行啓動命令後,查看狀態:
在這裏插入圖片描述
keepalived的默認日誌文件在/var/log/messages下,有問題可以根據日誌描述解決。

四、安裝和配置nginx節點

1.nginx安裝及配置

詳細請查看 nginx的源碼編譯和安裝

2.配置nginx所有服務器的“路由”

根據上面描述,使用的虛擬IP爲172.20.36.222,需要再真實的nginx服務器上設置虛擬ip、關閉“ARP查詢”功能和設置迴環ip,執行下面的腳本即可:

#!/bin/bash
VIP=172.20.36.222
case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $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)
       /sbin/ifconfig lo:0 down
       /sbin/route del $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

我手邊兩臺nginx的真實ip是172.20.36.43:81172.20.36.44:81,需要在這兩臺機器上執行上面的腳本,執行完成後如下:
在這裏插入圖片描述
這一塊在一開始測試的時候由於參考【參考鏈接】中的腳本,中間一行==/etc/rc.d/init.d/functions==似乎並沒有用,並且會報錯,最後經過測試就刪除了這句。

五、測試

到此爲止我們已經搭建好了基於lvs+keepalived+nginx的集羣負載,我們做一些測試,驗證一下幾個點:
1)VIP漂移和高可用
2)nginx可用性檢測

1.VIP漂移

VIP漂移指的是當ipvs的主節點出現故障的時候,ipvs的備用節點在配置的時間內完成主備切換,對用戶不可感知,並以郵件的方式通知管理員修復出現的故障,keepalived的配置就是用來解決這個問題的。

1)ipvs主備節點無故障時:
A. 主節點紅色框,可用真實nginx負載節點綠色框

在這裏插入圖片描述

B. 主節點的網卡信息,紅色爲虛擬IP

在這裏插入圖片描述

C. 備用節點的網卡信息,並無上圖紅色框的內容,說明此時的master節點正常

在這裏插入圖片描述

D. 數據訪問也正常

在這裏插入圖片描述

2)ipvs主節點故障時,發生VIP漂移
A. 關閉主節點上的keepalived服務製造故障

在這裏插入圖片描述

B. 查看主備用節點的網卡

主節點網卡信息
在這裏插入圖片描述

備用節點網卡信息
在這裏插入圖片描述
從上面兩張圖看,說明已經發生了VIP漂移,並且訪問也正常
在這裏插入圖片描述

2.nginx可用性

製造一個nginx節點異常,將nginx01節點網卡關閉。
在這裏插入圖片描述
直接訪問正常,且返回的是節點2的ip和nginx名稱
在這裏插入圖片描述
到此爲止,lvs+nginx+keepalived的直連權重負載就配置完了。

六、番外篇

除了上面的配置之外,可以手動的去維護ipva集羣信息,主要用於動態的負載一些配置。包括:
1)增刪改ipvs虛擬服務地址
2)給虛擬服務地址增加新的nginx負載地址

1.添加ipvs集羣服務

1)添加ipvs集羣

查看 ipvsadm -ln,在服務器172.20.36.40上執行該命令,查看當前ipvs集羣的狀態,當前ipvs沒有集羣信息。如下:
在這裏插入圖片描述
執行ipvsadm -A -t 172.20.36.100:81 -s rr添加一個ipvs集羣節點,但是報了錯,如下:
在這裏插入圖片描述
排查了很久,最後發現是因爲中間修改過LVS的配置,雖然重啓了LVS,但是並沒有重啓keepalived。調用重啓keepalive的重啓命令後重新加載虛擬IP時成功了:
在這裏插入圖片描述
其中,紅色是重啓指令,綠色是已經配置的兩個LVS的主備地址。

2)給集羣服務中添加真實服務

上一步驟中我們已經添加了ipvaadm的集羣,現在我們需要將兩個LVS-主備真實IP添加到虛擬集羣中去,使用指令
ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.40:80 -m -w 1添加LVS01,ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.41:80 -m -w 1添加LVS02,沒有錯誤提示說明已經添加成功,查看如下:
在這裏插入圖片描述

參考鏈接:
ipvsadm命令
ipvsadm啓動失敗
DR模式下realserver無響應
ipvsadm的統計
自動運維ipvs

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章