1》集群: 隨著互聯網的發展,大量的客戶端請求蜂擁而至,同時伺服器的負載也越來越大,然而單台伺服器的負載又是有限的,這樣就會導致伺服器響應客戶端請求的時間越長, 甚至產生拒絕服務的情況;另外目前的網站多數是7*24小時提供不間斷網路服務,如果僅採用單點伺服器對外提供網路服務,那麼在出現單點故障時,將 ...
1》集群:
隨著互聯網的發展,大量的客戶端請求蜂擁而至,同時伺服器的負載也越來越大,然而單台伺服器的負載又是有限的,這樣就會導致伺服器響應客戶端請求的時間越長, 甚至產生拒絕服務的情況;另外目前的網站多數是7*24小時提供不間斷網路服務,如果僅採用單點伺服器對外提供網路服務,那麼在出現單點故障時,將導致整個網路服務中 斷,這時我們需要部署集群架構,最終將成百上千台主機有機地結合在一起,以滿足當前大數據時代的海量訪問負載。在部署集群環境時可以選擇的產品有很多,有些是基於 硬體實現的,有些是基於軟體實現的,其中負載均衡的硬體設備有F5的GIG-IP,Radware的AppDirector,以及梭子魚的負載均衡設備等;軟體有基於Linux的LVS,Nginx和 HAProxy等產品,在集群環境中的核心是負載均衡以及高可用;
2》LVS負載均衡簡介:
LVS(Linux Virtual Server)即Linux虛擬伺服器,目前LVS已經被集成到Linux內核模塊中,該項目在Linux內核中實現了基於IP的數據請求負載均衡調度方案,終端互聯網 用戶從外部訪問公司的外部負載均衡伺服器,終端用戶的WEB請求會發送給LVS調度器,調度器根據自己預設的演算法決定將請求發送給後端的某台WEB伺服器,比如輪詢演算法 可以將外部的請求平均分發給後端的所有伺服器,終端用戶訪問LVS調度器雖然會被轉發到後端真實的伺服器,但如果真實伺服器連接的是相同的存儲,提供的服務也都是相同 的服務,最終用戶不管訪問哪台真實的伺服器,得到的服務內容都是一樣的,整個集群對用戶而言都是透明的,最後根據LVS工作模式的不同,真實伺服器會選擇不同的方式將 用戶所需要的數據發送給終端用戶,LVS工作模式分為NAT模式,TUN模式以及DR模式;
1>基於NAT的LVS負載均衡:
NAT即網路地址轉換,其作用是通過數據報頭的修改,使位於企業內部的私有IP可以訪問外網,以及外部用戶可以訪問位於公司內部的私有IP地址主機,VS/NAT 工作模式是LVS負載調度器使用兩塊網卡配置不同的IP地址,eth0設置為私鑰IP與內部網路通過交換設備相互連接,eth1設置為外網IP與外部網路連通;
第一步:用戶通過互聯網DNS伺服器解析到公司負載均衡設備上面的外網IP地址,相對於真實伺服器而言,LVS的外網IP又稱為VIP(Virtual IP Address),用戶 通過訪問VIP,即可連接後端的真實伺服器,而這一切對用戶而言都是透明的,用戶以為自己訪問的就是真實的伺服器,但他並不知道自己訪問的VIP僅 僅是一個調度器,也不清楚後端的真實伺服器到底在哪裡,有多少台真實伺服器;
第二步:用戶將數據請求發送至外網IP地址,此時LVS將根據預設的演算法選擇後端的一臺真實伺服器,將數據請求包發送給真實伺服器,並且在轉發之前LVS會 修改數據包中的目標地址以及目標埠,目標地址與目標埠將被修改為選中的真實伺服器IP地址以及相應的埠;
第三步:真實的伺服器將響應數據包返回給LVS調度器,調度器在得到響應數據包後會將源地址與源埠修改為VIP及調度器相應的埠,修改完成後,由調度器 將響應數據包發送給終端用戶,另外由於LVS調度器有一個連接Hash表,該表中會記錄連接請求及轉發信息,當同一個連接的下一個數據包發送給調度 器時,從該Hash表中可以直接找到之前的連接記錄,並根據該記錄信息選出相同的真實伺服器及埠信息;
2>基於TUN的LVS負載均衡:
在LVS(NAT)模式的集群環境中,由於所有的數據請求及響應的數據包都需要經過LVS調度器轉發,如果後端伺服器的數量大於10台,則調度器就會成為整個 集群環境的瓶頸,我們知道數據請求包往往遠遠小於響應數據包的大小,因為響應數據包中包含有客戶端需要的具體數據,所以LVS(TUN)的思路就是將請求與響 應數據分離,讓調度器僅處理數據請求,而讓真實伺服器將響應數據包直接返回給客戶端,VS/TUN工作模式中的IP隧道(IP tunning)是一種數據包封裝技術,它 可以將原始數據包封裝並添加新的包頭(內容包括新的源地址及埠,目標地址及埠),從而實現將一個目標為調度器VIP的數據包封裝,通過隧道轉發給後端的 真實伺服器,通過將客戶端發送調度器的原始數據包封裝,併在其基礎上添加新的數據包頭(修改目標地址為調度器選擇出來的真實伺服器的IP地址及對應埠), LVS(TUN)模式要求真實伺服器可以直接與外部網路連接,真實伺服器在收到請求數據包後直接給客戶端主機響應數據;
3>基於DR的LVS負載均衡:
在LVS(TUN)模式下,由於需要在LVS調度器與真實伺服器之間創建隧道連接,這同樣會增加伺服器的負擔,與LVS(TUN)類似,DR模式也叫直接路由模式,該模 式中LVS依然僅承擔數據的入站請求以及根據演算法選出合理的真實伺服器,最終由後端真實伺服器負責將響應數據包發送返回給客戶端,與隧道模式不同的是,直接路 由模式要求調度器與後端伺服器必須在一個區域網內,VIP地址需要在調度器與後端所有的伺服器間共用,因為最終的真實伺服器給客戶端回應數據包時需要設置源地 址為VIP地址,目標IP為客戶端IP,這樣客戶端訪問的是調度器的VIP地址,回應的源地址也依然是該VIP地址(真實伺服器上的VIP),客戶端是感覺不到後端伺服器 存在的,由於多台電腦都設置了同樣一個VIP地址,所以在直接路由模式中要求調度器的VIP地址是對外可見的,客戶端需要將請求數據包發送到調度器主機,而所 有的真實伺服器的VIP地址必須配置在Non-ARP的網路設備上,也就是該網路設備並不會向外廣播自己的MAC及對應的IP地址,真實伺服器的VIP對外界是不可見的, 但真實伺服器卻可以接收目標地址為VIP的網路請求,併在回應數據包時將源地址設置為該VIP地址,調度器根據演算法在選出真實伺服器後,在不修改數據報文的情況 下,將數據幀的MAC地址修改為選出的伺服器的MAC地址,通過交換機將該數據幀轉發給真實伺服器,整個過程中,真實伺服器的VIP不需要對外界可見;
******因為調度器與真實伺服器都設置了VIP地址,所以這裡要求所有的真實伺服器要禁止對VIP地址的ARP響應,方法是通過arp_ignore與arp_announce來實現的:
vim /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
3》LVS複製均衡調度演算法:
根據前面的介紹,我們瞭解了LVS的三種模式,但不管實際環境中採用的是哪種模式,調度器進行調度的策略與演算法都是LVS的核心技術,LVS在內核中主要實現了以下 八種調度演算法:
輪詢調度;
加權輪詢調度;
最小連接調度;
加權最小連接調度;
基於局部性最少的連接;
帶複製的基於局部性最少連接;
目標地址散列調度;
源地址散列調度;
輪詢演算法(RR):按依次迴圈的方式將請求調度到不同的伺服器上,該演算法最大的特定就是實現簡單,輪詢演算法假設所有的伺服器處理請求的能力都是一樣的,調度器會 將所有的請求平均分配給每個真實伺服器;
加權輪詢演算法(WRR):主要是對輪詢演算法的一種優化與補充,LVS會考慮每台伺服器的性能,並給每台伺服器添加一個權值,如果伺服器A的權值為1,伺服器B的權值 為2,則調度器調度到伺服器B的請求回事伺服器A的兩倍,權值越高的伺服器,處理的請求越多;
最小連接調度演算法(LC):把請求調度到連接數最小的伺服器上,而加權最小連接演算法(WLC)則是給每個伺服器一個權值,調度器會儘可能保持伺服器連接數量與權值 之間的平衡;
基於局部性的最少連接調度演算法(lblc):是請求數據包的目標IP地址的一種調度演算法,該演算法先根據請求的目標IP地址尋找最近目標IP地址所使用的伺服器,如果這台服 務器依然可用,並且有能力處理該請求,調度器會儘量選擇相同的伺服器,否則會繼續選擇其他可行的伺服器;帶複製的基於局 部性最少連接演算法記錄的不是一個目標IP與一臺伺服器之間連接記錄,它會維護一個目標IP到一組伺服器之間的映射關係,防止 單點伺服器負載過高;
目標地址散列調度演算法(DH):是根據目標IP地址通過散列函數將目標IP與伺服器建立映射關係,出現伺服器不可用或負載過高的情況下,發往該目標IP的請求會固定發給 該伺服器;
源地址散列調度演算法(SH):與目標地址散列調度演算法類似,但它是根據源地址散列演算法進行行靜態分配固定的伺服器資源;
4》部署LVS服務:
LVS現在已經集成在Linux內核模塊中,但整個LVS環境中又分為內核層與用戶層,內核層複製核心演算法的實現,用戶層需要安裝ipvsadm工具,通過命令將管理員需要 的工作模式與實現演算法傳遞給內核來實現,LVS的內核模塊名稱為Ip_vs,我們可以使用YUM方式安裝ipvsadm,也可以自行去官網下載使用源碼安裝;
1>YUM安裝:
YUM安裝需要確保本機可以連接YUM源,可以從YUM源中下載RPM格式軟體包;
yum -y install ipvsadm
2>源碼安裝:
源碼安裝需要使用YUM安裝相關的依賴軟體包,Ipvsadm源碼軟體可以從官方網站下載,下載後使用標準的make,make install,編譯,安裝即可;
#yum -y install gcc popt popt-devel popt-static libn1 libn1-devel
#wget http://www.linuxvirtualserver.org/softwart/kernel-2.6/ipvsadm-1.26.tar.gz
#tar -xvf ipvsadm-1.26.tar.gz -C /usr/src
#cd /usr/src/ipvsadm-1.26
#make
#make install
3>相關命令:
無論使用哪種方式安裝ipvsadm軟體,安裝完成後都會生成一個同名的命令工具,我們需要使用該命令來管理配置LVS虛擬伺服器組和相應的調度演算法;
ipvsadm命令的描述和用法如下:
描述:Linux虛擬伺服器管理工具;
用法:ipvsadm 選項 伺服器地址 -s 演算法
ipvsadm 選項 伺服器地址 -r 真實伺服器地址【工作模式】【權重】
選項:
-A 添加一個虛擬服務,使用IP地址,埠號,協議來唯一定義一個虛擬服務;
-E 編輯一個虛擬服務;
-D 刪除一個虛擬服務
-C 清空虛擬服務表
-R 從標準輸入中還原虛擬服務規則
-S 保存虛擬服務規則至標準輸出,輸出的規則可以使用-R導入還原
-a 在虛擬服務中添加一臺真實伺服器
-e 在虛擬服務中編輯一臺真實伺服器
-d 在虛擬服務中減少一臺真實伺服器
-L 顯示虛擬服務列表
-t 使用TCP服務,該參數後需要跟主機與埠信息
-u 使用UDP服務,該參數後需要跟主機與埠信息
-s 指定LVS所採用的調度演算法
-r 設置真實伺服器IP地址與埠信息
-g 設置LVS工作模式為DR直連路由模式
-i 設置LVS工作模式為TUN隧道模式
-m 設置LVS工作模式為NAT地址轉換模式
-w 設置指定伺服器的權重
-c 連接狀態,需要配合-L使用
-n 數字格式輸出
命令示例:
添加一個虛擬服務,設置調度演算法為輪詢,所有使用的TCP協議訪問124.126.147.168的80埠的請求,最終被調度器通過NAT模式轉發給了 192.168.0.1,192.168.0.2,192.168.0.3這三台主機的80埠:
service ipvsadm save 保存調度規則
sed -l /ip_forward/s/0/1/ /etc/sysctl.conf 重新載入sysctl.conf
查看LVS規則表:
查看當前IPVS調度狀態:
刪除為虛擬服務提供WEB功能的真實伺服器192.168.0.3:
[root@hadoop-master ~]# ipvsadm -d -t 124.126.147.168:80 -r 192.168.0.3
虛擬服務規則表備份與還原:
修改虛擬服務的調度演算法:
[root@hadoop-master ~]# ipvsadm -E -t 124.126.147.168:80 -s wrr
創建一個使用WRR演算法的虛擬服務,工作模式為直接路由(DR)模式,在該虛擬服務上添加兩台真實伺服器,併為每台真實伺服器設置權重:
5》常見問題分析:
1>路由轉發功能:
在LVS(NAT)工作模式中,LVS調度器必須能夠提供數據轉發功能,而系統預設的規則沒有開啟路由轉發功能,需要手動修改/etc/sysctl.conf文件開啟該功能;
2>在LVS(NAT)工作模式中,調度器處理擔當調度的角色外,還需要擔當路由的角色,但系統的防火牆轉發規則預設禁止轉發,因此需要將轉發規則清空:
iptables -F
Iptables -X
service iptables save
3>在LVS(DR)工作模式下,由於所有的真實伺服器都配置了VIP地址,因此需要設置伺服器不進行針對VIP地址的ARP廣播,Linux中可以直接通過arp_ignore與 arp_announce來實現;
arp_ignore用來定義網卡在響應外部ARP請求時的響應級別:
0:預設值,任何網路介面收到ARP請求後,如果本機的任意介面有該MAC,則予以響應;
1:某個網路介面收到ARP請求後,判斷請求的MAC地址是否是本介面,是則回應,否則不回應,LVS調度器會將客戶請求轉發給真實伺服器的eth0介面,而 真實伺服器的VIP地址配置在迴環設備上;
arp_announce用來定義網卡廣播ARP包時的級別:
0:預設值,任何網路介面接收到ARP請求後,如果本機的任意介面有該MAC,則予以響應;
1:儘量避免響應MAC地址非本網路介面MAC地址的ARP請求;
2:不響應MAC地址非本網路介面MAC地址的ARP請求;