一:LVS群集簡介:
lvs(linux virtual server)Linux的虛拟服務
Internet的快速增長使多媒體網絡伺服器面對的通路數量快速增加,伺服器需要具備提供大量并發通路服務的能力,是以對于大負載的伺服器來講, CPU、I/O處理能力很快會成為瓶頸。由于單台伺服器的性能總是有限的,簡單的提高硬體性能并不能真正解決這個問題。為此,必須采用多伺服器和負載均衡技術才能滿足大量并發通路的需要。Linux 虛拟伺服器(Linux Virtual Servers,LVS) 使用負載均衡技術将多台伺服器組成一個虛拟伺服器。它為适應快速增長的網絡通路需求提供了一個負載能力易于擴充,而價格低廉的解決方案
二:LVS的結構和工作原理:
LVS由前端的負載均衡器(Load Balancer,LB)和後端的真實伺服器(Real Server,RS)群組成。RS間可通過區域網路或廣域網連接配接。LVS的這種結構對使用者是透明的,使用者隻能看見一台作為LB的虛拟伺服器(Virtual Server),而看不到提供服務的RS群。
三:lvs的工作模式有三種:
1.nat(LVS-NAT)
a.叢集接點必須和LB在同一個子網中(即DIP和),不能跨域網段
b.RIP 是私有位址
c.所有的RIP的網關必須指向DIP
d.排程器處理所有的請求
e.端口位址轉換
f.因為是NAT
h.單點瓶頸
2.直接路由(LVS-DR)
a.叢集接點必須和LB必須在一個實體網段,之間不能有路由器
b.RIP可以使用公網位址,建議使用公網位址
c.LB僅處理請求,不處理響應
d.real server的網關不能指向DIP
e.不能做端口轉換
f.并非所有的系統都可以做接點
h.LVS-DR 可以帶動比LVS-NAT更多的接點
3.隧道(LVS-TUN)
a.叢集接點和LB接點不必在同一個實體網絡
b.RIP使用公網位址
c.LB隻處理進來的請求,不處理出去的請求
d.響應的請求一定不經過LB
e.不支援端口位址轉換
f.隻能使用支援IP隧道協定的作業系統做叢集接點
四:lvs的LB的排程方法及各個排程方法對應的算法:
1.靜态排程方法:(fixed scheduling)不考慮後端連接配接狀态
a:RR(round-robin)輪循着,它将請求依次配置設定不同的RS,也就是在RS中均攤請求。這種算法簡單,但是隻适合于RS處理性能相差不大的情況;
b:WRR(weight round-robin)權重輪調,它将依據不同RS的權值配置設定任務。權值較高的RS将優先獲得任務,并且配置設定到的連接配接數将比權值較低的RS更多。相同權值的RS得到相同數目的連接配接數;
c:destination hashing 根據服務的請求轉發到特定的伺服器,跟使用者建立粘性,提高緩存命中率
d:source hashing 将來自同一個使用者的請求,始終轉發到特定的路由器或防火牆(平均内網負載)
2.動态排程方法:(dynamic scheduling)考慮後端連接配接狀态
a:LC (least-connect)最少連接配接,檢查active和inactive,連接配接數(overhead)最少的接受請求
b:WLC(weight least-connect)權重最小連接配接數(叢集最好的算法)
c:shortest expected delay (SED)最短期望延遲 ,不考慮非活動狀态,在計算overhead之前,把非活動狀态的總數加上1
d:NQ(never query)隻要有空閑的,不考慮算法的接受請求;
e:LBLC(locality-based-least-connect:DH)支援權重(後面的是緩存伺服器的)基于位址的最小連接配接數排程(Locality-Based Least-Connection) 将來自同一目的位址的請求配置設定給同一台RS如果這台伺服器尚未滿負荷,否則配置設定給連接配接數最小的RS,并以它為下一次配置設定的首先考慮;
f:LBLCR (locality-based-least-connect with replication scheduling)是對LBLC的改進,對于某一目的位址,對應有一個RS子集。對此位址的請求,為它配置設定子集中連接配接數最小的RS;如果子集中所有的伺服器均已滿負荷,則從叢集中選擇一個連接配接數較小的伺服器,将它加入到此子集并配置設定連接配接;若一定時間内,這個子集未被做任何修改,則将子集中負載最大的節點從子集删除;
五:ipvsadm介紹:
ipvs是核心空間子產品,使用者在LB負載均衡器上使用ipvsadm指令進行操作,基于不同模式的不同排程算法進行設定,然後實作不同的不同的負載措施:
1.定義叢集服務
ipvsadm -A|-E -t|-u|-f VIP:PORT {tcp|udp|firewall mark} -s 排程算法,預設是wlc
-A 添加、-E 修改
ipvsadm -D -t|-u VIP:PORT 删除定義的叢集
2.要為叢集服務定義realserver
ipvsadm -a|-e -t|-u VIP:port -r REALSERVER:port -g|-i|-m(模型) [-w weitht]
-a 添加、-e 修改、-w 權重、-d 删除
ipvsadm -d -t|-u VIP:port -r REALSERVER:PORT
-C 清除規則、-R 恢複、-S 儲存
其中模式中的-g|-i|-m分别用于dr|tun|nat
3.檢視
ipvsadm -ln
案例一:LVS的nat模式:director使用linux主機。realserver1和realserver2搭建web伺服器
拓撲:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499622976Gyd.png"></a>
LB---linux主機配置:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962299B7Ia.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962301CgwF.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962306SI3n.png"></a>
[root@lyt ~]# mkdir /mnt/cdrom
[root@lyt ~]# mount /dev/cdrom /mnt/cdrom/
[root@lyt ~]# cd /mnt/cdrom/Cluster #切換到Cluster倉庫
[root@lyt Cluster]# vim /etc/yum.repos.d/rhel-debuginfo.repo #編輯本地yum
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962308dyrN.png"></a>
[root@lyt Cluster]# grep -i ip_vs /boot/config-2.6.18-164.el5 #檢視核心是否支援ipvs
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962312EN6D.png"></a>
[root@lyt Cluster]# yum install ipvsadm –y #安裝ipvs的管理工具ipvsadm
[root@lyt Cluster]# ipvsadm -A -t 192.168.101.66:80 -s rr #定義一個群集伺服器,vip為192.168.101.66,由于後面realserver是web,是以監聽80
端口;-A表示添加,-t表示tcp,-s表示排程算法,rr表示排程算法輪詢
[root@lyt Cluster]# ipvsadm -a -t 192.168.101.66:80 -r 192.168.2.100 -m #定義一個realserver,-a表示添加,vip位址是192.168.101.66,-t表示
tcp,-r表示realserver是192.168.2.100。-m表示采用的是nat模式
[root@lyt Cluster]# ipvsadm -a -t 192.168.101.66:80 -r 192.168.2.101 -m #定義一個realserver,-a表示添加,vip位址是192.168.101.66,-t表示
tcp,-r表示realserver是192.168.2.101。-m表示采用的是nat模式
[root@lyt Cluster]# service ipvsadm save #儲存ipvsadm的規則
[root@lyt Cluster]# vim /etc/sysconfig/ipvsadm #規則儲存在該檔案中
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962315wHbU.png"></a>
[root@lyt Cluster]# service ipvsadm start #啟動ipvsadm服務
[root@lyt Cluster]# ipvsadm –ln #檢視ipvsadm的規則詳細資訊
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623182bkF.png"></a>
[root@lyt Cluster]# vim /etc/sysctl.conf #編輯該檔案,打開資料包轉發功能
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962320PEMW.png"></a>
[root@lyt Cluster]# sysctl –p #使用該指令是剛才配置生效
realserver1配置:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962321dTXl.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962324x5vQ.png"></a>
[root@localhost ~]# mkdir /mnt/cdrom
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
[root@localhost ~]# cd /mnt/cdrom/Server/
[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm #安裝httpd伺服器
[root@localhost Server]# cd /var/www/html/
[root@localhost html]# echo "web1">index.html #建立網頁
[root@localhost html]# service httpd start #啟動httpd伺服器
realserver2配置:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962326Dpf0.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962328ty7Q.png"></a>
[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm #安裝httpd伺服器
[root@localhost html]# echo "web2">index.html #建立網頁
[root@localhost html]# service httpd start #啟動httpd服務
測試:
登入之後顯示的是realserver1
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623301YKc.png"></a>
重新整理之後顯示realserver2,表明使用的是輪詢的方式
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623325WXL.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623355k8P.png"></a>
為realserver加上權重:
[root@lyt Cluster]# ipvsadm –C #将原來的規則删除
[root@lyt Cluster]# ipvsadm -A -t 192.168.101.66:80 -s wrr #使用權重輪詢方式wrr
[root@lyt Cluster]# ipvsadm -a -t 192.168.101.66:80 -r 192.168.2.100 -m -w 10 #-w表示權重
[root@lyt Cluster]# ipvsadm -a -t 192.168.101.66:80 -r 192.168.2.101 -m -w 5
[root@lyt Cluster]# service ipvsadm save #将規則儲存
[root@lyt Cluster]# service ipvsadm restart #重新開機服務
定義的群集采用destination hashing方式:
[root@lyt Cluster]# ipvsadm -E -t 192.168.101.66:80 -s dh #-E表示修改
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962343SUK8.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962346dz2c.png"></a>
案例二:LVS的dr模式:搭建兩台realserver伺服器,安裝web服務,在另外一台存儲伺服器上存儲要通路的網頁,當使用者通路
LB時,将存儲伺服器上的網頁挂載到realserver上。
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962349Nt4D.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623526m5O.png"></a>
[root@localhost ~]# sysctl -a | grep arp #檢視核心參數,含有arp字元的
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962353bSoj.png"></a>
[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_announce = 2">> /etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.all.arp_announce = 2">> /etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_ignore = 1">> /etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.all.arp_ignore = 1">> /etc/sysctl.conf
[root@localhost ~]# sysctl –p #使新編輯的核心檔案生效
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623542STY.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_134996235517gh.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962359DYBg.png"></a>
[root@localhost ~]# service network restart
[root@localhost ~]# route add -host 192.168.145.101 dev lo:0 #添加一條路由,保證資料包傳回時是通過vip位址192.168.145.101,接口lo:0
[root@localhost ~]# mkdir /mnt/cdrom #建立挂載點
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/ #挂載CD光牒
[root@localhost Server]# rpm -ivh httpd-2.2.3-31.el5.i386.rpm #安裝httpd服務
[root@localhost Server]# service httpd start #啟動httpd伺服器
[root@localhost Server]# chkconfig httpd on
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962361aM9p.png"></a>
[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_announce = 2">> /etc/sysctl.conf
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962362fAOM.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962363H1YU.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623641eT9.png"></a>
[root@localhost ~]# service network restart
[root@localhost ~]# mkdir /mnt/cdrom #建立挂載點
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/ #挂在CD光牒
[root@localhost Server]# service httpd start #啟動httpd伺服器
LB---Linux主機配置:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962366IZds.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962367PoWr.png"></a>
[root@lyt ~]# cd /mnt/cdrom/Cluster #切換到Cluster倉庫中
[root@lyt Cluster]# rpm -ivh ipvsadm-1.24-10.i386.rpm #安裝ipvs的管理工具ipvsadm
[root@lyt Cluster]# ipvsadm -A -t 192.168.145.101:80 -s rr #定義群集伺服器,采用輪詢方式rr
[root@lyt Cluster]# ipvsadm -a -t 192.168.145.101:80 -r 192.168.145.200 –g #-g表示gateway,采用直連路由方式dr
[root@lyt Cluster]# ipvsadm -a -t 192.168.145.101:80 -r 192.168.145.201 –g #-g表示gateway,采用直連路由方式dr
[root@lyt Cluster]# service ipvsadm save #儲存配置的規則
[root@lyt Cluster]# service ipvsadm start #啟動ipvsadm
[root@lyt Cluster]# chkconfig ipvsadm on #設定開機自動啟動
[root@lyt Cluster]# ipvsadm –ln #檢視規則
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962370YFHI.png"></a>
配置存儲伺服器:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962375HgOu.png"></a>
[root@localhost ~]# service nfs start #nfs服務預設已經安裝過,在此直接啟動即可
[root@localhost ~]# mkdir /public/
[root@localhost ~]# mkdir /private/
[root@localhost ~]# vim /etc/exports #編輯共享清單exports,該檔案預設是空檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962376Yfpn.png"></a>
[root@localhost ~]# cd /public/
[root@localhost public]# vim index.html
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962377lzQE.png"></a>
[root@localhost public]# cd ..
[root@localhost /]# cd /private/
[root@localhost private]# vim index.html
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_134996237764gR.png"></a>
[root@localhost private]# exportfs –rv #将設定共享的檔案導出
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962378SNgM.png"></a>
将共享檔案臨時挂載到realserver上:
将網頁檔案臨時挂載到realserver1上:
[root@localhost ~]# showmount -e 192.168.145.202 #測試是否具有權限檢視192.168.145.202伺服器上的共享檔案
[root@localhost ~]# mount 192.168.145.202:/public /var/www/html/ #将/public目錄挂載到預設的httpd根目錄下
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962380fhJX.png"></a>
将網頁檔案臨時挂載到realserver2上:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962379thPl.png"></a>
[root@localhost ~]# mount 192.168.145.202:/private /var/www/html/ #将/private目錄挂載到預設的httpd根目錄下
測試能否通路挂載的頁面:
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962382KCXG.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623872JbM.png"></a>
将共享檔案臨時開機自動挂載到realserver上:
将網頁檔案開機自動挂載到realserver1上:
[root@localhost ~]# umount /var/www/html/ #将臨時挂載解除安裝掉
[root@localhost ~]# vim /etc/fstab #編輯開機自動挂載檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962389xDUE.png"></a>
[root@localhost ~]# init 6 #重新開機系統
将網頁檔案開機自動挂載到realserver2上:
[root@localhost ~]# umount /var/www/html/ #将臨時挂載解除安裝掉
[root@localhost ~]# vim /etc/fstab #編輯開機自動挂載檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962390cfVH.png"></a>
[root@localhost ~]# init 6 #重新開機系統
測試能否通路到挂載的頁面
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962392ku7S.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962393UWGJ.png"></a>
連接配接自動挂載:
将網頁檔案連接配接自動挂載到realserver1上:
[root@localhost ~]# umount /var/www/html/
[root@localhost ~]# rpm -qa |grep auto #檢視與自動挂載相關的軟體包
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623947FTb.png"></a>
[root@localhost ~]# vim /etc/auto.master #編譯與自動挂載相關的配置檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499623952hlw.png"></a>
[root@localhost ~]# cp -p /etc/auto.misc /etc/auto.nfs #産生一個auto的主配置檔案
[root@localhost ~]# vim /etc/auto.nfs #編輯該檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962400CwXx.png"></a>
[root@localhost ~]# service autofs restart #重新開機autofs服務
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf #編輯httpd主配置檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962401GWsp.png"></a>
[root@localhost ~]# service httpd restart #重新開機httpd伺服器
将網頁檔案連接配接自動挂載到realserver2上:
[root@localhost ~]# rpm -qa |grep auto #檢視與自動挂載相關的軟體包
[root@localhost ~]# vim /etc/auto.master #編譯與自動挂載相關的配置檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962405OI8O.png"></a>
[root@localhost ~]# cp -p /etc/auto.misc /etc/auto.nfs #産生一個auto的主配置檔案
[root@localhost ~]# vim /etc/auto.nfs
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962410yVVk.png"></a>
[root@localhost ~]# service autofs restart #重新開機autofs服務
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962411wKfH.png"></a>
[root@localhost ~]# service httpd restart #重新開機httpd伺服器
測試能否通路到挂載的頁面:
在realserver1上檢視挂載情況:
[root@localhost ~]# mount #檢視挂載的共享檔案
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_13499624123CY3.png"></a>
<a href="http://5493845.blog.51cto.com/attachment/201210/11/5493845_1349962415gvQ7.png"></a>
在realserver2上檢視挂載情況:
[root@localhost ~]# mount
<a href="http://blog.51cto.com/attachment/201210/213718379.png" target="_blank"></a>
本文轉自 liuyatao666 51CTO部落格,原文連結:http://blog.51cto.com/5503845/1021579,如需轉載請自行聯系原作者