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 ...