1、LVS-NAT模式的組成php
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 部署
一、提早準備好兩臺 Real Server 服務器,Real Server 服務器環境搭建這裏就很少做介紹,請參考小弟前期的博文
兩臺 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.4port=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
fiecho "禁止 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
fiecho "安裝 ipvsadm 服務!"
yum -y install ipvsadm
ipvsadm -A -t $VIP -s wrrfor ip in $RIP1 $RIP2
do
ipvsadm -a -t $VIP:$port -r $ip:$port -m
donef、咱們寫個監控腳本,來監控兩臺 Real Server 可否正常訪問,並動態的實時修改 ipvsadm 配置(因爲目前爲止咱們還沒學習相似 keeplive 的高可用方案,所以以腳本代替。)
#!/bin/bash
VIP=192.168.20.136
RIP1=172.16.0.3
RIP2=172.16.0.4port=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:$portelif [[ $web_status -eq 0 && $lvs_status -ne 0 ]]; then
ipvsadm -a -t $VIP:$port -r $IP:$port -m
fi
done
sleep 1
doneg、因爲咱們在配置 ipvsadm 的時候並沒寫明權重,若是後期,咱們要對權重和調度算法進行調整時,可使用如下命令
ipvsadm -E -t 192.168.20.136 -s rr
或者能夠將其寫入安裝腳本中。
h、查看ipvsadm 負載均衡狀態
ipvsadm -Ln
如圖:
i、查看ipvsadm負載均衡鏈接狀態
ipvsadm -lnc
或者
watch -n1 ipvsadm -lnc 表示1秒鐘刷新一次,這裏的時間時能夠修改的,也能夠爲小數,好比 watch -n0.5 ipvsadm -lnc
如圖:
j、驗證
咱們分別在Real Server中新建index.php文件
Real ServerA 中index.php文件內容爲:Real ServerA
Real ServerB 中index.php文件內容爲:Real ServerB
而後,咱們訪問 http://192.168.20.136
如圖:
因爲,用瀏覽器訪問時會有緩存,致使可能刷新不少遍頁面仍是 Real ServerA 或者 Real ServerB ,因此,我這裏分別用兩個不一樣的瀏覽器進行訪問
咱們也能夠在 Linux 服務器中用 curl 進行訪問,curl沒有緩存,訪問結果會向第一張圖那樣