linux搭建LVS+keepalive+nginx實現叢集高效能負載均衡配置詳解

Data & safety發表於2020-12-18

關於nginx配置tomcat實現負載均衡可參考http://blog.csdn.net/liqi_q/article/details/78063603

安裝jdk可參考:http://blog.csdn.net/liqi_q/article/details/72963947

關於IP直接訪問nginx可參考http://blog.csdn.net/liqi_q/article/details/78476787

關於lvs長時間輪詢real-server原因可閱讀http://www.capjsj.cn/keepalived_lvs_nginx_tomcat.html

LVS+Keepalived環境裡面,lvs主要的工作是提供排程演算法,把客戶端請求按照需求排程在real伺服器,keepalived主要的工作是提供lvs控制器的一個冗餘,並且對real伺服器做健康檢查,發現不健康的real伺服器,就把它從lvs叢集中剔除,real伺服器只負責提供服務。

二、lvskeepalived的安裝

      環境規劃

      2*(lvs+keepalived伺服器)+n*real-server,一般lvs+keepalived是這樣的架構。

      開始安裝

1  下載軟體包

http://www.linuxvirtualserver.org/ 下載lvs的軟體包

http://www.keepalived.org/ 下載keepalived軟體包

2、先編譯安裝lvs,再安裝keepalived,安裝lvs需要核心原始碼

下載lvs原始碼的時候,一定要選擇你核心版本對應的原始碼包。

# uname  -r

2.6.18-164.el5PAE

#yum install kernel-devel -y  //安裝核心原始碼包

#ln -s /usr/src/kernels/2.6.18-164.el5PAE-i686/ /usr/src/linux

#wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz  //ipvsadm包就是lvs軟體包,別覺得名字不一樣

# tar -zxvf ipvsadm-1.24.tar.gz

# cd ipvsadm-1.24

#make && make install

檢查lvs是否安裝成功:

#ipvsadm //檢視是否有輸出

#lsmod | grep ip_vs  //如果ipvsadm有輸出,那麼使用這個命令檢視是否載入ip_vs模組,如果載入,那麼lvs算安裝成功。

2  編譯安裝keepalived,一定在安裝完lvs以後在安裝keepalive

Keeplive的下載地址:http://www.keepalived.org/download.html

wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz //不建議選擇最新的版本

1.tar -zxvf keepalived-1.2.2.tar.gz
2.cd keepalived-1.2.2
3

./configure --prefix=/  

Keepalived version       : 1.1.15

Compiler                 : gcc

Compiler flags           : -g -O2

Extra Lib                : -lpopt -lssl -lcrypto

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

Use VRRP Framework       : Yes

Use LinkWatch            : No

Use Debug flags          : Nod

 

看見如上輸入,注意yesno的值,如果一樣,證明配置成功,如果lvsno,那麼證明你的lvs沒有安裝成功,需要從新安裝lvs再安裝keepalived

yum -y install openssl-devel    
4.make && make install 
5.cd /etc/keepalived/ 


 

三、LVS VS/DR模式搭建

環境介紹

主機IP

角色

安裝軟體

10.10.10.168

Lvs+keepalived MASTER

Ipvsadm keepalived

10.10.10.169

Lvs+keepalived BACKUP

Ipvsadm keepalived

10.10.10.170

Real server

Lvs_real指令碼

10.10.10.171

Real server

Lvs_real指令碼

10.10.10.11

VIP

 

注意:所有機器都在一個交換機,並且在一個網段。

1、在168169上安裝ipvsadmkeepalived軟體。

2、修改keepalived的配置檔案



7.vi keepalived.conf 
Keepalive
安裝預設目錄會在less /etc/keepalived/keepalived.conf 
 

[root@test01 nginx]# cat /etc/keepalived/keepalived.conf 
#ConfigurationFile for keepalived  
global_defs {  
        #notification_email {                        ######
定義接受郵件的郵箱  
        #       wangjj@hrloo.com  
   #}  
 #notification_email_from jiankong@staff.tuge.com    ######
定義傳送郵件的郵箱  
 #smtp_server mail.tuge.com  
 #smtp_connect_timeout 10  
}  
vrrp_script check_lvs {                   ######
定義監控nginx的指令碼  
    script "/root/check_lvs.sh"  
    interval 1                            ######
監控時間間隔  
    weight 2                              ######
負載引數  
  }  
vrrp_instance vrrptest {                 ######
定義vrrptest例項  
   state MASTER                                 ######
伺服器狀態  
   nopreempt                                    #
非搶佔模式
   interface eth0                     ######使用的介面  
   virtual_router_id 51               ######
虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換  
   priority 150                       ######
服務啟動優先順序,值越大,優先順序越高,BACKUP 不能大於MASTER  
   advert_int 1                        ######
伺服器之間的存活檢查時間  
   track_script {                              ######
執行監控nginx程式的指令碼  
      check_lvs  
    }  
   virtual_ipaddress {                         ######
虛擬IP地址  
        10.10.10.11
    }  
}
virtual_server 10.10.10.11 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0             //
此值為0,主要是為了方便測試,每次重新整理頁面結果會不一樣
    protocol TCP
    real_server 10.10.10.170 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.10.10.171 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}  

10.10.10.169

10.10.10.168相比,值需要刪除state MASTER  修改priority的值小於master的。

real server

在所有real server上新增下面指令碼,名執行# cat  /sbin/lvs_real

#!/bin/bash

#description:start realserver

vip=10.10.10.11   #虛擬IP

source /etc/rc.d/init.d/functions

case $1 in

start)

        echo "Start Realserver"

        /sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

        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

;;

stop)

        echo "Stop Realserver"

        /sbin/ifconfig lo:0 down

        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 "Usage: $0 (start | stop)"

exit 1

esac


 

sh /sbin/lvs_real start啟動指令碼為Real server設定迴環共享虛擬IP

執行指令碼以後,使用ip add命令檢視lo介面是否新增了虛擬ip地址。
 

3、配置完成以後,開始測試:

10.10.10.16810.10.10.169上使用ip add檢查,虛擬IP應該配置在168上面。

測試1{主要測試lvs}:訪問虛擬IP是否可以訪問真實伺服器,是否輪詢real server

master上使用 ipvsadm命令檢視lvs狀態。

[root@test01 nginx]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.10.11:http rr
  -> 10.10.10.171:http            Route   1      0          0         
  -> 10.10.10.172:http            Route   1      0          0         
[root@test01 nginx]# 

在客戶端訪問虛擬IP 10.10.10.11,看是否可以訪問。每次重新整理,應該會換一個real server。訪問數次後,通過ipvsadm觀察lvs狀態。

測試2{主要測試keepalived}lvs伺服器的HA,當keepalived master掛掉後,keepalived backup會不會接管虛擬IP

關閉master主機上的keepalived程式。

backupip add檢視是否新增虛擬IP,通過/var/log/message檢視相關轉換日誌。

 

測試3{測試backuplvs}:使用客戶端訪問現在虛擬ip,檢視是否一切正常

      測試完成後,開啟masterkeepalived程式,等虛擬ip轉移到master以後,在從客戶端訪問,檢視是否存在問題

service keepalived stop停止主服務  使用ip addr檢視共享IP是否已經漂移到備機上

 

接下來檢視ipvsadm預設超時時間

[root@DR1 keepalived]# ipvsadm -L --timeout

Timeout (tcp tcpfin udp): 900 120 300

900 120 300這三個數值分別是TCP TCPFINUDP的時間.也就是說一條tcp的連線經過lvs,lvs會把這臺記錄儲存15分鐘,就是因為這個時間過長,所以大部分人都會發現做好LVS DR之後輪詢現象並沒有發生,而且我也看到大部分的教程是沒有說明這一點的,因為是實驗性質,所以將此數值調整為非常小,使用以下命令調整:

[root@DR1 ~]# ipvsadm --set 1 2 1


 

解決同一個使用者session訪問同一臺伺服器

這樣LVS基本就配置完成了,BBS存在使用者session的問題,雖然有很多種解決方法,這裡如果只用lvs來解決的話,就要用到LVS的持久連線了,配置如下:

ipvsadm -E -t 192.168.8.230:80 -s wlc -p 3600

這樣使用者訪問後端一臺RS3600s內都只會訪問這一臺RS,可以發現這樣做會破壞LB的效果,不過可以解決使用者session的問題。



 

LVS排程演算法
(2)負載排程演算法
靜態方法:僅根據演算法本身進行排程
rrRound Robin # 即輪詢
wrrWeighted RR # 即加權輪詢
shSource Hashing # 即來源IP地址hash
dh
Destination Hashing # 即目標地址hash(不常用,僅用於前端多防火牆的場景,保證防火牆的連線追蹤功能有效)
動態方法:根據演算法及RS當前的負載情況
lcLeast Connection
#
評判標準:Overhead=Active*256+Inactive
# Overhead
最小者勝出
wlcWeighted LC
#
評判標準:Overhead=(Active*256+Inactive)/weight
# Overhead
最小者勝出
sedShortest Expect Delay
#
評判標準:Overhead=(Active+1)*256/weight
# Overhead
最小者勝出
nqNever Queue # 叢集開始時工作時,每臺伺服器都至少分配一個連線請求,然後再根據sed演算法排程;
lblcLocality-based Least Connection # 類似於dh+lc
lblcr
Relicated and Locality-based Least Connection # 主要用於後端伺服器是快取伺服器時

 

相關文章