1. 程式人生 > >LVS負載均衡之虛擬主機IP隧道模式

LVS負載均衡之虛擬主機IP隧道模式

 

本文包含LVS負載均衡的IP隧道模式的工作原理,以及如何使用它以大大提高伺服器叢集的擴充套件性。

IP隧道-IP tunneling

IP隧道(IP封裝)是一種將IP資料報封裝到IP資料報中的技術,它允許將預定IP地址的資料報包裝並重定向到另一個IP地址,IP封裝技術目前通常被地用在外聯網,移動IP,IP廣播,隧道式主機。詳情請看NET-3-HOWTO。

如何在LVS上使用IP隧道模式

首先,讓我們通過下圖瞭解虛擬主機的IP隧道原理,虛擬主機IP隧道模式與虛擬主機NAT模式最大的不同就是前者是負載均衡器通過IP隧道將請求傳送給實伺服器,而後者則是通過網路地址翻譯將請求傳送給實伺服器。

當用戶訪問由伺服器叢集提供的虛擬服務時,一個包含有虛擬主機地址的資料包到達。負載均衡器檢查資料包中的目標地址和埠,如果和虛擬服務的地址和埠相匹配,則通過連線排程演算法選擇一個實伺服器,並將此連線新增進記錄連線的Hash表中,然後,負載均衡器將源IP地址封裝到資料包中併發送給所選擇的實伺服器。當該連線上的一個數據包到達,並且該連線仍然在Hash表中,則該資料包仍然會以相同的方式被封裝併發送給該實伺服器。當實伺服器接收到封裝過的包,首先解包,然後處理該請求,最後通過自己的路由表將應答直接返回給使用者。在連線斷開或超時後,連線記錄將從Hash表中刪除。下圖說明了該流程。

注意,實伺服器可以是任何網路的任何IP地址,它們可以分佈在任意的地理位置,但是必須支援IP封包協議,並且將隧道裝置全部配置為啟用,以便能夠正確地對接收的封裝過的包進行解包,並且虛擬IP地址必須配置為不響應ARP,或者系統能被配置為可將資料包從虛擬地址重定到本地socket。

最後,當一個封裝過的包到達,實伺服器解包,並發現該包的目標地址是虛擬地址,表明“噢,這是我的菜,我來搞定。”它處理該請求然後將請求結果直接返回給使用者端。

如何構建核心

首先,獲得最新的linux核心拷貝原始碼。第二,獲得正確版本的IPVS補丁並放入核心中,第三,確保核心編譯的選項被選中,第四,重新構建核心。一旦你正確構建了核心,更新系統核心並重啟系統。

1. 核心2.0.36相匹配的VS 補丁

核心編譯選項如下:

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    [*] Network firewalls
    ...
    [*] IP: forwarding/gatewaying
    ...
    [*] IP: firewalling
    ...
    [*] IP: masquerading
    ...
    [*] IP: ippfvs(LinuxDirector) masquerading (EXPERIMENTAL)
    Virtual server request dispatching technique---
    ( ) VS-NAT
    (X) VS-Tunneling
    ( ) VS-DRouting

你必須選擇一個排程演算法。

    Virtual server scheduling algorithm
    (X) WeightedRoundRobin
    ( ) LeastConnection
    ( ) WeightedLeastConnection
    [ ] IP: enabling ippfvs with the local node feature

最後,cd到ippfvsadm的原始碼目錄,輸入“make install”,在系統目錄安裝ippfvsadm。

2. 核心2.2.x相匹配的VS補丁

核心編譯選項如下:

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    [*] Network firewalls
    ...
    [*] IP: forwarding/gatewaying
    ...
    [*] IP: firewalling
    ...
    [*] IP: masquerading
    ...
    [*] IP: masquerading virtual server support (EXPERIMENTAL)
    (12) IP masquerading table size (the Nth power of 2)
    <M> IPVS: round-robin scheduling
    <M> IPVS: weighted round-robin scheduling
    <M> IPVS: least-connection scheduling
    <M> IPVS: weighted least-connection scheduling
    <M> IPVS: locality-based least-connection scheduling
    <M> IPVS: locality-based least-connection with replication scheduling

最後,cd到ipvsadm的原始碼目錄,輸入"make install",在系統目錄安裝ipvsadm,也可以通過rpm包進行安裝。

3. 與核心2.4.x相匹配的IPVS補丁

核心編譯選項如下:

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    [*] Network packet filtering (replaces ipchains)
    [ ]   Network packet filtering debugging
    ...
      IP: Netfilter Configuration  --->
      IP: Virtual Server Configuration  --->
	<M> virtual server support (EXPERIMENTAL)
	[*]   IP virtual server debugging
	(12)   IPVS connection table size (the Nth power of 2)
	--- IPVS scheduler
	<M>   round-robin scheduling
	<M>   weighted round-robin scheduling
	<M>   least-connection scheduling scheduling
	<M>   weighted least-connection scheduling
	<M>   locality-based least-connection scheduling
	<M>   locality-based least-connection with replication scheduling
	<M>   destination hashing scheduling
	<M>   source hashing scheduling
	--- IPVS application helper
	<M>   FTP protocol helper

示例說明

舉例說明,下表說明了linux中虛擬伺服器IP隧道所指定的路由。注意,執行在實伺服器上的服務必須使用與虛服務相同的埠,所以沒有必要在實伺服器上指定服務埠。

Protocol Virtual IP Address Port Real IP Address Weight
TCP 202.103.106.5 80 202.103.107.2 1
202.103.106.3 2

所有訪問地址202.103.106.5的80埠的資料包都被負載均衡到地址202.103.107.2的80 埠和202.103.106.3的80埠。

我們可以用下列命令指定上表中顯示的路由。

1. 對於核心2.0.x

ippfvsadm -A -t 202.103.106.5:80 -R 202.103.107.2 -w 1
ippfvsadm -A -t 202.103.106.5:80 -R 202.103.106.3 -w 2

2. 對於核心2.2.x /2.4.x /2.6.x

ipvsadm -A -t 202.103.106.5:80 -s wlc
ipvsadm -a -t 202.103.106.5:80 -r 202.103.107.2 -i -w 1
ipvsadm -a -t 202.103.106.5:80 -r 202.103.106.3 -i -w 2

測試虛擬伺服器示例

這是一個配置示例,用於測試IP隧道的虛擬伺服器。下面所示的配置,希望能給讀者以啟示。負載均衡器地址為172.26.20.111,實伺服器地址為172.26.20.112,虛地址為172.26.20.110。在下面的示例中,telnet 172.26.20.110實際訪問的將是實伺服器。

1. 對於核心2.0.x

負載均衡器,核心版本2.0.36

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev eth0:0
ippfvsadm -A -t 172.26.20.110:23 -R 172.26.20.112

實伺服器1,核心2.0.36 (IP forwarding enabled)

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0

當telnet 172.26.20.110時,實際訪問的是實伺服器1。

2. 對於核心2.2.x

負載均衡器,核心2.2.14

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up
ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.26.20.110:23 -s wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

實伺服器1, 核心版本2.0.36 (IP forwarding enabled)

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0

更多的配置示例

以下是更多的關於IP隧道虛擬伺服器的配置,為了節省空間,僅列舉出主要的命令,其他的省略。

1. Real server running kernel 2.2.14 or later with hidden device

負載均衡器,核心版本2.2.14

echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.26.20.110:23 -s wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

實伺服器1, 核心版本2.2.14

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
modprobe ipip
ifconfig tunl0 0.0.0.0 up
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up

由於核心2.2版本僅含有一個隧道裝置tunl0,所以在配置中只能有一個VIP。如果想要多個VIPs,需要將tunl0裝置啟用,並且配置別名tunnel/dummy/loopback裝置並且隱藏該裝置,示例如下:

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
modprobe ipip
ifconfig tunl0 0.0.0.0 up
ifconfig dummy0 0.0.0.0 up
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden
ifconfig dummy0:0 172.26.20.110 up
route add -host 172.26.20.110 dev dummy0:0
ifconfig dummy0:1 <Another-VIP> up
...

2. 具備重定向方法的實伺服器(核心2.2.x)

負載均衡器的配置同上,實伺服器(核心2.2.x)的配置如下:

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
modprobe ipip
ifconfig tunl0 0.0.0.0 up
ipchains -A input -j REDIRECT 23 -d 172.26.20.110 23 -p tcp
...