本篇主要參考文章爲 http://www.javashuo.com/article/p-ykiqmsbq-ck.html
還有微信公衆號 碼農翻身html
輪詢 Round-Robin rr 加權輪詢 Weight Round-Robin wrr 最小鏈接 Least-Connection lc 加權最小鏈接 Weight Least-Connection wlc 基於局部性的最小鏈接 Locality-Based Least Connections lblc 帶複製的基於局部性最小鏈接 Locality-Based Least Connections with Replication lblcr 目標地址散列調度 Destination Hashing dh 源地址散列調度 Source Hashing sh
在介紹lvs nat 模式以前,先來熟悉下幾個經常使用名稱
DS : directory server 調度器,分發器, LB load banlancer 負載均衡器就屬於一種調度器
RS : real server 後端提供訪問內容的真實服務器,也叫節點服務器
VIP: 虛擬ip,向外部直接面向用戶請求,做爲用戶請求的目標地址
DIP: dicrectory server ip 調度器上用於和內部主機通訊的ip
RIP: real server ip 節點服務器ip
CIP: client ip 客戶端的ip地址
這種模式藉助iptables的nat表來實現。用戶的請求到分發器後,經過預設的iptables規則,把請求的數據包轉發到後端的rs上去。rs須要設定網關爲分發器的內網ip。用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器會成爲瓶頸。 在nat模式中,只須要分發器有公網ip便可,因此比較節省公網ip資源。
總體架構圖以下
具體實現過程爲:linux
1)客戶端請求數據,目標IP爲VIP 2)請求數據到達LB服務器,LB根據調度算法將目的地址修改成RIP地址及對應端口(此RIP地址是根據調度算法得出的。)並在鏈接HASH表中記錄下這個鏈接。 3)數據包從LB服務器到達RS服務器webserver,而後webserver進行響應。Webserver的網關必須是LB,而後將數據返回給LB服務器。 4)收到RS的返回後的數據,根據鏈接HASH表修改源地址VIP&目標地址CIP,及對應端口80.而後數據就從LB出發到達客戶端。 5)客戶端收到的就只能看到VIP\DIP信息。
接下來咱們結合具體實例 理解整個過程
結構框圖以下nginx
LB有兩個IP,一個對外(192.168.199.200),一個對內(192.168.226.129)。用戶看到的是那個對外的IP。後面真正提供服務的服務器爲RS1,RS2,RS3,他們的網關都指向LB。咱們作實驗只用了兩臺RS。也就是說這裏只用到一個公網ip
192.168.199.200
數據包傳遞過程以下:
1)客戶發出請求到LB服務器
2) LB 收到用戶請求,要把請求轉發到RS1服務器,就修改目的地址爲RS1的ip,端口爲R1的端口
3)RS1 處理完請求,把http報文層層封裝,返回響應報文給客戶端
4) 因爲LB是網關,它在半路收到該數據包,作第二次修改,將源地址和源端口替換爲本身的,發給客戶端。
整個數據的流向爲
客戶端---> LB ---> RS --->LB ---> 客戶端
三臺機器具體實驗
分發器,也叫調度器(簡寫爲dir)
內網:ens33 192.168.226.129,外網ens37:192.168.199.200(vmware僅主機模式)
rs1
內網:ens33 192.168.226.130,設置網關爲192.168.226.129
rs2
內網:ens33 192.168.226.131,設置網關爲192.168.226.129
三臺機器上都執行執行 web
systemctl stop firewalld; systemc disable firewalld systemctl start iptables-services; iptables -F; service iptables save
在dir上安裝ipvsadmyum install -y ipvsdam
在dir上編寫腳本,vim /usr/local/sbin/lvs_nat.sh
//內容以下算法
#! /bin/bash #director 服務器上開啓路由轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward #關閉icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects #注意區分網卡名字,網卡分別爲ens33和ens37 echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects #director 設置nat防火牆 iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.226.0/24 -j MASQUERADE #director設置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.199.200:80 -s wrr $IPVSADM -a -t 192.168.199.200:80 -r 192.168.226.130:80 -m -w 1 $IPVSADM -a -t 192.168.199.200:80 -r 192.168.226.131:80 -m -w 1
運行腳本後測試:
編輯rs1 nginx 默認頁 內容爲hello, i am from 192.168.226.130
rs2 nginx 默認頁內容爲hello world ,I'am from 192.168.226.131
用瀏覽器訪問 192.168.199.200
再次刷新結果爲apache