LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服 務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,並且無需修改客戶端和服務器端的程序,如下是體系結構圖(來源http://www.linuxvirtualserver.org/architecture.html):html
簡介前端
NAT模式稱爲全稱Virtualserver via Network address translation(VS/NAT),是經過網絡地址轉換的方法來實現調度的。首先調度器(Director)接收到客戶的請求數據包時(請求的目的IP爲VIP),根據調度算法決定將請求發送給哪一個後端的真實服務器(RS)。而後調度就把客戶端發送的請求數據包的目標IP地址及端口改爲後端真實服務器的IP地址(RIP),這樣真實服務器(RS)就可以接收到客戶的請求數據包了。真實服務器響應完請求後,查看默認路由(NAT模式下咱們須要把RS的默認路由設置爲DS服務器。)把響應後的數據包發送給DS,DS再接收到響應包後,把包的源地址改爲虛擬地址(VIP)而後發送回給客戶端。node
具體工做流程:linux
說明:nginx
簡介web
全稱:Virtual Server via Direct Routing(VS-DR),也叫直接路由模式,用直接路由技術實現虛擬服務器。當參與集羣的計算機和做爲控制管理的計算機在同一個網段時能夠用此方法,控制管理的計算機接收到請求包時直接送到參與集羣的節點。直接路由模式比較特別,很難說和什麼方面類似,前種模式基本上都是工做在網絡層上(三層),而直接路由模式則應該是工做在數據鏈路層上(二層)。算法
說明:數據庫
地址變化過程後端
DR模式特色以及注意事項:centos
介紹
地址變化過程
ipvsadm是LVS的管理工具,ipvsadm工做在用戶空間,用戶經過ipvsadm命令編寫負載均衡規則。
yum install ipvsadm -y ###文件說明 Unit 文件: ipvsadm.service 主程序:/usr/sbin/ipvsadm 規則保存工具:/usr/sbin/ipvsadm-save 規則重載工具:/usr/sbin/ipvsadm-restore 配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm --help #查看使用方法及參數 命令: -A, --add-service: #添加一個集羣服務. 即爲ipvs虛擬服務器添加一個虛擬服務,也就是添加一個須要被負載均衡的虛擬地址。虛擬地址須要是ip地址,端口號,協議的形式。 -E, --edit-service: #修改一個虛擬服務。 -D, --delete-service: #刪除一個虛擬服務。即刪除指定的集羣服務; -C, --clear: #清除全部虛擬服務。 -R, --restore: #從標準輸入獲取ipvsadm命令。通常結合下邊的-S使用。 -S, --save: #從標準輸出輸出虛擬服務器的規則。能夠將虛擬服務器的規則保存,在之後經過-R直接讀入,以實現自動化配置。 -a, --add-server: #爲虛擬服務添加一個real server(RS) -e, --edit-server: #修改RS -d, --delete-server: #刪除 -L, -l, --list: #列出虛擬服務表中的全部虛擬服務。能夠指定地址。添加-c顯示鏈接表。 -Z, --zero: #將全部數據相關的記錄清零。這些記錄通常用於調度策略。 --set tcp tcpfin udp: #修改協議的超時時間。 --start-daemon state: #設置虛擬服務器的備服務器,用來實現主備服務器冗餘。(注:該功能只支持ipv4) --stop-daemon: #中止備服務器。 參數: 如下參數能夠接在上邊的命令後邊。 -t, --tcp-service service-address: #指定虛擬服務爲tcp服務。service-address要是host[:port]的形式。端口是0表示任意端口。若是須要將端口設置爲0,還須要加上-p選項(持久鏈接)。 -u, --udp-service service-address: #使用udp服務,其餘同上。 -f, --fwmark-service integer: #用firewall mark取代虛擬地址來指定要被負載均衡的數據包,能夠經過這個命令實現把不一樣地址、端口的虛擬地址整合成一個虛擬服務,可讓虛擬服務器同時截獲處理去往多個不一樣地址的數據包。fwmark能夠經過iptables命令指定。若是用在ipv6須要加上-6。 -s, --scheduler scheduling-method: #指定調度算法,默認是wlc。調度算法能夠指定如下8種:rr(輪詢),wrr(權重),lc(最後鏈接),wlc(權重),lblc(本地最後鏈接),lblcr(帶複製的本地最後鏈接),dh(目的地址哈希),sh(源地址哈希),sed(最小指望延遲),nq(永不排隊) -p, --persistent [timeout]: #設置持久鏈接,這個模式可使來自客戶的多個請求被送到同一個真實服務器,一般用於ftp或者ssl中。 -M, --netmask netmask: #指定客戶地址的子網掩碼。用於將同屬一個子網的客戶的請求轉發到相同服務器。 -r, --real-server server-address: #爲虛擬服務指定數據能夠轉發到的真實服務器的地址。能夠添加端口號。若是沒有指定端口號,則等效於使用虛擬地址的端口號。 [packet-forwarding-method]: #此選項指定某個真實服務器所使用的數據轉發模式。須要對每一個真實服務器分別指定模式。 -g, --gatewaying: #使用網關(即直接路由),此模式是默認模式。 -i, --ipip: #使用ipip隧道模式。 -m, --masquerading: #使用NAT模式。 -w, --weight weight: #設置權重。權重是0~65535的整數。若是將某個真實服務器的權重設置爲0,那麼它不會收到新的鏈接,可是已有鏈接還會繼續維持(這點和直接把某個真實服務器刪除時不一樣的)。 -x, --u-threshold uthreshold: #設置一個服務器能夠維持的鏈接上限。0~65535。設置爲0表示沒有上限。 -y, --l-threshold lthreshold: #設置一個服務器的鏈接下限。當服務器的鏈接數低於此值的時候服務器才能夠從新接收鏈接。若是此值未設置,則當服務器的鏈接數連續三次低於uthreshold時服務器才能夠接收到新的鏈接。 --mcast-interface interface: #指定使用備服務器時候的廣播接口。 --syncid syncid:#指定syncid, 一樣用於主備服務器的同步。 #如下選項用於list(-l)命令: -c, --connection: #列出當前的IPVS鏈接。 --timeout: #列出超時 --stats: #狀態信息 --rate: #傳輸速率 --thresholds: #列出閾值 --persistent-conn: #持久鏈接 --sor: #把列表排序 --nosort: #不排序 -n, --numeric: #不對ip地址進行dns查詢 --exact: #單位 -6: 如#果fwmark用的是ipv6地址須要指定此選項。 #若是使用IPv6地址,須要在地址兩端加上"[]"。例如:ipvsadm -A -t [2001:db8::80]:80 -s rr
####管理LVS集羣中的RealServer舉例 1) 添加RS : -a # ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight] #舉例1: 往VIP資源爲10.1.210.58的集羣服務裏添加1個realserver ipvsadm -a -t 10.1.210.58 -r 10.1.210.52 –g -w 5 2) 修改RS : -e # ipvsadm -e -t|u|f service-address -r server-address [-g|i|m] [-w weight] #舉例2: 修改10.1.210.58集羣服務裏10.1.210.52這個realserver的權重爲3 ipvsadm -e -t 10.1.210.58:80 -r 10.1.210.52 –g -w 3 3) 刪除RS : -d # ipvsadm -d -t|u|f service-address -r server-address #舉例3: 刪除10.1.210.58集羣服務裏10.1.210.52這個realserver ipvsadm -d -t 10.1.210.58:80 -r 10.1.210.52 4) 清除規則 (刪除全部集羣服務), 該命令與iptables的-F功能相似,執行後會清除全部規則: # ipvsadm -C 5) 保存及讀取規則: # ipvsadm -S > /path/to/somefile # ipvsadm-save > /path/to/somefile # ipvsadm-restore < /path/to/somefile ####管理LVS集羣服務的查看 # ipvsadm -L|l [options] options能夠爲: -n:數字格式顯示 --stats 統計信息 --rate:統計速率 --timeout:顯示tcp、tcpinfo、udp的會話超時時長 -c:鏈接客戶端數量 #查看lvs集羣轉發狀況 # ipvsadm -Ln #查看lvs集羣的鏈接狀態 # ipvsadm -l --stats 說明: Conns (connections scheduled) 已經轉發過的鏈接數 InPkts (incoming packets) 入包個數 OutPkts (outgoing packets) 出包個數 InBytes (incoming bytes) 入流量(字節) OutBytes (outgoing bytes) 出流量(字節) #查看lvs集羣的速率 ipvsadm -l --rate 說明: CPS (current connection rate) 每秒鏈接數 InPPS (current in packet rate) 每秒的入包個數 OutPPS (current out packet rate) 每秒的出包個數 InBPS (current in byte rate) 每秒入流量(字節) OutBPS (current out byte rate) 每秒入流量(字節)
centos7默認已經將ipvs編譯進內核模塊,名稱爲ip_vs,使用時候須要先加載該內核模塊。
如下步驟須要在DS上進行:
1.加載ip_vs模塊
modprobe ip_vs #加載ip_vs模塊 cat /proc/net/ip_vs #查看是否加載成功 lsmod | grep ip_vs #查看加載的模塊 yum install ipvsadm # 安裝管理工具
2.配置調度腳本dr.sh
#!/bin/bash VIP=10.1.210.58 #虛擬IP RIP1=10.1.210.52 #真實服務器IP1 RIP2=10.1.210.53 #真實服務器IP2 PORT=80 #端口 ifconfig ens192:1 $VIP broadcast $VIP netmask 255.255.255.255 up #添加VIP,注意網卡名稱 echo 1 > /proc/sys/net/ipv4/ip_forward #開啓轉發 route add -host $VIP dev ens192:1 #添加VIP路由 /sbin/ipvsadm -C #清空ipvs中的規則 /sbin/ipvsadm -A -t $VIP:80 -s wrr #添加調度器 /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 #添加RS /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1 #添加RS /sbin/ipvsadm -ln #查看規則
3.執行腳本
[root@app51 ~]# sh dr.sh IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.210.58:80 wrr -> 10.1.210.52:80 Route 1 0 0 -> 10.1.210.53:80 Route 1 0 0
如下步驟須要在RS上執行:
1.真實服務RS配置腳本rs.sh
#!/bin/bash VIP=10.1.210.58 #RS上VIP地址 #關閉內核arp響應,永久修改配置參數到/etc/sysctl.conf,目的是爲了讓rs順利發送mac地址給客戶端 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up #綁定VIP到RS服務器上 /sbin/route add -host $VIP dev lo:0 #添加VIP路由
2.執行腳本
sh rs.sh
3.配置測試web服務(以一臺爲示例)
systemctl stop firewalld #關閉防火牆 systemctl disable firewalld #禁止開機啓動 yum install httpd #安裝httpd ###RS1虛擬主機配置 vi /etc/httpd/conf/httpd.conf ServerName 10.1.210.52:80 echo "RS 10.1.210.52" > /var/www/html/index.html ###RS2虛擬主機配置 vi /etc/httpd/conf/httpd.conf ServerName 10.1.210.53:80 echo "RS 10.1.210.53" > /var/www/html/index.html #啓動httpd服務 systemctl start httpd
[root@node1 ~]# for i in {1..10} ;do curl http://10.1.210.58 ;done RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52
LVS-NAT模式和DR區別要作nat,而且請求和響應都要通過DS,全部須要將RS網關指向DS,因爲以前測試過DR模式,在測試NAT模式時候須要將RS環境恢復,RS恢復步驟以下:
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 down
調度服務DS配置
#!/bin/bash VIP=10.1.210.58 #虛擬IP RIP1=10.1.210.52 #真實服務器IP1 RIP2=10.1.210.53 #真實服務器IP2 PORT=80 #端口 ifconfig ens192:1 $VIP broadcast $VIP netmask 255.255.255.255 up #添加VIP echo 1 > /proc/sys/net/ipv4/ip_forward #開啓轉發 route add -host $VIP dev ens192:1 #添加VIP路由 /sbin/ipvsadm -C #清空ipvs中的規則 /sbin/ipvsadm -A -t $VIP:80 -s wlc #添加調度器 /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m -w 1 #添加RS /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m -w 1 #添加RS /sbin/ipvsadm -ln #查看規則
RS配置
nat模式RS配置很簡單,只須要將RS路由指向DS
vi /etc/sysconfig/network-scripts/ifcfg-ens192 GATEWAY=10.1.210.58 #修改網關至RS地址 systemctl restart network #重啓網絡
測試
因爲這裏的環境DS和RS在同一個網段下,NAT模式下若是客戶端是同網段狀況下,RS響應的時候直接響應給同網段的服務器了並不通過DS,這樣就致使客戶端會丟棄該請求。若是想要同網段的想要訪問到DS則須要添加路由,這裏須要RS在響應同網段服務器時候網關指向DS,這樣同網段就能訪問到DS了,示例:
route add -net 10.1.210.0/24 gw 10.1.210.58
測試結果:
[root@app36 ~]# for i in {1..10} ; do curl http://10.1.210.58 ;done RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52 RS 10.1.210.53 RS 10.1.210.52
在LVS中,持久鏈接是爲了用來保證當來自同一個用戶的請求時可以定位到同一臺服務器,目的是爲了會話保持,而一般使用的會話保持技術手段就是cookie與session。
在Web服務通訊中,HTTP自己是無狀態協議,不能標識用戶來源,當用戶在訪問A網頁,再從A網頁訪問其餘資源跳轉到了B網頁,這對於服務器來講又是一個新的請求,以前的登錄信息都沒有了,怎麼辦?爲了記錄用戶的身份信息,開發者在瀏覽器和服務器之間提供了cookie和session技術,簡單說來在你瀏覽網頁時候,服務器創建session用於保存你的身份信息,並將與之對應的cookie信息發送給瀏覽器,瀏覽器保存cookie,當你再次瀏覽該網頁時候,服務器檢查你的瀏覽器中的cookie並獲取與之對應的session數據,這樣一來你上次瀏覽網頁的數據依然存在。
LVS會話保持實現方式就是經過未來自於同一個用戶的請求發往同一個服務器,具體實現分爲sh算法和持久鏈接:
LVS的持久鏈接功能須要定義在集羣服務上面,使用-p timeout選項。
PPC:
[root@localhost ~]# ipvsadm -At 10.1.210.58:80 -s rr -p 300 #上面命令的意思是:添加一個集羣服務爲10.1.210.58:80,使用的調度算法爲rr,持久鏈接的保持時間是300秒。當超過300秒都沒有請求時,則清空LVS的持久鏈接模板。
PCC:
# ipvsadm -A -t 10.1.210.58:0 -s rr -p 600 # ipvsadm -a -t 10.1.210.58:0 -r 10.1.210.52 -g -w 2 # ipvsadm -a -t 10.1.210.58:0 -r 0.1.210.53 -g -w 1
PFMC:
######PNMPP是經過路由前給數據包打標記來實現的 # iptables -t mangle -A PREROUTING -d 10.1.210.58 -ens192 -p tcp --dport 80 -j MARK --set-mark 3 # iptables -t mangle -A PREROUTING -d 10.1.210.58 -ens192 -p tcp --dport 443 -j MARK --set-mark 3 # ipvsadm -A -f 3 -s rr -p 600 # ipvsadm -a -f 3 -r 10.1.210.52 -g -w 2 # ipvsadm -a -f 3 -r 10.1.210.52 -g -w 2