LVS 負載均衡集羣部署之 NAT 模式

1、LVS-NAT模式的組成php

image

        LVS-NAT模式的實現,其主要依賴於 LVS調度器,即 Director Server,由上圖能夠看出,整個調度器,則由兩部分構成:用戶空間和內核空間。html

        一、內核空間,指的是,在負載均衡實現過程當中,有一部分代碼工做在內核之中,而這部分代碼纔是真正負載均衡實現調度的部分,叫作內核空間,即 IPVSweb

        二、用戶空間,指的是,在負載均衡實現過程當中,負責爲ipvs內核框架編寫規則,定義集羣服務角色,後端真實的服務器(Real Server)的部分,叫作用戶空間,即 ipvsadm算法

2、LVS-NAT實現原理數據庫

        參考拓撲圖數據流向:後端

        一、當客戶端向 LVS 調度器發起請求時 ,首先數據包會到達 PREROUTING 鏈,而此時,數據包的源IP爲CIP,目的IP爲VIP,經由 PREROUTING 鏈的處理,改變數據包的目的IP地址和目的端口(而這裏的目的IP地址和目的端口在用戶空間中定義),此時的目的地址變成RIP。瀏覽器

        二、當 PREROUTING 鏈處理完數據包以後,會將數據包交給 INPUT 鏈,進行數據包過濾,過濾掉不屬於目的主機地址(即集羣服務)的數據包。緩存

        三、當 INPUT 處理完數據包後,會將數據包交給 POSTROUTING 鏈,在 POSTTOUTING 鏈,根據數據包的目的地址和主機路由表進行對比,選擇最優路徑,將數據包發送給Real Server。bash

        四、數據包到達 Real Server 中,Real Server 會先根據本身的路由表判斷數據包的目的地址是否爲本機地址,若是是,則對此數據包作出響應,構建新的響應數據包交給 Director Server,而此時,數據包的源地址爲 RIP,目的地址爲 CIP,若是不是,則丟棄。服務器

        五、當客戶端的響應數據包到達 Director Server 時,首先會通過 OUTPUT 鏈的轉發,完了再將數據包交給 POSTROUTING 鏈,將響應數據包的源地址修改成本機的 VIP

        六、最後,響應數據包會被髮送給客戶端

        說明:關於數據流向的問題,這裏只介紹個大概,若是須要更加詳盡的數據處理過程,請參考 IPtables 防火牆工做原理,由於 LVS 是基於 IPtables 架構的。

                     這裏推薦兩篇博文:https://×××w.cnblogs.com/tangshengwei/p/4652011.html

                                                   https://blog.csdn.net/ggxiaobai/article/details/53609284

3、LVS-NAT部署注意事項

        一、如拓撲圖,RIP、DIP必須爲私有地址,且Real Server 的網關必須指定爲DIP

               私有IP地址範圍:

   A類地址範圍:10.0.0.0—10.255.255.255
    B類地址範圍:172.16.0.0---172.31.255.555
    C類地址範圍:192.168.0.0---192.168.255.255

        二、RIP、DIP必須處於同一網段

        三、請求數據和響應數據都須要通過Director Server,在高負載場景中,Director Server 很容易成爲性能瓶頸

4、LVS-NAT 部署

         圖片.png

        一、提早準備好兩臺 Real Server 服務器,Real Server 服務器環境搭建這裏就很少做介紹,請參考小弟前期的博文

https://blog.51cto.com/4746316/2313671

https://blog.51cto.com/4746316/2313873 

兩臺 Real Server 的IP分別設置爲,172.16.0.二、172.16.0.3,即爲 RIP,網關設置爲172.16.0.4(DIP)。

        二、提早準備好MySQL數據庫,數據庫的安裝,請參考小弟前期的博文 http://www.javashuo.com/article/p-stbwdeok-cp.html

        三、安裝 Director Server 服務器。

a、開啓系統內核路由轉發功能

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

或者 

[root@lvs ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

[root@lvs ~]# sysctl –p

注意:若是在sysctl.conf文件中net.ipv4.ip_forward = 1已經存在,說明系統內核轉發功能已開啓,或者cat /proc/sys/net/ipv4/ip_forward 值爲1時,也說明內核轉發功能已開啓。

b、生產環境中,最好關閉 icmp 重定向

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects

[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

或者

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

或者

[root@lvs ~]# echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf

c、設置服務器地址

設置內部網卡地址爲:172.16.0.4(DIP),設置外部 網卡地址爲:192.168.20.136(VIP)

d、安裝、配置 ipvsadm

[root@lvs ~]# yum –y install ipvsadm

[root@lvs ~]# ipvsadm –A –t 192.168.20.136 –s wrr

[root@lvs ~]# ipvsadm –a –t 192.168.20.136 –r 172.16.0.2 –m –w 1

[root@lvs ~]# ipvsadm –a –t 192.168.20.136 –r 172.16.0.3 –m –w 2

到此,LVS-NAT就配置完了,三條命令,若是後端真實服務器多的話,再往裏面加就 OK了。

e、咱們將前面步驟整理寫成腳本

#!/bin/bash

VIP=192.168.20.136
RIP1=172.16.0.3
RIP2=172.16.0.4

port=80

echo "開啓系統內核轉發功能!"
cat /etc/sysctl.conf | grep "net.ipv4.ip_forward = 1" &> /dev/null
forward=$?

if [[ $forward -ne 0 ]]; then
     echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
     sysctl -p
fi

echo "禁止 icmp 重定向!"
cat /etc/sysctl.conf | grep "net.ipv4.icmp_echo_ignore_all=1" &> /dev/null
icmp=$?

if [[ $icmp -ne 0 ]]; then
     echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
fi

echo "安裝 ipvsadm 服務!"
yum -y install ipvsadm
ipvsadm -A -t $VIP -s wrr

for ip in $RIP1 $RIP2
do
     ipvsadm -a -t $VIP:$port -r $ip:$port -m
done

f、咱們寫個監控腳本,來監控兩臺 Real Server 可否正常訪問,並動態的實時修改 ipvsadm 配置(因爲目前爲止咱們還沒學習相似 keeplive 的高可用方案,所以以腳本代替。)

#!/bin/bash

VIP=192.168.20.136
RIP1=172.16.0.3
RIP2=172.16.0.4

port=80

while :
do
     for IP in $RIP1 $RIP2
     do
         curl http://$IP &> /dev/null
         web_status=$?
         ipvsadm -Ln | grep $IP &> /dev/null
         lvs_status=$?

        if [[ $web_status -ne 0  && $lvs_status -eq 0 ]]; then
             ipvsadm -d -t $VIP:$port -r $IP:$port

        elif [[ $web_status -eq 0  && $lvs_status -ne 0 ]]; then
             ipvsadm -a -t $VIP:$port -r $IP:$port -m
        fi
     done
     sleep 1
done

g、因爲咱們在配置 ipvsadm 的時候並沒寫明權重,若是後期,咱們要對權重和調度算法進行調整時,可使用如下命令

ipvsadm -E -t 192.168.20.136 -s rr

或者能夠將其寫入安裝腳本中。

h、查看ipvsadm 負載均衡狀態

ipvsadm -Ln

如圖:

圖片.png

i、查看ipvsadm負載均衡鏈接狀態

ipvsadm -lnc

或者

watch -n1 ipvsadm -lnc     表示1秒鐘刷新一次,這裏的時間時能夠修改的,也能夠爲小數,好比 watch -n0.5 ipvsadm -lnc

如圖:

圖片.png

j、驗證

咱們分別在Real Server中新建index.php文件

Real ServerA 中index.php文件內容爲:Real ServerA

Real ServerB 中index.php文件內容爲:Real ServerB

而後,咱們訪問 http://192.168.20.136

如圖:

圖片.png

圖片.png圖片.png

因爲,用瀏覽器訪問時會有緩存,致使可能刷新不少遍頁面仍是 Real ServerA 或者 Real ServerB ,因此,我這裏分別用兩個不一樣的瀏覽器進行訪問

咱們也能夠在 Linux 服務器中用 curl 進行訪問,curl沒有緩存,訪問結果會向第一張圖那樣

相關文章
相關標籤/搜索