LVS的DR模式

參考: http://www.linuxvirtualserver.org/software/ipvs.html


1.LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。

2.三個主要組成部分:

負載調度器(load balancer),它是整個集羣對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址上的。它可以是用IP負載均衡技術的負載調度器,也可以是基於內容請求分發的負載調度器,還可以是兩者的結合。

服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有WEB、MAIL、FTP和DNS等。

後端存儲(backend storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。

3.負載均衡方式:

1)NAT:需要修改/etc/sysctl.conf的forward,不需要啓動realserver腳本

2)TUN:返回給用戶的IP爲VIP,需要啓動realserver腳本

3)DR:返回給用戶的IP爲VIP,需要啓動realserver腳本,無隧道開銷

理論上性能:DR>TUN>NAT

4.負載調度算法

1)輪叫調度(Round-Robin):以輪叫的方式依次將請求調度不同的服務器,即每次調度執行i = (i + 1) mod n,並選出第i臺服務器。算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。

##平均對待每一臺real server,而不管服務器上的實際負載均衡狀況和連接狀態。

2)加權輪叫調度(Weighted Round-Robin)

##根據real server的不同處理能力來調度請求,可以對每臺real server 設置不同的調度權值

3)最小連接調度(Least-Connection):把新的連接請求分配到當前連接數最小的服務器。最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服務器的負載情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中止或超時,其連接數減一。

##動態地將網路請求調度到已建立的連接數最少的服務器上。如果集羣系統的real server具有相近的性能,可以較好的均衡負載。

4)加權最小連接調度(Weighted Least-Connection):最小連接調度的超集,各個服務器用相應的權值表示其處理性能。服務器的缺省權值爲1,系統管理員可以動態地設置服務器的權值。加權最小連接調度在調度新連接時儘可能使服務器的已建立連接數和其權值成比例。

##每個服務器節點可以用相應的權值來表示處理能力,而系統管理源可以動態的設置相應的權值,默認值爲1.加權最小連接調度在分配新連接請求時儘可能使服務節點的已建立連接數和其權值成正比。

5)基於局部性的最少鏈接(Locality-Based Least Connections):針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集羣系統,因爲在Cache集羣中客戶請求報文的目標IP地址是變化的。這裏假設任何後端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和主存Cache命中率,從而整個集羣系統的處理能力。

6)帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication):也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。

7)目標地址散列調度(Destination Hashing):針對目標IP地址的負載均衡,但它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。

8)源地址散列調度(Source Hashing):正好與目標地址散列調度算法相反,它根據請求的源IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。它採用的散列函數與目標地址散列調度算法的相同。

9)最短預期延時調度(Shortest Expected Delay)

10)不排隊調度(Never Queue Scheduling)

##################案例1:LVS的DR模式 ######################
1.網絡架構
hostname:CentOS001
DIRECT SERVER:10.10.54.54
vip:10.10.54.53

real server:10.10.54.56(80/3306)
real server:10.10.54.58(80/3306)

2.配置兩臺real server
//在real server(56,58)上啓動
[root@xiao56 ~]# cat /etc/init.d/realserver
============================================
#!/bin/bash
#description:start realserver
#script_name:realserver_config
VIP=10.10.54.53
source /etc/init.d/functions
case "$1" in
start)
echo "start LVS of 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)
/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
=================================================
[root@xiao56 ~]# chmod +x /etc/init.d/realserver
[root@xiao56 ~]# /etc/init.d/realserver start
########
arp_ignore:
0---爲默認值,迴應任何網絡接口上對任何本地IP地址的ARP查詢請求
1---只回答目標IP地址是來訪問網路接口本地地址的ARP查詢請求

arp_announce:對網路接口上,本地IP地址發出的ARP請求,作出相應級別的限制:確定不同程度的限制,宣佈對來自本地源IP地址發出ARP請求的接口。
0---爲默認值,在任意網絡接口上的任何本地地址。
2---對查詢目標使用最適當的本地地址。

3.配置direct server(54)
//在direct server上編譯ipvsadm,keepalived軟件包
##下載
wget http://www.keepalived.org/software/keepalived-1.2.9.tar.gz
     http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
##編譯ipvsadm
[root@CentOS001 softs]# tar xvf ipvsadm-1.26.tar.gz
[root@CentOS001 softs]# cd ipvsadm-1.26
1)安裝依賴包
yum -y install wget libnl* popt* gcc.x86_64 gcc-c++.x86_64 gcc-objc++.x86_64 kernel-devel.x86_64 make popt-static.x86_64
## popt-static.x86_64需要額外新加張盤
[root@CentOS001 ~]# vim /etc/yum.repos.d/CentOS-ftp.repo
=============================================
[Packages]
name=Packages
baseurl=ftp://10.201.1.221/Packages
gpgcheck=0
enabled=1

[Packages2]
name=Packages2
baseurl=ftp://10.201.1.221/Packages2
gpgcheck=0
enabled=1
==============================================
##記得yum clean all
2)[root@CentOS001 ipvsadm-1.26]# make && make install
3)確認lvs模塊
[root@tech2 ipvsadm-1.26]# modprobe -l|grep ipvs
=========================================
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
======================================
4)編譯keepalive安裝
AA)[root@CentOS001 softs]# tar xvf keepalived-1.2.9.tar.gz
BB)vim INSTALL
  In order to compile Keepalived needs the following libraries :
===========================
  * OpenSSL, <www.openssl.org>
  * popt
=============================
5)編譯
aa)./configure --prefix=/usr/local/keepalived --enable-snmp --sysconfigdir=/etc/
Keepalived configuration
------------------------
Keepalived version       : 1.2.9
Compiler                 : gcc
Compiler flags           : -g -O2
Extra Lib                : -Wl,-z,relro -Wl,-z,now -L/usr/lib64 -lnetsnmpagent -lnetsnmphelpers -lnetsnmpmibs -lnetsnmp -Wl,-E -Wl,-rpath,/usr/lib64/perl5/CORE -lssl -lcrypto -lcrypt  -lnl
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
IPVS use libnl           : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
SNMP support             : Yes
SHA1 support             : No
Use Debug flags          : No
-------------------------------
##安裝
yum install -y net-snmp.x86_64 net-snmp-devel.x86_64
bb)make && make install
6)修改配置文件路徑
[root@CentOS001 sbin]# cp /usr/local/keepalived/sbin/keepalived  /sbin/
[root@CentOS001 bin]# cp /usr/local/keepalived/bin/genhash /bin/
7)備份配置文件
[root@CentOS001 ~]# cp  /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
8)創建VIP
[root@CentOS001 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0:1
===========================
DEVICE=eth0:1
ONBOOT=no
BOOTPROTO=static
IPADDR=10.10.54.53
NETMASK=255.255.255.0
GATEWAY=10.10.54.254
==========================
[root@CentOS001 ~]# /etc/init.d/network restart
9)配置配置文件
[root@CentOS001 keepalived]# cat keepalived.conf
============================================
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server mail.ssr.com
   smtp_connect_timeout 30
   router_id LVS_MASTER1  ---表示運行keepalived服務器的一個標識,發郵件時顯示在郵件主題中的信息
}

vrrp_instance VI_2 {    --vrrp實例
    state MASTER        --主用MASTER標識,從用BACKUP標識
    interface eth0
    virtual_router_id 51 --虛擬路由標識,是一個數字,同一個VRRP實例使用唯一的標識
                         ---即同一個vrrp_instance下,MASTER和BACKUP必須一致
    priority 100         --優先級,從的優先級要低於主的,用於主從模式,BACKUP的要低於100
    advert_int 1         --master和backup檢查的時間間隔
    authentication {
        auth_type PASS    --認證的類型:PASS和AH
        auth_pass 1111
    }
    virtual_ipaddress {     --虛擬IP,通信中會轉移,不發送ARP廣播
        10.10.54.53/24 dev eth0 label eth0:1  --對外提供服務的IP
    }
}

virtual_server 10.10.54.53 80 {
    delay_loop 6             --設置運行情況檢查時間,單位爲S
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
   persistence_timeout 50     --會話保持時間,單位爲S,同一臺機器只能開啓一個,否則用telnet測試會顯示不完全
    protocol TCP
##HTTP balance
    real_server 10.10.54.56 80 {
        weight 1               --權重
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3       --失敗重試的次數
            delay_before_retry 3  --重試的時間間隔,,單位爲S
            connect_port 80
        }
    }
    real_server 10.10.54.58 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
virtual_server 10.10.54.53 3306 {
    delay_loop 6             --設置運行情況檢查時間,單位爲S
    lb_algo rr
    lb_kind DR
   # nat_mask 255.255.255.0
   # persistence_timeout 50     --會話保持時間,單位爲S,同一臺機器只能開啓一個,否則用telnet測試會顯示不完全
    protocol TCP
##mysql balance
    real_server 10.10.54.56 3306 {
        weight 1               --權重
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3       --失敗重試的次數
            delay_before_retry 3  --重試的時間間隔,,單位爲S
            connect_port 3306
        }
    }
    real_server 10.10.54.58 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}
================================================================
[root@CentOS001 ~]# /etc/init.d/keepalived restart
注:一個virtual_server內的端口號必須一致,否則會出現連接不上。
4.測試
telnet 10.10.54.53 80/3306
解析:退出重新連接會漂移到另一臺realserver上,測試mysql時要啓動服務,並授予權限。
##查看連接數
[root@CentOS001 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.54.53:80 rr
  -> 10.10.54.56:80               Route   1      0          0
  -> 10.10.54.58:80               Route   1      0          0
TCP  10.10.54.53:3306 rr
  -> 10.10.54.56:3306             Route   1      1          1
  -> 10.10.54.58:3306             Route   1      0          3

  擴展:
NGINX-->七層
LVS是四層負載均衡
按照OSI模型,IP協議映射到3層網絡層協議,TCP和UDP協議映射到4層傳輸層協議。
要實現一套負載均衡系統,必須基於OSI模型4層以上。以一個例子來做說明原因:假設我們要設計一套支持HTTP,以輪詢爲分發策略的負載均衡系統,後端有兩臺Real Server。如果我們的負載均衡系統是基於3層(網絡層),要發起HTTP請求,首先需要進行TCP三次握手以建立可靠的傳輸連接。三次握手會發出若干個數據包,由於基於3層的負載均衡器沒有能力知道這些數據包是爲了建立連接,只能將數據包以輪詢的方式,分別發送到Real Server A和Real Server B。這樣TCP的三次握手根本就無法成功。
負載均衡系統必須建立在面對網絡連接的基礎上,而不是面對數據包的基礎上。這套系統需要能夠理解傳輸層網絡連接,保證一次連接之內的所有數據包都轉發到同一後端真實服務器上去。OSI模型4層(傳輸層)才能提供可靠的數據傳輸服務,因此它必須基於OSI模型4層之上。

發佈了142 篇原創文章 · 獲贊 337 · 訪問量 224萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章