1. 程式人生 > >使用LVS負載均衡搭建web群集的原理及安裝配置詳解

使用LVS負載均衡搭建web群集的原理及安裝配置詳解

chmod 特點 Go 內核空間 col rpc mac地址 網絡文件系統 IT

一、負載均衡LVS基本介紹

LVS是 Linux Virtual Server 的簡稱,也就是Linux虛擬服務器。這是一個由章文嵩博士發起的一個開源項目,它的官方網站是 http://www.linuxvirtualserver.org。 LVS是Linux內核標準的一部分。LVS是一個實現負載均衡集群的開源軟件項目,通過 LVS 的負載均衡技術和 Linux操作系統可以實現一個高性能高可用的 Linux 服務器集群,它具有良好的可靠性、可擴展性和可操作性。LVS架構從邏輯上可分為調度層、Server集群層和共享存儲。LVS實際上相當於基於IP地址的虛擬化應用。

二、LVS的組成

LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。

  1. ipvs(ip virtual server):工作在內核空間,是真正生效實現調度的代碼。
  2. ipvsadm:工作在用戶空間,負責為ipvs內核框架編寫規則,定義誰是集群服務,而誰是後端真實的服務器(Real Server)

三、LVS相關術語

  1. DS:Director Server, 指的是前端負載均衡器節點。
  2. RS:Real Server, 後端真實的工作服務器。
  3. VIP:向外部直接面向用戶請求,作為用戶請求的目標的IP地址。
  4. DIP:Director Server IP, 前端負載均衡器IP地址,主要用於和內部主機通信。
  5. RIP:Real Server IP, 後端服務器的IP地址。
  6. CIP:Client IP, 訪問客戶端的IP地址

四、LVS的工作模式介紹

LVS負載均衡常見的有三種工作模式,分別是地址轉換(簡稱NAT模式)、IP隧道(簡稱TUN模式)和直接路由(簡稱DR模式),其實企業中最常用的是 DR 實現方式,而 NAT 配置上比較簡單和方便,下面總結 DR 和 NAT 原理和特點:

1. LVS-NAT模式

(1) LVS-NAT原理

類似於防火墻的私有網絡結構,Director Server作為所有服務器節點的網關,,即作為客戶端的訪問入口,也是各節點回應客戶端的訪問出口,其外網地址作為整個群集的VIP地址,其內網地址與後端服務器Real Server在同一個物理網絡,Real Server必須使用私有IP地址。

技術分享圖片

數據包流向分析

  • 用戶發送請求到Director Server,請求的數據報文(源IP是CIP,目標IP是VIP)到達內核空間。

  • 內核空間判斷數據包的目標IP是本機,此時IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為後端服務器IP,重新封裝數據包(源IP為CIP,目標IP為RIP),然後選路將數據包發送給Real Server。

  • Real Server比對發現目標IP是本機的IP,重新封裝報文(源IP為RIP,目標IP為CIP)發回給Director Server。

  • Director Server重新封裝數據包,將源IP地址修改為自己的VIP地址,然後響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP。

(2) LVS-NAT模型的特點

  • RS必須使用私有IP地址,網關指向DIP。

  • DIP與RIP必須在同一網段內。

  • DS作為所有服務器節點的網關,也就是說請求和響應報文都需要經過Director Server。

  • 支持端口映射

  • 高負載場景中,Director Server壓力比較大,易成為性能瓶頸。

2. LVS-DR模式

(1) LVS-DR原理

Director Server作為群集的訪問入口,但不作為網關使用,後端服務器池中的Real Server與Director Server在同一個物理網絡中,發送給客戶機的數據包不需要經過Director Server。為了響應對整個群集的訪問,DS與RS都需要配置有VIP地址。
技術分享圖片
數據包流向分析

  • 用戶發送請求到Director Server,請求的數據報文(源IP是CIP,目標IP是VIP)到達內核空間。

  • 由於DS和RS在同一個網絡中,所以是通過二層數據鏈路層來傳輸。
  • 內核空間判斷數據包的目標IP是本機IP,此時IPVS比對數據包請求的服務是否為集群服務,若是,重新封裝數據包,修改源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址,源IP地址與目標IP地址沒有改變,然後將數據包發送給Real Server.
  • RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文,重新封裝報文(源IP地址為VIP,目標IP為CIP),將響應報文通過lo接口傳送給eth0網卡然後向外發出。
  • RS直接將響應報文傳送到客戶端。

(2) LVS-DR模型的特點

  • RS和DS必須在同一個物理網絡中。
  • RS可以使用私有地址,也可以使用公網地址,如果使用公網地址,可以通過互聯網對RIP進行直接訪問。
  • 所有的請求報文經由Director。 Server,但響應報文必須不能經過Director Server。
  • RS的網關絕不允許指向DIP(不允許數據包經過director)。
  • RS上的lo接口配置VIP的IP地址。

LVS-DR模式需要註意的是:
保證前端路由將目標地址為VIP報文統統發給Director Server,而不是RS。

解決方案是:修改RS上內核參數(arp_ignore和arp_announce)將RS上的VIP配置在lo接口的別名上,並限制其不能響應對VIP地址解析請求。

  • arp_ignore=1表示系統只響應目的IP為本地IP的ARP請求。

  • arp_announce=2表示系統不使用IP包的源地址來設置ARP請求的源地址,而選擇發送接口的IP地址。

五、LVS的負載調度算法

最常用的有四種;輪詢(rr)、加權輪詢(wrr)、最少連接(lc)和加權最少連接(wlc)。

  • 輪詢(rr):將收到的訪問請求按照順序輪流調度到不同的服務器上,不管後端真實服務器的實際連接數和系統負載。
  • 加權輪詢(wrr):給RS設置權重,權重越高,那麽分發的請求數越多,權重的取值範圍0–100。根據每臺服務器的性能,給每臺服務器添加權值,如果RS1的權值為1,RS2的權值為2,那麽調度到RS2的請求會是RS1的2倍。權值越高的服務器,處理的請求越多。這種算法是對rr算法的一種優化和補充。
  • 最少連接(lc):根據後端RS的連接數來決定把請求分發給誰,比RS1連接數比RS2連接數少,那麽請求就優先發給RS1。
  • 加權最少連接(wlc):根據後端RS的權重和連接數來決定把請求分發給誰,權重較高,連接數少的RS會優先處理請求。

六、LVS的共享存儲服務器

為後端真實服務器提供穩定、一致的文件存取服務,在Linux/Unix環境中,共享存儲可以使用NAS設備或者提供NFS(網絡文件系統)共享服務的專用服務器。一般放在私有網絡中。

七、實現LVS的NAT模式

1.實驗環境

IP地址規劃

客戶端訪問服務的請求IP地址:VIP 12.0.0.1

Server IP 系統
Director Server DIP 192.168.10.1 CentOS7
NFS Server 192.168.10.50 RedHat6
Real Server1 RIP 192.168.10.51 CentOS7
Real Server2 RIP 192.168.10.52 CentOS7

在配置的Director的服務器上添加兩塊網卡,詳細步驟可參考DNS分離解析這篇博文有介紹,設置外網ens37為VIP,內網ens33為DIP,把兩個 real server 的網關設置為 Director 的內網 iP即DIP。

在虛擬機的配置中DIP網絡連接方式設置為僅主機模式,Real Server也配置為僅主機模式。
技術分享圖片

2.安裝和配置

yum安裝軟件

方法一:如果虛擬機網絡是僅主機模式,沒有網絡,可以本地創建yum倉庫,然後進行yum安裝。

方法二:如果虛擬機網絡是NAT模式,有網絡,可以在線yum安裝。

(1) 配置NFS服務器
yum install nfs-utils -y    #7系統版本需要安裝nfs工具包
service rpcbind start  
service nfs restart
#創建共享目錄
mkdir /opt/wwwroot1
mkdir /opt/wwwroot2
#給共享目錄寫入權限
chmod 777 /opt/wwwroot1
chmod 777 /opt/wwwroot2
#編輯配置文件
vim /etc/exports
/opt/wwwroot1 192.168.10.0/24(rw,sync) 
/opt/wwwroot2 192.168.10.0/24(rw,sync) 
#發布共享
exportfs -rv
#關閉防火墻
service iptables stop
(2) 配置兩個real server服務器
#安裝nfs客戶端
yum install nfs-utils -y 
systemctl start rpcbind.service  
systemctl start nfs.service
#查看nfs掛載
showmount -e 192.168.10.50
#掛載nfs

#Real Server1掛載nfs

#法一:直接掛載
mount.nfs 192.168.10.50:/opt/wwwroot1 /var/www/html

#法二:修改fatab文件掛載
vim /etc/fstab
  192.168.10.50:/opt/wwwroot1 /var/www/html nfs defaults,_netdev  0 0

#Real Server2掛載nfs

方法同Real Server1,將掛載目錄/opt/wwwroot1改成/opt/wwwroot2,其余一樣。
#安裝httpd
yum install httpd -y
#real server1創建測試網頁
echo "Server 192.168.10.51" > /var/www/html/index.html
#real server2創建測試網頁
echo "Server 192.168.10.52" > /var/www/html/index.html
#啟動httpd服務
systemctl start httpd.service 
systemctl enable httpd.service 
#關閉防火墻和安全性策略
systemctl stop  firewalld.service 
systemctl disable firewalld.service
setenforce 0
#測試網頁打開是否正常
firefox http://127.0.0.1/

技術分享圖片
技術分享圖片

(3) 配置Director server服務器
#安裝ipvsadm管理工具
yum install ipvsadm -y
#加載LVS內核模塊
modprobe ip_vs
#查看ip_vs版本信息
cat /proc/net/ip_vs  

技術分享圖片

#開啟路由轉發
#法一:編輯sysctl.conf文件,永久路由轉發
vim /etc/sysctl.conf
  net.ipv4.ip_forward=1
sysctl -p
#法二:直接編輯,臨時路由轉發
echo "1" > /proc/sys/net/ipv4/ip_forward
#配置SNAT轉發規則,設置nat防火墻
iptables -F -t nat      #清空nat防火墻
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens37 -j SNAT --to-source 12.0.0.1
#Director 上編輯 nat 實現負載分配腳本
# 設置 ipvsadm
vim nat.sh
 #!/bin/bash
 ipvsadm-save  > /etc/sysconfig/ipvsadm   #保存策略
 service ipvsadm start 
 ipvsadm -C     #清除內核虛擬服務器表中的所有記錄
 ipvsadm -A -t 12.0.0.1:80 -s rr  #創建虛擬服務器
 ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.51:80 -m 
 ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.52:80 -m 
 ipvsadm

ipvsadm管理工具的選項用法:

  • -A: 表示添加虛擬服務器
  • -t: 用來指定VIP地址及TCP端口
  • -s: 用來指定負載均衡調度算法
  • -a: 表示添加真實服務器
  • -r: 用來指定RIP地址及TCP端口
  • -m: 表示使用NAT群集模式
  • -g: 表示使用DR群集模式
  • -i: 表示使用TUN群集模式
  • -w: 用來設置權重
#保存nat腳本後直接運行
chmod +x nat.sh
./nat.sh

技術分享圖片

#查看ipvsadm設置的規則
ipvsadm -ln

技術分享圖片

3.測試LVS群集

用Windows客戶端直接訪問http://12.0.0.1, 將能夠看到由真實服務器提供的網頁內容。

第一次訪問:
技術分享圖片
Real Server連接次數查看:
技術分享圖片
刷新一次:
技術分享圖片
Real Server連接次數查看:
技術分享圖片

八、實現LVS的DR模式

1.實驗環境

四臺機器:

Director節點: (ens33 192.168.10.53 vip ens33:0 192.168.10.80)

Real server1: (ens33 192.168.10.51 vip lo:0 192.168.10.80)

Real server2: (ens33 192.168.10.52 vip lo:0 192.168.10.80)

NFS Server: 192.168.10.50

2.安裝和配置

(1) 配置NFS server服務器

步驟如上

(2) 配置兩個real server服務器
#配置虛擬IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
 DEVICE=lo:0
 IPADDR=192.168.10.80
 NETMASK=255.255.255.255  #子網掩碼必須全為1
 ONBOOT=yes 
ifup lo:0 

技術分享圖片

#安裝nfs客戶端
yum install nfs-utils -y 
service rpcbind start  
service nfs restart
#查看nfs掛載
showmount -e 192.168.10.50
#掛載nfs

#Real Server1掛載nfs

#法一:直接掛載
mount.nfs 192.168.10.50:/opt/wwwroot1 /var/www/html

#法二:修改fatab文件掛載
vim /etc/fstab
  192.168.10.50:/opt/wwwroot1 /var/www/html nfs defaults,_netdev  0 0

#Real Server2掛載nfs

方法同Real Server1,將掛載目錄/opt/wwwroot1改成/opt/wwwroot2,其余一樣。
#安裝httpd
yum install httpd -y
#real server1創建測試網頁
echo "Server 192.168.10.51" > /var/www/html/index.html
#real server2創建測試網頁
echo "Server 192.168.10.52" > /var/www/html/index.html
#啟動httpd服務
systemctl start httpd.service 
systemctl enable httpd.service 
#關閉防火墻和安全性策略
systemctl stop  firewalld.service 
systemctl disable firewalld.service
setenforce 0
#在兩臺real server上配置啟動腳本
vim /etc/init.d/rs.sh
  #!/bin/bash
  VIP=192.168.10.80
        case "$1" in
        start)
                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)
                ifconfig lo:0 down
                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 Stopd"
                ;;
        *)
                echo "Usage: $0 {start|stop}"
                exit 1
        esac
        exit 0
#保存後直接運行腳本
chmod +x rs.sh
service rs.sh start

先在本機上自測一下訪問網頁:
技術分享圖片
技術分享圖片

(2) 配置Director server服務器
#配置虛擬IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
 DEVICE=ens33:0
 ONBOOT=yes
 IPADDR=192.168.10.80
 NETMASK=255.255.255.0
ifup ens33:0 

技術分享圖片

#安裝ipvsadm
yum install ipvsadm -y  

vim /etc/sysctl.conf
#開啟路由功能
  net.ipv4.ip_forward=1

#調整/proc響應參數,關閉Linux內核重定向參數響應
  net.ipv4.conf.all.send_redirects = 0  
  net.ipv4.conf.default.send_redirects = 0
  net.ipv4.conf.ens33.send_redirects = 0
sysctl -p 
配置啟動腳本
vim /etc/init.d/dr.sh
 #!/bin/bash
 GW=192.168.10.1
 VIP=192.168.10.80
 RIP1=192.168.10.51
 RIP2=192.168.10.52
 case "$1" in
        start)
        /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
        systemctl start ipvsadm    
        /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
        /sbin/route add -host $VIP dev ens33:0
        /sbin/ipvsadm -A -t $VIP:80 -s rr
        /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
        /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
        echo "ipvsadm starting --------------------[ok]"
        ;;
        stop)
        /sbin/ipvsadm -C
        systemctl stop ipvsadm
        ifconfig ens33:0 down
        route del $VIP
        echo "ipvsamd stoped----------------------[ok]"
         ;;
        status)
        if [ ! -e /var/lock/subsys/ipvsadm ];then
        echo "ipvsadm stoped---------------"
        exit 1
                else
                echo "ipvsamd Runing ---------[ok]"
        fi
        ;;
        *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
esac
exit 0

chmod +x /etc/init.d/dr.sh
service dr.sh start
#關閉防火墻和安全策略
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

3.測試LVS群集

用Windows客戶端直接訪問 http://192.168.10.80/, 將能夠看到由真實服務器提供的網頁內容。

第一次訪問:

技術分享圖片
Real Server連接次數查看:
技術分享圖片
刷新一次:
技術分享圖片

Real Server連接次數查看:

技術分享圖片

九、LVS結合keepalive

LVS可以實現負載均衡,但是不能夠故障切換和健康檢查,也就是當一個rs服務器出現故障時,LVS仍然會把請求轉發給故障的rs服務器,這樣就會導致請求無效。keepalive軟件可以解決 LVS 單點故障的問題,能同時實現 LVS 的高可用性。這裏以LVS-DR模式為例。

1.實驗環境

五臺機器:

  • Keepalived1 + lvs1(Director1):192.168.10.53 (主)
  • Keepalived2 + lvs2(Director2):192.168.10.54 (從)
  • Real server1:192.168.10.51
  • Real server2:192.168.10.52
  • NFS Server: 192.168.10.55
  • VIP: 192.168.10.80

2.安裝配置

在實現LVS的DR模式前提下,在兩個Director Server 節點服務器部署keepalived服務。

#安裝keepalive軟件
yum install keepalived -y

主keepalived節點配置(lvs1)

#主節點( MASTER )配置文件
vim /etc/keepalived/keepalived.conf
 global_defs {
  ...    #省略部分
  smtp_server 127.0.0.1           #指向本地
  router_id LVS_01               #指定名稱,備份服務器不同名稱
  ...    #省略部分          
}

 vrrp_instance VI_1 {        #定義VRRP熱備實例
    state MASTER            #MASTER表示主調度器
    interface ens33         #承載VIP地址的物理接口
    virtual_router_id 51    #虛擬路由器的ID號,每個熱備組保持一致
    priority 100            #主調度器優先級
    advert_int 1            #通告間隔秒數
    authentication {        #認證信息
        auth_type PASS      #認證類型
        auth_pass 1111      #字碼密串
    }
    virtual_ipaddress {     #指定群集VIP地址,也就是漂移地址
        192.168.10.80
    }
}

virtual_server 192.168.10.80 80 {  #虛擬服務器VIP地址
    delay_loop 6                   #健康檢查的間隔時間
    lb_algo rr                     #輪詢rr的調度算法
    lb_kind DR                     #直接路由工作模式
    persistence_timeout 0          #連接保持時間
    protocol TCP                   #應用服務采用的是TCP協議

    real_server 192.168.10.51 80 {  

                        #第一個web節點的服務器地址、端口
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80       
        }
    }

    real_server 192.168.10.52 80 {  

                       #第二個web節點的服務器地址、端口
 router_id LVS_01         weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

從keepalived節點配置(lvs2)
拷貝主節點的配置文件keepalived.conf,然後修改如下內容:

router_id LV ->  router_id LVS_02 #從調度器名稱
state MASTER -> state BACKUP  #從調度器
priority 100 -> priority 90   #從調度器優先級

啟動keepalive

#先主後從分別啟動keepalive
systemctl start keepalived.service
systemctl status keepalived.service

3.測試 keepalived 的HA特性

(1)虛擬IP地址漂移

首先在master(lvs1)上執行命令 ip addr ,可以看到vip在master節點上的;
技術分享圖片
這時如果在master上執行 systemctl stop keepalived.service命令,這時vip已經不在master上,在slave節點上執行 ip addr 命令可以看到 vip 已經正確漂到slave節點。這時客戶端去訪問http://192.168.10.80 訪問依然正常。

systemctl stop keepalived.service     #在lvs1主調度器上停止keepalived服務

技術分享圖片
(2)連通性
在客戶機執行“ping 192.168.10.80 -t”,能夠正常ping通。
禁用master(lvs1)的ens33網卡,發現還是能正常ping通的。
技術分享圖片
技術分享圖片

(3)web訪問測試

禁用master(lvs1)的ens33網卡,再次訪問上述web服務,網頁文檔顯示正常。
技術分享圖片
技術分享圖片
技術分享圖片

使用LVS負載均衡搭建web群集的原理及安裝配置詳解