集羣的概念
集羣就是一組各自相互獨立且又相互依賴的通過高速網絡互聯的計算機組成的一個計算機組,以單一的系統模式加以管理爲用戶提供服務,在一個集羣裏面一臺計算機就是集羣的一個節點,集羣有三個特性:可靠性、可伸縮性和可管理性。比如一臺服務器能響應10000個併發,隨着業務量的增大用戶增多現在有200000個併發,那這臺服務器很明顯已經達到瓶頸,解決這個問題一般有兩個辦法:第一個就是升級CPU、內存、帶寬、加SSD,這種辦法稱爲向上擴展(scale up),另外一個辦法是增加服務器,使用多臺服務器同時爲用戶提供服務,這種辦法稱之爲向外擴展(scale out),也就是集羣。
集羣的類型又分爲下三種:
- 負載均衡集羣(Load Baloance Cluster),簡稱LB集羣
- 高可用集羣(High Availability Cluster),簡稱HA集羣
- 高性能計算(High Performance Cluster),簡稱HPC集羣
實現LB集羣通常有種手段:在硬件方面代表的廠家有F5、Citrix、A10等;軟件方面有LVS、nginx、haproxy、ats(apache traffic server)、perlbal、pound等
lvs集羣
LVS(Linux Virtual Server)即linux虛擬服務器,是一個虛擬的服務器系統,它是由我國的張文嵩博士成立的自由軟件項目,根據iptables的實現來開發。lvs的工作模式如下圖:
LVS相當於負載調度器,它位於整個集羣對面最前端的服務器,負責接收用戶請求並根據自己的調度算法將請求轉發到後端真正爲用戶提供服務的服務器,而客戶認爲服務是來自一個IP地址;共享存儲則爲RS保持用戶訪問的數據的相同內容,提供數據的一致性,包括session的問題。
lvs模式及工作原理
lvs集羣四種類型:
lvs-nat
:修改請求報文的目標IP;多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改爲經過自身算法後到達的RS的RIP和端口實現轉發;
注意事項:
- RIP和DIP必須在同一個IP網絡(段),且應該使用私網地址,RS的網關應指向DIP。
- 請求報文和響應報文都必須經過Director轉發。(也造成了瓶頸)
- lvs必須是linux系統,RS則可以是任意操作系統
lvs-dr
:直接路由。基於數據鏈路層的轉發,在lvs所有的模式中效率最好。
通過封裝新的MAC頭部再實現網絡轉發。
確保前端路由器將目標IP爲VIP請求報文發往Director有以下三種方法:
- 在前端網關做靜態綁定
- 在RS上使用arptables
- 在RS上修改內核參數以限制ARP通告及應答級別:
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告
1:儘量避免向非直連網絡進行通告
2:必須避免向非本地網絡通告
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
0:默認值,可使用本地任意接口上配置的任意地址進行響應
1:僅在請求的目標IP配置在本地主機的接收到請求報文接口上時才響應。
2:只響應目的IP地址爲接收網卡上的本地地址的arp請求,並且arp請求的源IP必須和接收網卡同網段。
3:如果ARP請求數據包所請求的IP地址對應的本地地址其作用域(scope)爲主機(host),則不迴應ARP響應數據包,如果作用域爲全局(global)或鏈路(link),則迴應ARP響應數據包。
4~7:保留未使用
8:不迴應所有的arp請求
sysctl.conf中包含all和eth/lo(具體網卡)的arp_ignore參數,取其中較大的值生效。
注意事項:
- RS的RIP可以是私網地址也可以是公網地址,RIP和DIP在同一網段,RIP的網關不能指向DIP
- RS跟director要在同一個物理網段
- Director不能響應請求報文,只能是RS直接發往用戶
- 該模式不支持端口映射
- Director和各個RS都要配置VIP
lvs-tun
:在原請求IP報文之外新加一個IP頭部,不修改請求報文的IP頭部信息;
注意事項:
- DIP、VIP、RIP都應該是公網地址
- RS的網關不能也不可能指向DIP
- 不支持端口映射
- RS的操作系統需支持隧道功能
lvs-fullnat
:修改請求報文的源IP和目標IP進行轉發;
注意事項:
- VIP應爲公網地址;DIP和RIP應爲私網地址且不在同一網絡(段),因此RIP的網關一般不會指向DIP
- RS收到的請求報文源地址是DIP,因此只能響應給DIP再由director發往client
- 請求和響應報文都經由director
- 支持端口映射
lvs調度算法
lvs根據其調度是是否考慮各RS當前的負載狀態,可分爲靜態方法和動態方法兩種。
-
靜態方法:(僅根據算法本身進行調度)
RR
:輪詢
WRR
:加權重的輪詢
SH
:將源地址做哈希,將來自同一個IP的請求始終發往第一次挑中的RS,從而實現會話綁定(session sticky)
DH
:將目標地址做哈希,將發往同一個目標地址的請求始終發至第一次挑中的RS,一般用在正向代理緩存場景中的負載均衡 -
動態方法:(主要根據每臺RS當前的負載狀態及調度算法進行調度)
LC
:最少連接數,根據算法將請求發往連接數最少的RS
WLC
加權重的最少連接數,director可以自動獲取RS的負載情況並動態調整權重
SED
:最短預期延遲
NQ
:無需隊列
LBLC
:基於局部性的最少連接
LBLCR
:複製功能的LBLC
使用lvs-nat模式搭建集羣
實驗拓撲圖:
在director主機打開內核轉發功能:
net.ipv4.ip_forward = 1
安裝lvs管理工具:
yum install -y ipvsadm
設置規則:
ipvsadm -A -t 192.168.1.1:80 -s rr
ipvsadm -a -t 192.168.1.1:80 -r 172.16.1.10 -m
ipvsadm -a -t 192.168.1.1:80 -r 172.16.1.20 -m
選項:
-a:添加真實服務器
-A:添加虛擬服務器
-r:指定RS的IP地址
-m:nat方式的lvs
-t:表示TCP的服務
-s:調度算法 ,rr表示輪詢
更多參數含義見 ipvsadm -h
保存及重載配置:
//保存
ipvsadm --save >/etc/sysconfig/file
ipvsadm -S >/etc/sysconfig/file
//重載
ipvsadm -R </etc/sysconfig/file
ipvsadm-restore </etc/sysconfig/file
查看配置的規則:
接着在兩臺RS配置httpd的web界面內容
echo "172.16.1.10" > /var/www/html/index.html
echo "172.16.1.20" > /var/www/html/index.html
到此lvs-nat模式已經全部配置完成了,測試一下:
訪問VIP能正常根據我們配置的輪詢算法進行負載均衡,成功!
使用lvs-dr模式搭建集羣
在nat模式很明顯的弊端就是所有的報文都需要經過director,造成director的瓶頸,很容易造成單點故障,如果該服務器宕機對整個集羣造成的傷害是毀滅性的;ipvs在低版本中是不具有健康檢查的,即使是高版本,監測功能也不成熟,因此不適合在生產環境使用。
實驗拓撲圖:
在lvs管理主機配置規則:
在兩臺RS關閉RP響應:
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
注意
:RS上必須在looback接口上配置VIP,否則會響應客戶端的ARP請求。
在RS添加web內容:
#RS1
echo “192.168.8.50” >/var/www/html/index.html
#RS2
echo “192.168.8.60” >/var/www/html/index.html
在瀏覽器爲訪問192.168.8.10會顯示兩個內容表示測試成功!
小結:
會話同步的方法:把所有自己的會話信息保存到數據庫中(Redis)
預防director單點故障:高可用(keepalived、heartbeat)
對RS做健康監測:端口探測(傳輸層)、請求網頁(應用層)