LVS服務原理以及搭建(理論+乾貨) 版權聲明:本文為yunshuxueyuan原創文章 如需轉載請標明出處: https://my.oschina.net/yunshuxueyuan/blog QQ技術交流群:299142667 一、 LVS簡介 LVS是Linux Virtual Server的 ...
LVS服務原理以及搭建(理論+乾貨)
版權聲明:本文為yunshuxueyuan原創文章
如需轉載請標明出處: https://my.oschina.net/yunshuxueyuan/blog
QQ技術交流群:299142667
一、 LVS簡介
LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統,目的在於使用集群技術和Linux操作系統實現一個高性能、高可用的伺服器。它具有良好的可靠性,可拓展性和可操作性。從而以低廉的成本實現最優的性能。
二、 LVS的體系架構
使用LVS架設的伺服器集群系統有三個部分組成:最前端的負載均衡層(Loader Balancer),中間的伺服器群組層,用Server Array表示,最底層的數據共用存儲層,用Shared Storage表示。在用戶看來所有的應用都是透明的,用戶只是在使用一個虛擬伺服器提供的高性能服務。
LVS的各個層次的詳細介紹:
Load Balancer層:位於整個集群系統的最前端,有一臺或者多台負載調度器(Director Server)組成,LVS模塊就安裝在Director Server上,而Director的主要作用類似於一個路由器,它含有完成LVS功能所設定的路由表,通過這些路由表把用戶的請求分發給Server Array層的應用伺服器(Real Server)上。同時,在Director Server上還要安裝對Real Server服務的監控模塊Ldirectord,此模塊用於監測各個Real Server服務的健康狀況。在Real Server不可用時把它從LVS路由表中剔除,恢復時重新加入。
Server Array層:由一組實際運行應用服務的機器組成,Real Server可以是WEB伺服器、MAIL伺服器、FTP伺服器、DNS伺服器、視頻伺服器中的一個或者多個,每個Real Server之間通過高速的LAN或分佈在各地的WAN相連接。在實際的應用中,Director Server也可以同時兼任Real Server的角色。
Shared Storage層:是為所有Real Server提供共用存儲空間和內容一致性的存儲區域,在物理上,一般有磁碟陣列設備組成,為了提供內容的一致性,一般可以通過NFS網路文件系統共用數 據,但是NFS在繁忙的業務系統中,性能並不是很好,此時可以採用集群文件系統,例如Red hat的GFS文件系統,oracle提供的OCFS2文件系統等。
從整個LVS結構可以看出,Director Server是整個LVS的核心,目前,用於Director Server的操作系統只能是Linux和FreeBSD,linux2.6內核不用任何設置就可以支持LVS功能,而FreeBSD作為 Director Server的應用還不是很多,性能也不是很好。對於Real Server,幾乎可以是所有的系統平臺,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
三、 LVS模式
IP負載均衡技術:
負載均衡技術有很多實現方案,有基於DNS功能變數名稱輪流解析的方法、有基於客戶端調度訪問的方法、有基於應用層系統負載的調度方法,還有基於IP地址的調度方法,在這些負載調度演算法中,執行效率最高的是IP負載均衡技術。
LVS 的IP負載均衡技術是通過IPVS模塊來實現的,IPVS是LVS集群系統的核心軟體,它的主要作用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問服務。這個虛擬IP一般稱為LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然後由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。
當用戶的請求到達負載調度器後,調度器如何將請求發送到提供服務的Real Server節點,而Real Server節點如何返回數據給用戶,是IPVS實現的重點技術,IPVS實現負載均衡機制有三種,分別是NAT、TUN和DR,詳述如下:
VS/NAT: 即(Virtual Server via Network Address Translation)
也就是網路地址翻譯技術實現虛擬伺服器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標埠也改成選定的Real Server的相應埠,最後將報文請求發送到選定的Real Server。在伺服器端得到數據後,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源埠改成虛擬IP地址和相應埠,然後把數據發送給用戶,完成整個負載調度過程。可以看出,在NAT方式下,用戶請求和響應報文都必須經過Director Server地址重寫,當用戶請求越來越多時,調度器的處理能力將稱為瓶頸。
VS/TUN :即(Virtual Server via IP Tunneling)
也就是IP隧道技術實現虛擬伺服器。它的連接調度和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,調度器採用IP隧道技術將用戶請求轉發到某個Real Server,而這個Real Server將直接響應用戶的請求,不再經過前端調度器,此外,對Real Server的地域位置沒有要求,可以和Director Server位於同一個網段,也可以是獨立的一個網路。因此,在TUN方式中,調度器將只處理用戶的報文請求,集群系統的吞吐量大大提高。
VS/DR: 即(Virtual Server via Direct Routing)
也就是用直接路由技術實現虛擬伺服器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一物理網段上。
四、 LVS調度演算法(演算法原理查看:http://www.linuxvirtualserver.org/zh/lvs4.html)
Lvs的調度演算法決定瞭如何在集群節點之間分佈工作負荷。當director調度器收到來自客戶端訪問VIP的上的集群服務的入站請求時,director調度器必須決定哪個集群節點應該處理請求。Director調度器用的調度方法基本分為兩類:
固定調度演算法:rr,wrr,dh,sh
動態調度演算法:wlc,lc,lblc,lblcr
LVS調度演算法的生產環境選型:
1、一般的網路服務,如http,mail,mysql等常用的LVS調度演算法為:
a.基本輪詢調度rr
b.加權最小連接調度wlc
c.加權輪詢調度wrc
2、基於局部性的最小連接lblc和帶複製的給予局部性最小連接lblcr主要適用於web cache和DB cache
3、源地址散列調度SH和目標地址散列調度DH可以結合使用在防火牆集群中,可以保證整個系統的出入口唯一。
實際適用中這些演算法的適用範圍很多,工作中最好參考內核中的連接調度演算法的實現原理,然後根據具體的業務需求合理的選型。
五、 實際搭建
術語 VIP: 虛擬伺服器地址
DIP: 轉發的網路地址
– 1,和RIP通信:ARP協議,獲取Real Server的RIP:MAC地址
– 2,轉發Client的數據包到RIP上(隱藏的VIP)
RIP: 後端真實主機(後端伺服器)
CIP: 客戶端IP地址
VIP: 虛擬主機IP
LVS/DR(尚學堂周老師的ppt比較詳細,我吧細節再屢一下):
1、準備3台虛擬機,使eth0在同一個網段上,使DIP和RIP在統一網段
2、配置lvs的VIP
Ifconfig eth0:0 192.168.249.100/24
(24 代表該 IP 的子網掩碼為 255.255.255.0)
3、調整RS的響應。通告級別(每一臺RS都配)
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4、配置RS的VIP(每一臺RS都配)
Ifconfig lo:8 192.168.249.100 netmask 255.255.255.255
5、啟動RS上的httpd
yum -y install httpd
在httpd服務的預設路徑 /var/www/html/ 下新建一個入口訪問頁
測試兩台RS 能否訪問
6、LVS——ipvsadm
yum -y install ipvsadm ipvsadm -A -t 192.168.249.100:80 -s rr ipvsadm -a -t 192.168.249.100:80 -r 192.168.249.120 -g -w 1 (-w 表示設置權重) ipvsadm -a -t 192.168.249.100:80 -r 192.168.249.130 -g -w 1
ipvsadm –ln 顯示內核伺服器列表
瀏覽器刷新: 訪問vip
ipvsadm -lnc 顯示lvs的連接詳情
到這裡基本的服務已經配置完了
註意:這套配置中,VIP 、通告級別、以及httpd 在伺服器重啟後,都需要重新設置
當然也可以設置httpd為開機啟動:chkconfig httpd on
使VIP永久生效用,設置子網卡:
vi /etc/sysconfig/network-scripts/ifcfg-lo:8 DEVICE=lo:8 IPADDR=192.168.249.100 NETMASK=255.255.255.25
但是,重啟之後必須手動重新設置通告級別,所以還是比較麻煩
7、因此編寫如下啟動配置腳本(分為LVS server腳本 和 real server腳本):
7.1、配置lvs的dr模式LVS server腳本,如下:
#!/bin/bash #配置lvs的 VIP=192.168.249.100 #(註意,lvs server那台機器2個ip,一個是vip,一個是本身ip例如192.168.249.110) RIP1=192.168.249.120 RIP2=192.168.249.130 #RIPn=192.168.249.n VPORT=80 RPORT=80 Usage (){ echo "Usage:`basename $0` 請輸入:(start|stop|status) " exit 1 } if [ $# -ne 1 ];then Usage fi case "${1}" in start) echo "start LVS of DirectorServer" echo 1 > /proc/sys/net/ipv4/ip_forward #表示允許數據包轉發 # set the vip 配置lvs的VIP /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev eth0:0 # clear ipvs table 清空ipvs規則 /sbin/ipvsadm -C # add lvs vip and port /sbin/ipvsadm -A -t $VIP:$VPORT -s rr # add rip and port /sbin/ipvsadm -a -t $VIP:$VPORT -r $RIP1:$RPORT -g -w 1 /sbin/ipvsadm -a -t $VIP:$VPORT -r $RIP2:$RPORT -g -w 1 /sbin/ipvsadm -L -n echo "start success!!!" ;; stop) echo "close LVS DirectorServer" /sbin/ipvsadm -C /sbin/ifconfig eth0:0 down echo "closed !!!" ;; status) /sbin/ipvsadm -L -n ;; *) Usage esac
7.2、real server 腳本如下:(每台real server 都單獨有自己的一個啟動腳本,腳本內容一樣)
#!/bin/bash #real_server配置腳本 lvs的dr模式RIP server腳本 VIP=192.168.249.100 #vip's broadcast 虛擬伺服器的廣播地址 BROADCAST=192.168.249.255 Usage () { echo "Usage:`basename $0` 請輸入:(start|stop)" exit 1 } if [ $# -ne 1 ];then Usage fi case $1 in start) echo "reparing for Real Server" echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce /sbin/ifconfig lo:8 $VIP netmask 255.255.255.255 broadcast $BROADCAST up /sbin/route add -host $VIP dev lo:8 echo "start success!!!" ;; stop) /sbin/ifconfig lo:8 down echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce echo "stop Real Server" ;; *) Usage esac
7.3開機自啟動
如果覺得每次開機後還得執行腳本來啟動服務配置,那麼就可這直接將腳本設為開機啟動,具體如下圖
將要開機執行的腳本全路徑寫在/etc/rc.local 文件末尾,下次開機啟動的時候將會自動執行你添加的腳本。
***常用ipvsadm命令:
-A –add-service 在內核的虛擬伺服器表中添加一條新的虛擬伺服器記錄。也
就是增加一臺新的虛擬伺服器。
-E –edit-service 編輯內核虛擬伺服器表中的一條虛擬伺服器記錄。
-D –delete-service 刪除內核虛擬伺服器表中的一條虛擬伺服器記錄。
-C –clear 清除內核虛擬伺服器表中的所有記錄。
-R –restore 恢復虛擬伺服器規則
-S –save 保存虛擬伺服器規則,輸出為-R 選項可讀的格式
-a –add-server 在內核虛擬伺服器表的一條記錄里添加一條新的真實伺服器
記錄。也就是在一個虛擬伺服器中增加一臺新的真實伺服器
-e –edit-server 編輯一條虛擬伺服器記錄中的某條真實伺服器記錄
-d –delete-server 刪除一條虛擬伺服器記錄中的某條真實伺服器記錄
-L|-l –list 顯示內核虛擬伺服器表
-Z –zero 虛擬服務表計數器清零(清空當前的連接數量等)
–set tcp tcpfin udp 設置連接超時值
–start-daemon 啟動同步守護進程。他後面可以是master 或backup,用來說
明LVS Router 是master 或是backup。在這個功能上也可以採用keepalived 的
VRRP 功能。
–stop-daemon 停止同步守護進程
-h –help 顯示幫助信息
其他的選項:
-t –tcp-service service-address 說明虛擬伺服器提供的是tcp 的服務
[vip:port] or [real-server-ip:port]
-u –udp-service service-address 說明虛擬伺服器提供的是udp 的服務
[vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 說明是經過iptables 標記過的服務類型。
-s –scheduler scheduler 使用的調度演算法,有這樣幾個選項
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
預設的調度演算法是: wlc.
-p –persistent [timeout] 持久穩固的服務。這個選項的意思是來自同一個客
戶的多次請求,將被同一臺真實的伺服器處理。timeout 的預設值為300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真實的伺服器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式為直接路由模式(也是LVS 預設的模式)
-i –ipip 指定LVS 的工作模式為隧道模式
-m –masquerading 指定LVS 的工作模式為NAT 模式
-w –weight weight 真實伺服器的權值
–mcast-interface interface 指定組播的同步介面
-c –connection 顯示LVS 目前的連接 如:ipvsadm -L -c
–timeout 顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 顯示同步守護進程狀態
–stats 顯示統計信息
–rate 顯示速率信息
–sort 對虛擬伺服器和真實伺服器排序輸出
–numeric -n 輸出IP 地址和埠的數字形式
六、 上面提到開機啟動腳本,下麵順便聊一下定時執行shell腳本
例如每分鐘要執行一次test.sh腳本
crontab -l 每個用戶都有各自不同的計劃任務列表,用各自的帳戶登錄後運行
crontab -e 查看到各任務的計劃任務情況,可以修改自己的計劃任務
(*/1 * * * * 為cron表達式,這個表示每分鐘執行一次,具體的可以百度一下哦)
其中*/1 * * * * /user/script/test.sh(一定要絕對路徑)
保存後,必須重新啟動crond服務,不然不會生效
service crond restart
我的腳本是:
echo "測試開機調用,現在時間:`date '+%Y/%m/%d %H:%M:%S'`" >> /user/script/log.txt
查看定時執行效果:
這樣一個簡單的定時任務就ok了
*** crontab常用命令簡紹
crontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數。
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //刪除沒個用戶的cron服務
crontab -e //編輯某個用戶的cron服務
需要將crond設置為系統啟動後自動啟動的服務,可以在/etc/rc.d/rc.local 中,在末尾加上 service crond start
基本用法:
crontab -l 列出當前的crontab任務
crontab -d 刪除當前的crontab任務
crontab -e (solaris5.8上面是 crontab -r)編輯一個crontab任務,ctrl_D結束
crontab filename 以filename做為crontab的任務列表文件並載入
crontab file的格式:
crontab 文件中的行由 6 個欄位組成,不同欄位間用空格或 tab 鍵分隔。前 5 個欄位指定命令要運行的時間
分鐘 (0-59)
小時 (0-23)
日期 (1-31)
月份 (1-12)
星期幾(0-6,其中 0 代表星期日)
補充:在使用crontab的時候,要特別註意的是運行腳本中能夠訪問到的環境變數和當前測試環境中的環境變數未必一致,一個比較保險的做法是在運行的腳本程式中自行設置環境變數(export)。
版權聲明:本文為yunshuxueyuan原創文章
如需轉載請標明出處: https://my.oschina.net/yunshuxueyuan/blog
QQ技術交流群:299142667