LVS集羣和Keepalived高可用實戰

第四十章LVS集羣和Keepalived高可用實戰

1、ARP協議

一、概念

地址解析協議,即ARP(AddressResolutionProtocol),是根據IP地址獲取物理MAC地址的一個TCP/IP協議主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的全部主機,並接收返回消息,以此肯定目標的物理地址;收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源。html

二、功能

OSI模型把網絡工做分爲七層,IP地址在OSI模型的第三層,MAC地址在第二層,彼此不直接打交道。在經過以太網發送IP數據包時,須要先封裝第三層(32位IP地址)、第二層(48位MAC地址)的報頭,但因爲發送時只知道目標IP地址,不知道其MAC地址,又不能跨第2、三層,因此須要使用地址解析協議。使用地址解析協議,可根據網絡層IP數據包包頭中的IP地址信息解析出目標硬件地址(MAC地址)信息,以保證通訊的順利進行。ARP是三層協議,可是工做在二層前端

三、工做過程

主機A的IP地址爲192.168.1.1,MAC地址爲0A-11-22-33-44-01;mysql

主機B的IP地址爲192.168.1.2,MAC地址爲0A-11-22-33-44-02;linux

當主機A要與主機B通訊時,地址解析協議能夠將主機B的IP地址(192.168.1.2)解析成主機B的MAC地址,如下爲工做流程:nginx

第1步:根據主機A上的路由表內容,IP肯定用於訪問主機B的轉發IP地址是192.168.1.2。而後A主機在本身的本地ARP緩存中檢查主機B的匹配MAC地址。web

第2步:若是主機A在ARP緩存中沒有找到映射,它將詢問192.168.1.2的硬件地址,從而將ARP請求幀廣播到本地網絡上的全部主機。源主機A的IP地址和MAC地址都包括在ARP請求中。本地網絡上的每臺主機都接收到ARP請求而且檢查是否與本身的IP地址匹配。若是主機發現請求的IP地址與本身的IP地址不匹配,它將丟棄ARP請求。算法

第3步:主機B肯定ARP請求中的IP地址與本身的IP地址匹配,則將主機A的IP地址和MAC地址映射添加到本地ARP緩存中。sql

第4步:主機B將包含其MAC地址的ARP回覆消息直接發送回主機A。數據庫

第5步:當主機A收到從主機B發來的ARP回覆消息時,會用主機B的IP和MAC地址映射更新ARP緩存。本機緩存是有生存期的,生存期結束後,將再次重複上面的過程。主機B的MAC地址一旦肯定,主機A就能向主機B發送IP通訊了。apache

ARP協議要求通訊的主機雙方必須在同一網段(即局域網環境)

四、ARP緩存

ARP緩存是個用來儲存IP地址和MAC地址的緩衝區,其本質就是一個IP地址-->MAC地址的對應表,表中每個條目分別記錄了網絡上其餘主機的IP地址和對應的MAC地址。每個以太網或令牌環網絡適配器都有本身單獨的表。當地址解析協議被詢問一個已知IP地址節點的MAC地址時,先在ARP緩存中查看,若存在,就直接返回與之對應的MAC地址,若不存在,才發送ARP請求向局域網查詢。

爲使廣播量最小,ARP維護IP地址到MAC地址映射的緩存以便未來使用。ARP緩存能夠包含動態和靜態項目。動態項目隨時間推移自動添加和刪除。每一個動態ARP緩存項的潛在生命週期是10分鐘。新加到緩存中的項目帶有時間戳,若是某個項目添加後2分鐘內沒有再使用,則此項目過時並從ARP緩存中刪除;若是某個項目已在使用,則又收到2分鐘的生命週期;若是某個項目始終在使用,則會另外收到2分鐘的生命週期,一直到10分鐘的最長生命週期。靜態項目一直保留在緩存中,直到從新啓動計算機爲止。

arp緩存表是把雙刃劍

(1)有arp緩存表能夠加快arp的解析速度

(2)也給黑客帶來了攻擊服務器的風險,俗稱arp欺騙和arp攻擊

五、ARP欺騙原理

arp攻擊就是經過僞造ip地址和mac地址對實現arp欺騙。地址解析協議是創建在網絡中各個主機互相信任的基礎上的,它的誕生使得網絡可以更加高效的運行,但其自己也存在缺陷:

ARP地址轉換表是依賴於計算機中高速緩衝存儲器動態更新的,而高速緩衝存儲器的更新是受到更新週期的限制的,只保存最近使用的地址的映射關係表項,這使得攻擊者有了可乘之機,能夠在高速緩衝存儲器更新表項以前修改地址轉換表,實現攻擊。ARP請求爲廣播形式發送的,網絡上的主機能夠自主發送ARP應答消息,而且當其餘主機收到應答報文時不會檢測該報文的真實性就將其記錄在本地的MAC地址轉換表,這樣攻擊者就能夠向目標主機發送僞ARP應答報文,從而篡改本地的MAC地址表。ARP欺騙能夠致使目標計算機與網關通訊失敗,更會致使通訊重定向,全部的數據都會經過攻擊者的機器,所以存在極大的安全隱患。

如何防止:

arp -s 192.168.0.11 mac

六、ARP命令
(1)arp -a或arp –g

用於查看緩存中的全部項目。-a和-g參數的結果是同樣的,多年來-g一直是UNIX平臺上用來顯示ARP緩存中全部項目的選項,而Windows用的是arp-a(-a可被視爲all,即所有的意思),但它也能夠接受比較傳統的-g選項。

(2)arp -a ip

若是有多個網卡,那麼使用arp-a加上接口的IP地址,就能夠只顯示與該接口相關的ARP緩存項目。

(3)arp -s ip mac地址

能夠向ARP緩存中人工輸入一個靜態項目。該項目在計算機引導過程當中將保持有效狀態,或者在出現錯誤時,人工配置的物理地址將自動更新該項目。

(4)arp -d ip

使用該命令可以人工刪除一個靜態項目。

七、ARP在生產環境產生的問題和解決辦法
(1)ARP病毒和ARP欺騙
(2)高可用服務器對切換時要考慮ARP緩存的問題
(3)路由器等設備無縫遷移時要考慮ARP緩存的問題

2、LVS基礎概念

一、集羣
(1)定義

一組計算機依靠網絡協同工做就是集羣

(2)做用(性能,可用性,伸縮性,擴展性,安全)

a、高性能(performance)評價一個網站好壞的直接感觸

b、價格有效性,小型機(IBM)特貴

c、高可用性:7*24運行availability

d、可伸縮性:可動態添加新機器scalability數據庫的伸縮很困難

(3)優點

a、透明性(Transparency)

如何高效地使得由多個獨立計算機組成的鬆藕合的集羣系統構成一個虛擬服務器;客戶端應用程序與集羣系統交互時,就像與一臺高性能、高可用的服務器交互同樣,客戶端無須做任何修改。部分服務器的切入和切出不會中斷服務,這對用戶也是透明的。

b、性能(Performance)

性能要接近線性加速,這須要設計很好的軟硬件的體系結構,消除系統可能存在的瓶頸。將負載較均衡地調度到各臺服務器上。

c、高可用性(Availability)

須要設計和實現很好的系統資源和故障的監測和處理系統。當發現一個模塊失敗時,要這模塊上提供的服務遷移到其餘模塊上。在理想情況下,這種遷移是即時的、自動的。

d、可管理性(Manageability)

要使集羣系統變得易管理,就像管理一個單一映像系統同樣。在理想情況下,軟硬件模塊的插入能作到即插即用(Plug&Play)。

e、可編程性(Programmability)

在集羣系統上,容易開發應用程序。

(4)分類

a、LB:負載均衡集羣

b、HA:高可用性集羣

c、高性能計算

d、網格計算

(5)負載均衡的做用

a、分擔請求和數據流量,從而增長吞吐量,併發量

b、保證集羣的7*24小時服務

c、用於web服務器,數據庫的從庫

(6)集羣軟件

a、典型負載均衡軟件:lvs、F5(4osi) 、nginx(7osi) 、haproxy(4+7osi)

b、典型的高可用軟件:keepalived、heratbeat

c、互聯網商業集羣硬件:F五、netscaler、redware、A10

(7)LVS集羣的特色

a、功能

有實現3種IP負載均衡技術和10種鏈接調度算法的IPVS軟件。在IPVS內部實現上,採用了高效的Hash函數和垃圾回收機制,能正確處理所調度報文相 關的ICMP消息(有些商品化的系統反而不能)。虛擬服務的設置數目沒有限制,每一個虛擬服務有本身的服務器集。它支持持久的虛擬服務(如HTTP Cookie和HTTPS等須要該功能的支持),並提供詳盡的統計數據,如鏈接的處理速率和報文的流量等。針對大規模拒絕服務(Deny of Service)攻擊,實現了三種防衛策略。有基於內容請求分發的應用層交換軟件KTCPVS,它也是在Linux內核中實現。有相關的集羣管理軟件對資源進行監測,能及時將故障屏蔽,實現系統的高可用性。主、從調度器能週期性地進行狀態同步,從而實現更高的可用性。

b、適用性

後端服務器可運行任何支持TCP/IP的操做系統,包括Linux,各類Unix(如FreeBSD、SunSolaris、HP Unix等),Mac/OS和Windows NT/2000等。負載調度器可以支持絕大多數的TCP和UDP協議:TCP包含HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等,UDP包含DNS,NTP,ICP,視頻、音頻流播放協議等無需對客戶機和服務器做任何修改,可適用大多數Internet服務。

c、性能

LVS服務器集羣系統具備良好的伸縮性,可支持幾百萬個併發鏈接。配置100M網卡,採用VS/TUN或VS/DR調度技術,集羣系統的吞吐量可高達1Gbits/s;如配置千兆網卡,則系統的最大吞吐量可接近10Gbits/s。

d、可靠性

LVS服務器集羣軟件已經在不少大型的、關鍵性的站點獲得很好的應用,因此它的可靠性在真實應用獲得很好的證明。有不少調度器運行一年多,未做一次重啓動。

二、LVS負載均衡軟件
(1)簡介

LVS是Linux虛擬服務器(LinuxVirtualServers),使用負載均衡技術將多臺服務器組成一個虛擬服務器。它爲適應快速增加的網絡訪問需求提供了一個負載能力易於擴展,而價格低廉的解決方案。LVS實際上是一種集羣(Cluster)技術,採用IP負載均衡技術(LVS的IP負載均衡技術是經過IPVS模塊來實現的,linux內核2.6版本以上是默認安裝IPVS的)和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,並且無需修改客戶端和服務器端的程序。

 

LVS負載均衡調度技術是在LINUX內核中實現的,所以被稱之爲LINUX虛擬服務器。咱們使用該軟件配置LVS時候,不能直接配置內核中的IPVS,而須要使用IPVS的管理工具ipvsadm進行管理,固然咱們也能夠經過keepalived軟件直接管理IPVS,並非經過ipvsadm來管理ipvs。

(2)LVS技術點

a、真正實現調度的工具是IPVS,工做在LINUX內核層面。

b、LVS自帶的IPVS管理工具是ipvsadm。

c、keepalived實現管理IPVS及負載均衡器的高可用。

d、Redhat工具PiranhaWEB管理實現調度的工具IPVS(不經常使用)

(3)LVS專業術語:

 

a、VIP:虛擬ip地址virturalipaddress用於給客戶端計算機提供服務的ip地址

b、RIP:realip,集羣下面節點使用的ip地址,物理ip地址

c、DIP:directorip用於鏈接內外網絡的ip,物理網卡上的ip地址,他是負載均衡器上的ip

d、CIP:clientip客戶端用戶計算機請求集羣服務器的ip地址,該地址用做發送給集羣的請求的源ip地址

(4)ARP抑制

a、爲何要抑制RS服務器上的ARP

爲了讓RS服務器可以處理目標地址爲vip的IP包,首先必需要讓RS能接收到這個包,這就需將VIP綁定到RS服務器的lo接口上,讓RS服務器可以完成接收包並將結果返回client。不能夠將VIP設置在出口網卡上,不然會響應客戶端的arprequest,形成client/gatewayarp table紊亂,以致於整個loadbalance都不能正常工做。抑制ARP是爲了防止RS和LVS調度服務器上的VIP衝突,由於RS和LVS調度服務器上的VIP是一個IP,抑制RS服務器的ARP響應,可讓RS服務器不響應ARP請求,有效解決同一VIP衝突

b、抑制ARP的命令

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

c、抑制ARP命令詳解

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

這兩條是能夠不用的,由於arp對邏輯接口沒有意義。

若是你的RS的外部網絡接口是eth0,那麼

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

我的建議把上面兩條也加到你的腳本里去,由於萬一系統裏上面兩條默認的值不是0,那有多是會出問題。

arp_ignore:定義對目標地址爲本地IPARP詢問不一樣的應答模式

0 - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求

1 - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求

2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內

3 - 不迴應該網絡界面的arp請求,而只對設置的惟一和鏈接地址作出迴應

4-7 - 保留未使用

8 -不迴應全部(本地地址)的arp查詢

arp_announce- INTEGER對網絡接口上,本地IP地址的發出的,ARP迴應,做出相應級別的限制:肯定不一樣程度的限制,宣佈對來自本地源IP地址發出Arp請求的接口

0 - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址

1 -儘可能避免不在該網絡接口子網段的本地地址作出arp迴應. 當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候頗有用.此時會檢查來訪IP是否爲全部接口上的子網段內ip之一.若是改來訪IP不屬於各個網絡接口上的子網段內,那麼將採用級別2的方式來進行處理.

2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇全部的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 若是沒有合適的地址被發現,將選擇當前的發送網絡接口或其餘的有可能接受到該ARP迴應的網絡接口來進行發送. 限制了使用本地的vip地址做爲優先的網絡接口

三、LVS的工做模式
(1)NAT模型

a、原理圖

①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP(客戶端IP),後面統稱爲CIP),目標地址爲VIP(負載均衡器前端地址,後面統稱爲VIP)。

②.負載均衡器收到報文後,發現請求的是在規則裏面存在的地址,那麼它將客戶端請求報文的目標地址改成了後端服務器的RIP地址並將報文根據算法發送出去。

③.報文送到RealServer後,因爲報文的目標地址是本身,因此會響應該請求,並將響應報文返還給LVS。

④.而後lvs將此報文的源地址修改成本機併發送給客戶端。

注意:在NAT模式中,RealServer的網關必須指向LVS,不然報文沒法送達客戶端。

b、IP包調度過程圖

c、小結

(i)NAT技術將請求的報文和響應的報文都須要經過LB進行地址改寫,所以網站訪問量比較大的時候LB負載均衡調度器有比較大的瓶頸,通常要求最多之能10-20臺節點

(ii)須要在LB上配置一個公網IP地址就能夠了。

(iii)每臺內部的realserver服務器的網關地址必須是調度器LB的內網地址。

(v)NAT模式支持對IP地址和端口進行轉換。即用戶請求的端口和真實服務器的端口能夠不一致。

d、優缺點

(i)優勢

集羣中的物理服務器可使用任何支持TCP/IP操做系統,只有負載均衡器須要一個合法的IP地址。

(ii)缺點

擴展性有限。當服務器節點(普通PC服務器)增加過多時,負載均衡器將成爲整個系統的瓶頸,由於全部的請求包和應答包的流向都通過負載均衡器。當服務器節點過多時,大量的數據包都交匯在負載均衡器那,速度就會變慢!

(2)DR模型

a、原理圖

.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址爲VIP

.負載均衡器收到報文後,發現請求的是在規則裏面存在的地址,那麼它將客戶端請求報文的源MAC地址改成本身DIPMAC地址,目標MAC改成了RIPMAC地址,並將此包發送給RS

.RS發現請求報文中的目的MAC是本身,就會將次報文接收下來,處理完請求報文後,將響應報文經過lo接口送給eth0網卡直接發送給客戶端。

注意:須要設置lo接口的VIP不能響應本地網絡內的arp請求(也叫ARP抑制)。

b、IP包調度過程圖

c、小結

(i)經過在調度器LB上修改數據包的目的MAC地址實現轉發。注意源地址仍然是CIP,目的地址仍然是VIP地址。

(ii)請求的報文通過調度器,而RS響應處理後的報文無需通過調度器LB,所以併發訪問量大時使用效率很高(和NAT模式比)

(iii)由於DR模式是經過MAC地址改寫機制實現轉發,所以全部RS節點和調度器LB只能在一個局域網裏面

(v)RS主機須要綁定VIP地址在LO接口(掩碼32位)上,而且須要配置ARP抑制。

(vi)RS節點的默認網關不須要配置成LB,而是直接配置爲上級路由的網關,能讓RS直接出網就能夠。

(vii)因爲DR模式的調度器僅作MAC地址的改寫,因此調度器LB就不能改寫目標端口,那麼RS服務器就得使用和VIP相同的端口提供服務。

(viii)直接對外的業務好比WEB等,RS的IP最好是使用公網IP。對外的服務,好比數據庫等最好使用內網IP。

d、優缺點

(i)優勢

TUN(隧道模式)同樣,負載均衡器也只是分發請求,應答包經過單獨的路由方法返回給客戶端。與VS-TUN相比,VS-DR這種實現方式不須要隧道結構,所以可使用大多數操做系統作爲物理服務器。

DR模式的效率很高,可是配置稍微複雜一點,所以對於訪問量不是特別大的公司能夠用haproxy/nginx取代。日1000-2000WPV或者併發請求1萬一下均可以考慮用haproxy/nginx

(ii)缺點

全部RS節點和調度器LB只能在一個局域網裏面。

(3)TUN模型

a、原理圖

.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址爲VIP

.負載均衡器收到報文後,發現請求的是在規則裏面存在的地址,那麼它將在客戶端請求報文的首部再封裝一層IP報文,將源地址改成DIP,目標地址改成RIP,並將此包發送給RS

.RS收到請求報文後,會首先拆開第一層封裝,而後發現裏面還有一層IP首部的目標地址是本身lo接口上的VIP,因此會處理次請求報文,並將響應報文經過lo接口送給eth0網卡直接發送給客戶端。

注意:須要設置lo接口的VIP不能在共網上出現。

b、IP包調度過程圖

c、小結

(i)TUNNEL模式必須在全部的realserver機器上面綁定VIP的IP地址

(ii)TUNNEL模式的vip------>realserver的包通訊經過TUNNEL模式,無論是內網和外網都能通訊,因此不須要lvsvip跟realserver在同一個網段內

(iii)TUNNEL模式realserver會把packet直接發給client不會給lvs了

(v)TUNNEL模式走的隧道模式,因此運維起來比較難,因此通常不用。

d、優缺點

(i)優勢

負載均衡器只負責將請求包分發給後端節點服務器,而RS將應答包直接發給用戶。因此,減小了負載均衡器的大量數據流動,負載均衡器再也不是系統的瓶頸,就能處理很巨大的請求量,這種方式,一臺負載均衡器可以爲不少RS進行分發。並且跑在公網上就能進行不一樣地域的分發。

(ii)缺點

隧道模式的RS節點須要合法IP,這種方式須要全部的服務器支持」IPTunneling(IPEncapsulation)協議,服務器可能只侷限在部分Linux系統上。

(4)FULLNAT模型FullNetworkAddressTranslation

a、原理圖

不管是DR仍是NAT模式,不可避免的都有一個問題:LVSRS必須在同一個VLAN下,不然LVS沒法做爲RS的網關。

這引起的兩個問題是:

.同一個VLAN的限制致使運維不方便,跨VLANRS沒法接入。

.LVS的水平擴展受到制約。當RS水平擴容時,總有一天其上的單點LVS會成爲瓶頸。

Full-NAT由此而生,解決的是LVSRSVLAN的問題,而跨VLAN問題解決後,LVSRS再也不存在VLAN上的從屬關係,能夠作到多個LVS對應多個RS,解決水平擴容的問題。

Full-NAT相比NAT的主要改進是,在SNAT/DNAT的基礎上,加上另外一種轉換,轉換過程以下:

在包從LVS轉到RS的過程當中,源地址從客戶端IP被替換成了LVS的內網IP

內網IP之間能夠經過多個交換機跨VLAN通訊。

RS處理完接受到的包,返回時,會將這個包返回給LVS的內網IP,這一步也不受限於VLAN

LVS收到包後,在NAT模式修改源地址的基礎上,再把RS發來的包中的目標地址從LVS內網IP改成客戶端的IP

Full-NAT主要的思想是把網關和其下機器的通訊,改成了普通的網絡通訊,從而解決了跨VLAN的問題。採用這種方式,LVSRS的部署在VLAN上將再也不有任何限制,大大提升了運維部署的便利性。

b、IP包調度過程圖

c、小結

(i)FULLNAT模式也不須要LBIP和realserverip在同一個網段;fullnat跟nat相比的優勢是:保證RS回包必定可以回到LVS;由於源地址就是LVS-->不肯定

(ii)fullnat由於要更新sorceip因此性能正常比nat模式降低10%

(5)四種模式對比總結

性能:DR>TUN>NAT>FULLNAT

因爲每一個模式的功能不同,因此具體的選擇仍是要根據公司業務的選擇,實際環境來決定。

四、LVS調度算法
(1)IPVS調度器實現了以下十種負載調度算法

固定調度算法:rr,wrr,dh,sh

動態調度算法:wlc,lc,lblc,lblcr,SED,NQ.

最經常使用的三種:RR WRR WLC

(2)固定調度算法

a、rr:輪詢調度(Round Robin)

將請求依次分配不一樣的RS節點,RS服務器均攤請求,這種算法比較簡單,可是隻適合RS節點相差性能不大的狀況

b、wrr:加權輪詢調度(Weighted Round Robin)

它將依據不一樣RS節點的權值分配任務,權值高的RS將優先得到任務,而且分配的鏈接數比權值低的RS節點更多。相同權值的RS獲得相同數目的鏈接數

c、dh:目標地址散列(destination hashing)

以目的地址爲關鍵字查找一個靜態hash表來獲取須要的RS

d、sh:源地址散列(source hashing)

 以源地址爲關鍵字查找一個靜態hash表來獲取須要的RS

(3)動態調度算法:

a、wlc:加權最小鏈接數調度(weighted least-connection)

假設各臺RS的權值依次爲Wi(i=1...n) 。當前的tcp鏈接數依次爲Ti(i=1..n),依次取TI/WI爲最小的RS做爲下一個分配的RS

b、LC:最少連接(Least Connections)

調度器經過"最少鏈接"調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用"最小鏈接"調度算法能夠較好地均衡負載。

c、LBLC:基於局部性的最少連接(Locality-Based LeastConnections)

"基於局部性的最少連接" 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用"最少連接"的原則選出一個可用的服務器,將請求發送到該服務器。

d、LBLCR:帶複製的基於局部性最少連接(Locality-Based LeastConnections with Replication)

"帶複製的基於局部性最少連接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按"最小鏈接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小鏈接"原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。

e、SED:最短時間望延遲(ShortestExpected Delay)

基於wlc算法,簡單算法:(active+1)*256/weight 【(活動的鏈接數+1)*256/除以權重】

f、NQ:永不排隊(never queue)

無需隊列(改進的sed),若是有臺realserver的鏈接數=0就直接分配過去,不須要在進行sed運算。

(4)LVS調度算法的生產環境選型

a、通常的網絡服務,如http,mail,mysql等經常使用的LVS調度算法爲:基本輪詢調度RR、加權最小鏈接調度WLC、加權輪詢調度WRR

b、基於局部性的最小鏈接LBLC和帶複製的給予局部性最小鏈接LBLCR主要適用於web cache和DB cache

c、源地址散列調度SH和目標地址散列調度DH能夠結合使用在防火牆集羣中,能夠保證整個系統的出入口惟一。

d、最短時間望延遲SED和永不排隊NQ調度算法主要是處理時間相對較長的網絡服務。

實際適用中這些算法的適用範圍不少,工做中最好參考內核中的鏈接調度算法的實現原理,而後根據具體的業務需求合理的選型。

五、LVS軟件許可證和官方資料
(1)軟件許可證

LVS集羣軟件是按GPL(GNU Public License)許可證發行的自由軟件,這意味着你能夠獲得軟件的源代碼,有權對其進行修改,但必須保證你的修改也是以GPL方式發行。

(2)官方資料

LVS項目介紹:http://www.linuxvirtualserver.org/zh/lvs1.html

LVS集羣的體系結構http://www.linuxvirtualserver.org/zh/lvs2.html

LVS集羣中ip負載均衡技術http://www.linuxvirtualserver.org/zh/lvs3.html

LVS負載調度http://www.linuxvirtualserver.org/zh/lvs4.html

3、LVS實戰

一、演示環境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

LVS調度器(1.26)

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

RS1

LAMP

192.168.1.218

CentOS6.8_32

RS2

LNMP

二、安裝lvs軟件
(1)下載相關軟件包

ipvsadm-1.26版本適用於ContOS6.x,ipvsadm-1.24版本適用於ContOS5.x

cd /tools

wgethttp://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

(2)查看內核模塊是否加載/安裝了ip_vs

lsmod | grep ip_vs  #無結果,ip_vs沒有安裝

(3)加載/安裝ip_vs

a、建立內核的軟連接

ln -s /usr/src/kernels/2.6.32-431.el6.i686/ /usr/src/linux

ll /usr/src/

drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug

drwxr-xr-x. 3 root root 4096 Jan 1 23:39 kernels

lrwxrwxrwx  1 root root   37 Jun 11 16:07 linux ->/usr/src/kernels/2.6.32-431.el6.i686/

注:若是沒有/usr/src/kernels/2.6.32-431.el6.i686/路徑,通常是沒有安裝kernel-devel軟件包,能夠經過yum install kerner-devel -y安裝。

若若是/usr/src/kernels/下有多個版本路徑,則以uname -r顯示的爲準。因此軟連接也能夠這樣:ln -s /usr/src/kernels/`uname-r`/ /usr/src/linux

也可能不用軟連接,直接指定內核參數進行編譯。

b、安裝ipvsadm-1.26(會在make時報錯)

cd tools

tar zxf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make     #不須要configure

make install

c、make階段報錯處理

(i)報錯內容

make[1]: *** [libipvs.o] Error 1

make[1]: Leaving directory `/wddg-data/tools/ipvsadm-1.26/libipvs'

make: *** [libs] Error 2

(ii)解決方法

yum install libnl* popt* -y

(iii)解決過程

yum install libnl* popt* -y

。。。

Running Transaction

  Installing :popt-static-1.13-7.el6.i686      1/6

  Installing :libnl-devel-1.1.4-2.el6.i686     2/6

  Installing :libnl3-3.2.21-8.el6.i686         3/6

  Installing :libnl3-cli-3.2.21-8.el6.i686     4/6

  Installing :libnl3-devel-3.2.21-8.el6.i686   5/6

  Installing :libnl3-doc-3.2.21-8.el6.i686     6/6

Unable to connect to dbus

  Verifying  : libnl-devel-1.1.4-2.el6.i686     1/6

  Verifying  : libnl3-devel-3.2.21-8.el6.i686   2/6

  Verifying  : libnl3-doc-3.2.21-8.el6.i686     3/6

  Verifying  : popt-static-1.13-7.el6.i686      4/6

  Verifying  : libnl3-3.2.21-8.el6.i686         5/6

  Verifying  : libnl3-cli-3.2.21-8.el6.i686     6/6

Installed:

  libnl-devel.i6860:1.1.4-2.el6

  libnl3.i686 0:3.2.21-8.el6

  libnl3-cli.i6860:3.2.21-8.el6

  libnl3-devel.i6860:3.2.21-8.el6

  libnl3-doc.i6860:3.2.21-8.el6

  popt-static.i6860:1.13-7.el6

(v)再次make

(4)再次查看內核模塊是否加載了ip_vs

lsmod | grep ip_vs  #仍是無結果,

(5)手動加載ip_vs

a、方法一

modprobe ip_vs

b、方法二(本例使用)

/sbin/ipvsadm

(6)查看內核模塊是否加載了ip_vs

lsmod | grep ip_vs

ip_vs                102058  0

libcrc32c            841  1 ip_vs

ipv6                 261089  13 ip_vs

(7)LVS安裝小結

a、centos 5.x 安裝lvs,使用1.24版本,不要用1.2.6

b、centos6.x  安裝1.26版本,而且先安裝 yuminstall libnl*  popt* -y

c、安裝LVS後,要執行ipvsadm把ip_vs模塊加載到內核

三、ipvsadm經常使用參數

ipvsadm --help

ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

Usage:

  ipvsadm -A|E -t|u|fservice-address [-s scheduler] [-p [timeout]] [-M netmask] [--pepersistence_engine]

  ipvsadm -D -t|u|fservice-address

  ipvsadm -C

  ipvsadm -R

  ipvsadm -S [-n]

  ipvsadm -a|e -t|u|fservice-address -r server-address [options]

  ipvsadm -d -t|u|fservice-address -r server-address

  ipvsadm -L|l [options]

  ipvsadm -Z [-t|u|fservice-address]

  ipvsadm --set tcp tcpfin udp

  ipvsadm --start-daemon state[--mcast-interface interface] [--syncid sid]

  ipvsadm --stop-daemon state

  ipvsadm -h

 

Commands:

Either long or short options are allowed.

  --add-service     -A       add virtual service with options

  --edit-service    -E       edit virtual service with options

  --delete-service  -D       delete virtual service

  --clear             -C       clear the whole table

  --restore          -R       restore rules from stdin

  --save              -S       save rules to stdout

  --add-server       -a       add real server with options

  --edit-server      -e       edit real server with options

  --delete-server    -d       delete real server

  --list              -L|-l    list the table

  --zero               -Z       zero counters in a service or all services

  --set tcp tcpfin udp        set connection timeout values

  --start-daemon              start connection sync daemon

  --stop-daemon               stop connection sync daemon

  --help                -h       display this help message

Options:

  --tcp-service  -t service-address   service-address is host[:port]

  --udp-service -u service-address  service-address is host[:port]

  --fwmark-service  -f fwmark         fwmark is an integer greater than zero

  --ipv6         -6                   fwmark entry uses IPv6

  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

                                     the default scheduler is wlc.

  --pe            engine              alternate persistence engine maybe sip,

                                     not set by default.

  --persistent   -p [timeout]         persistent service

  --netmask      -M netmask           persistent granularity mask

  --real-server  -r server-address    server-address is host (and port)

  --gatewaying   -g                   gatewaying (direct routing)(default)

  --ipip         -i                   ipip encapsulation(tunneling)

  --masquerading -m                   masquerading (NAT)

  --weight       -w weight            capacity of real server

  --u-threshold  -x uthreshold        upper threshold of connections

  --l-threshold -y lthreshold        lowerthreshold of connections

  --mcast-interfaceinterface         multicast interface forconnection sync

  --syncid sid                        syncid for connectionsync (default=255)

  --connection   -c                  output of current IPVSconnections

  --timeout                           output of timeout(tcp tcpfin udp)

  --daemon                            output of daemoninformation

  --stats                             output ofstatistics information

  --rate                              output of rateinformation

  --exact                             expand numbers(display exact values)

  --thresholds                        output of thresholdsinformation

  --persistent-conn                   output of persistentconnection info

  --nosort                            disable sortingoutput of service/server entries

  --sort                              does nothing, forbackwards compatibility

  --ops          -o                   one-packet scheduling

  --numeric      -n                   numeric output of addressesand ports

四、手動配置lvs服務
(1)在lvs調度節點上配置vip

ifconfig eth0:1 192.168.1.169/24 up

ifconfig

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

eth0:1    inet addr:192.168.1.169  Bcast:192.168.1.255  Mask:255.255.255.0

lo         inet addr:127.0.0.1  Mask:255.0.0.0

ping 192.168.1.169

來自 192.168.1.169 的回覆: 字節=32 時間<1ms TTL=64

(2)在lvs調度節點上配置LVS服務並增長2臺節點服務器

#清空lvs配置

ipvsadm -C

#設置鏈接超進時間  set tcp tcpfin udp

ipvsadm --set 30 5 60

#-A:新增lvs服務,-t:指定服務器和端口192.168.1.169:80,-s:指定算法rr,-p:會話保持20秒

#至關於新增一臺虛擬服務器,ip必定使用配置的vip

ipvsadm -A -t 192.168.1.169:80 -s rr -p 20

#在vip上指定實際服務器ip和模式(-g:DR  -i:TUN  -m:NAT)

#-a:在vip上新增實際服務,-t:指定vip:port  -r:指定真實節點ip  -w:權重

ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.158 -g -w 1

ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.218 -g -w 1

#查看配置好的lvs

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.158:80           Route   1     0          0        

  -> 192.168.1.218:80           Route   1     0          0

(3)在RS節點的lo接口(網卡的迴環接口)上配置vip(192.168.1.169,掩碼特殊必須爲32位)

RS1上:ifconfig lo:1192.168.1.169/32up

RS2上:ifconfig lo:1192.168.1.169/32up

ifconfig

lo:1      Link encap:LocalLoopback 

          inetaddr:192.168.1.169  Mask:0.0.0.0

(4)在RS節點上抑制ARP響應 (RS1和RS2上分別執行)

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 "1" >/proc/sys/net/ipv4/conf/all/arp_announce

(5)測試LVS調度

a、在LVS調度節點上打開監控

watch -n 1 ipvsadm -L -n  #每秒刷新一次

Every 2.0s: ipvsadm -L -n                                                                                                                                                         SunJun 11 22:48:47 2017

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.218:80           Route   1     6          6

  -> 192.168.1.158:80           Route   1     2          0

b、在其它機器上打開http://192.168.1.169(正常訪問)

c、也可使用--status參數查看LVS狀態

ipvsadm -L -n --stats

五、刪除節點和服務
(1)刪除節點

ipvsadm -d -t 192.168.1.169:80 -r 192.168.1.218

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.158:80           Route   1     0          0           

(2)刪除服務

ipvsadm -D -t 192.168.1.169:80  #此時還沒法經過vip訪問到web

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

六、開發腳本配置LVS(設置爲開機啓動,確保長期生效)
(1)Server端腳本

vi /scripts/ipvs_server.sh

#!/bin/sh

. /etc/init.d/functions

VIP=192.168.1.169

PORT=80

RIP=(

   192.168.1.218

   192.168.1.158

)

start(){

ifconfig eth0:1 $VIP/24 up

route add -host $VIP dev eth0

ipvsadm -C

ipvsadm --set 30 5 60

ipvsadm -A -t $VIP:$PORT -s rr -p 20

for ((i=0;i<${#RIP[*]};i++))

do

ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1

done

echo "ipvs is started"

}

stop(){

ipvsadm -C

ifconfig eth0:1  down

route del -host $VIP dev eth0

echo "ipvs is stopped"

}

case "$1" in

    start)

        start

        ;;

    stop)

        stop

        ;;

    restart)

        stop

        start

        ;;

    *)

        echo "UASGE:$0  {start|stop|restart}"

esac

cp /scripts/ipvs_server.sh /usr/local/sbin/ipvs

cd /usr/local/sbin/

chmod +x ipvs

(2)Client端腳本

vi /scripts/ipvs_client.sh

#!/bin/sh

. /etc/init.d/functions

VIP=(

    192.168.1.169

    192.168.1.170

)

 

case "$1" in

    start)

        echo "start LVSof RealServer IP"

        for ((i=0;i<`echo${#VIP[*]}`;i++))

        do

           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"

            /sbin/ifconfig$interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up

            route add -host${VIP[$i]} dev $interface

        done

        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 "1">/proc/sys/net/ipv4/conf/all/arp_announce

        ;;

    stop)

        for ((i=0;i<`echo${#VIP[*]}`;i++))

        do

           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"

            /sbin/ifconfig$interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down

            route del -host${VIP[$i]} dev $interface

        done

        echo "stOP LVS ofRealServer IP"

        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

        ;;               

    *)

        echo "Usage: $0{start | stop}"

        exit 1

esac

七、ipvsadm生產經常使用命令組合

ipvsadm -Ln --stats

ipvsadm -Lnc

ipvsadm -Ln --thresholds

ipvsadm -Ln --timeout 

4、LVS負載均衡高可用解決方案

一、經常使用解決方案
(1)自已開發上面的腳本解決(不推薦,繁瑣、麻煩)

含server、client、健康檢查、高可用4類腳本

(2)heartbeart + lvs + ldirectord(不推薦,麻煩、不易控制)

heartbeart:負責VIP的切換以及資源的啓動中止

lvs:負責調度

ldirectord:負責RS節點的健康檢查

(3)Piranha配置lvs(不推薦,不經常使用)

Piranha是redhat提供的一個基於web的lvs配置軟件,可省去手工配置lvs的繁瑣工做,並人急提供cluter功能。

(4)keepalived + lvs(推薦,簡單、易用、高效)
二、LVS集羣分發請求不均衡解決方案
(1)不均衡的緣由

a、LVS會話保持

設置了LVS自身的會話保持參數(lvs:-p 300/keepalived:persistent 300)。

優化:大公司儘可能用cookies替代sesson,或用集中式session

b、LVS調度算法。rr、wrr、wlc、lc算法

c、後端RS節點的會話保持。如apache的keealive參數

d、訪問量較少的時候,不均衡比較明顯。

e、用戶發送的請求時間長短,和請求資源多少大小

(2)LVS排錯理論

排錯大致的思路就是,要熟悉LVS的工做原理過程,而後根據原理過程來排重,例如:

a、調度器上LVS調度規則及IP的正確性。

b、RS節點上VIP綁定和arp抑制的檢查。

生產處理思路:

對RS綁定的VIP作實時監控,出問題報警或者自動處理後報警。

把RS綁定的VIP作成配置文件,例如:vi/etc/sysconfig/network-scripts/lo:0

ARP抑制的配置思路:

若是是單個VIP,就能夠用stop傳參設置0

當RS端有多個VIP綁定,即便中止了一個VIP也不要修改ARP抑制。

c、RS節點上自身提供服務的檢查。

d、輔助排查工具備tepdump,ping等。

e、負載均衡以及反向代理集羣的三角形排查理論:

 

5、Keepalived高可用集羣

一、簡介

Heartbeat、Corosync、Keepalived這三個集羣組件咱們到底選哪一個好,首先我想說明的是,Heartbeat、Corosync是屬於同一類型,Keepalived與Heartbeat、Corosync,根本不是同一類型的。Keepalived使用的vrrp協議方式,虛擬路由冗餘協議 (Virtual Router RedundancyProtocol,簡稱VRRP);Heartbeat或Corosync是基於主機或網絡服務的高可用方式;簡單的說就是,Keepalived的目的是模擬路由器的高可用,Heartbeat或Corosync的目的是實現Service的高可用。因此通常Keepalived是實現前端高可用,經常使用的前端高可用的組合有,就是咱們常見的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是實現服務的高可用,常見的組合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 實現Web服務器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 實現MySQL服務器的高可用。總結一下,Keepalived中實現輕量級的高可用,通常用於前端高可用,且不須要共享存儲,通常經常使用於兩個節點的高可用。而Heartbeat(或Corosync)通常用於服務的高可用,且須要共享存儲,通常用於多節點的高可用。那heartbaet與corosync咱們又應該選擇哪一個好啊,通常用corosync,由於corosync的運行機制更優於heartbeat,就連從heartbeat分離出來的pacemaker都說在之後的開發當中更傾向於corosync,因此如今corosync+pacemaker是最佳組合。

Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,能夠利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),可是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現,所以在介紹keepalived以前,先介紹一下VRRP的原理。

2.VRRP 協議
(1)簡介

在現實的網絡環境中,兩臺須要通訊的主機大多數狀況下並無直接的物理鏈接。對於這樣的狀況,它們之間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由,這個問題一般的解決方法有二種:

在主機上使用動態路由協議(RIP、OSPF等)

在主機上配置靜態路由

很明顯,在主機上配置動態路由是很是不切實際的,由於管理、維護成本以及是否支持等諸多問題。配置靜態路由就變得十分流行,但路由器(或者說默認網關default gateway)卻常常成爲單點故障。VRRP的目的就是爲了解決靜態路由單點故障問題,VRRP經過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器。

(2)工做機制

在一個VRRP虛擬路由器中,有多臺物理的VRRP路由器,可是這多臺的物理的機器並不能同時工做,而是由一臺稱爲MASTER的負責路由工做,其它的都是BACKUP,MASTER並不是一成不變,VRRP讓每一個VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有一些特權,好比,擁有虛擬路由器的IP地址,咱們的主機就是用這個IP地址做爲靜態路由的。擁有特權的MASTER要負責轉發發送給網關地址的包和響應ARP請求。

VRRP經過競選協議來實現虛擬路由器的功能,全部的協議報文都是經過IP多播(multicast)包(多播地址224.0.0.18)形式發送的。虛擬路由器由VRID(範圍0-255)和一組IP地址組成,對外表現爲一個周知的MAC地址。因此,在一個虛擬路由 器中,無論誰是MASTER,對外都是相同的MAC和IP(稱之爲VIP)。客戶端主機並不須要由於MASTER的改變而修改本身的路由配置,對客戶端來講,這種主從的切換是透明的。

在一個虛擬路由器中,只有做爲MASTER的VRRP路由器會一直髮送VRRP通告信息(VRRPAdvertisement message),BACKUP不會搶佔MASTER,除非它的優先級(priority)更高。當MASTER不可用時(BACKUP收不到通告信息), 多臺BACKUP中優先級最高的這臺會被搶佔爲MASTER。這種搶佔是很是快速的(<1s),以保證服務的連續性。因爲安全性考慮,VRRP包使用了加密協議進行加密。

(3)工做流程

a、初始化

路由器啓動時,若是路由器的優先級是255(最高優先級,路由器擁有路由器地址),要發送VRRP通告信息,併發送廣播ARP信息通告路由器IP地址對應的MAC地址爲路由虛擬MAC,設置通告信息定時器準備定時發送VRRP通告信息,轉爲MASTER狀態;不然進入BACKUP狀態,設置定時器檢查定時檢查是否收到MASTER的通告信息。

b、Master

設置定時通告定時器;

用VRRP虛擬MAC地址響應路由器IP地址的ARP請求;

轉發目的MAC是VRRP虛擬MAC的數據包;

若是是虛擬路由器IP的擁有者,將接受目的地址是虛擬路由器IP的數據包,不然丟棄;

當收到shutdown的事件時刪除定時通告定時器,發送優先權級爲0的通告包,轉初始化狀態;

若是定時通告定時器超時時,發送VRRP通告信息;

收到VRRP通告信息時,若是優先權爲0,發送VRRP通告信息;不然判斷數據的優先級是否高於本機,或相等並且實際IP地址大於本地實際IP,設置定時通告定時器,復位主機超時定時器,轉BACKUP狀態;不然的話,丟棄該通告包;

c、Backup

設置主機超時定時器;

不能響應針對虛擬路由器IP的ARP請求信息;

丟棄全部目的MAC地址是虛擬路由器MAC地址的數據包;

不接受目的是虛擬路由器IP的全部數據包;

當收到shutdown的事件時刪除主機超時定時器,轉初始化狀態;

主機超時定時器超時的時候,發送VRRP通告信息,廣播ARP地址信息,轉MASTER狀態;

收到VRRP通告信息時,若是優先權爲0,表示進入MASTER選舉;不然判斷數據的優先級是否高於本機,若是高的話認可MASTER有效,復位主機超時定時器;不然的話,丟棄該通告包;

(4)ARP查詢處理

當內部主機經過ARP查詢虛擬路由器IP地址對應的MAC地址時,MASTER路由器回覆的MAC地址爲虛擬的VRRP的MAC地址,而不是實際網卡的 MAC地址,這樣在路由器切換時讓內網機器覺察不到;而在路由器從新啓動時,不能主動發送本機網卡的實際MAC地址。若是虛擬路由器開啓的ARP代理 (proxy_arp)功能,代理的ARP迴應也迴應VRRP虛擬MAC地址;

3.KeepAlived安裝
(1)下載

cd /tools

wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz

(2)安裝

a、檢查kernel環境是否配置

ls -l /usr/src/

drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug

drwxr-xr-x. 3 root root 4096 Jan 1 23:39 kernels

lrwxrwxrwx  1 root root   37 Jun 11 16:07 linux ->/usr/src/kernels/2.6.32-431.el6.i686/

b、安裝

tar zxf keepalived-1.1.19.tar.gz

cd keepalived-1.1.19

./configure

。。。

Keepalived configuration

------------------------

Keepalived version       :1.1.19

Compiler                 : gcc

Compiler flags           : -g-O2

Extra Lib                :-lpopt -lssl -lcrypto

Use IPVSFramework       : Yes

IPVSsync daemon support : Yes

Use VRRPFramework       : Yes

Use Debug flags          : No

make

make install

c、說明

也可能不提早配置kernel,能夠在./configure時指定--with-kernel-dir參數。如:

./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.i686/

d、配置

/bin/cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

/bin/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived -p

/bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

/bin/cp /usr/local/sbin/keepalived /usr/sbin/

e、測試

/etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

ps -ef | grep keep   #3keepalived-D表示成功

root      2994     1  019:31 ?        00:00:00 keepalived -D

root      2996  2994  219:31 ?        00:00:00 keepalived -D

root      3108  2994  019:31 ?        00:00:00 keepalived -D

root      3111  1222  019:31 pts/0    00:00:00 grep keep

/etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

(3)keepalived.conf控制文件說明

a、master節點配置

! Configuration File for keepalived

# 全局定義部分

global_defs {

   notification_email {

     huang@gmail.com          #設置報警郵件地址,每行一個,需開啓本機sendmail服務

   }

   notification_email_fromAlexandre.Cassen@firewall.loc  #設置郵件發送地址

   smtp_server192.168.1.3  #設置smtp server 地址

   smtp_connect_timeout30    #設置鏈接 smtp server超時時間

   router_id LVS_7        #Keepalived服務器的ID,至關於mysql的server_id,郵件主題中顯示

}

# vrrp實例定義部分

vrrp_instance VI_1 {

    state MASTER          #指定keepalived的角色,MASTER表示是主服務,BACKUP表示是備用服務器

    interface eth0            #指定HA監測網絡的接口

    virtual_router_id 55    #虛擬路由IDe,同一個vrrp實例使用一個惟一,MASTER和BACKUP一致

    priority 150              #優先級,數字越大優先級越高,MASTER必須大於BACKUP,建議相差50

    advert_int 1              #MASTER和BACKUP同步檢查間隔,秒

    authentication {          #設定驗證類型和密碼

        auth_type PASS        #驗證類型,PASS和HA

        auth_pass 1111        #驗證密碼,MASTER和BACKUP密碼相同才能進行通訊,官方建議明文

    }

    virtual_ipaddress {       #虛擬ip地址

        192.168.1.16/24        #最好加上掩碼,不然容易出錯,指定爲32位了

    }

}

b、backup節點配置

! Configuration File for keepalived

# 全局定義部分

global_defs {

   notification_email {

     huang@gmail.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.3

   smtp_connect_timeout 30

   router_id LVS_2

}

# vrrp實例定義部分

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.16/24

    }

}

4.KeepAlived單實例實戰
(1)演示環境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

Master

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

Backup

VIP:192.168.1.169

(2)安裝KeepAlived和LVS

a、Master節點

(i)安裝KeepAlived

ln -s /usr/src/kernels/2.6.32-431.el6.i686/ /usr/src/linux

tar zxf keepalived-1.1.19.tar.gz

cd keepalived-1.1.19

./configure

make

make install

/bin/cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

/bin/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived -p

/bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

/bin/cp /usr/local/sbin/keepalived /usr/sbin/

/etc/init.d/keepalived start

ps -ef | grep keep

/etc/init.d/keepalived stop

(ii)安裝LVS

lsmod | grep ip_vs  #檢查環境

tar zxf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make     #不須要configure

make install

(iii)清空原配置的vip(vip應由keepalived自動配置)

ifconfig eth0:0 down

(v)配置keepalived配置文件

cd /etc/keepalived/

mv keepalived.conf keepalived.conf.bak  #備份系統默認的配置文件

mv /tools/keepalived.conf.master-single  keepalived.conf

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_7

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

b、Backup節點

(i)安裝KeepAlived

(ii)安裝LVS

(iii)清空原配置的vip(vip應由keepalived自動配置)

(v)配置keepalived配置文件

cd /etc/keepalived/

mv keepalived.conf keepalived.conf.bak  #備份系統默認的配置文件

mv /tools/keepalived.conf.backup-single  keepalived.conf

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

(3)測試

a、中止Master和Backup上的FireWall和SELinux

/etc/init.d/iptables stop

setenforce 0

b、啓動Master和Backup上的keepalived

/etc/init.d/keepalived start

c、查看Master和Backup上的vip

(i)Master節點

ifconfig    #看不到eth0:0keepalived啓的vip,用ifconfig是看不到的,要用ip add來看

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

ip add

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

inet addr:192.168.1.169/24 scopeglobal secondary eth0

(ii)Backup節點(此時是沒有vip的,若是有,則是裂腦了)

ifconfig

eth0      inetaddr:192.168.1.158 Bcast:192.168.1.255 Mask:255.255.255.0

ip add

eth0      inetaddr:192.168.1.158 Bcast:192.168.1.255 Mask:255.255.255.0

d、測試主備切換

(i)中止Master上的keepalived

/etc/init.d/keepalived stop

(ii)查看Master上的vip

ip add | grep 1.169

       #<--爲空,說明vipdown

(iii)查看Backup上的vip

ip add | grep 1.169

inet addr:192.168.1.169/24 scope global secondary eth0  #說明Backup節點已接管vip

e、測試主備切換延時時間

(i)長ping vip

ping 192.168.1.169 -t

(ii)啓動Master上的keepalived

/etc/init.d/keepalived start

(iii)vip從Backup切換到了Master上

(v)發現ping命令丟了一個包

5.KeepAlived多實例實戰

多實例與單實例的區別主要是keepalived.conf配置文件中有多個vrrp_instance。

(1)Master節點的keepalived.conf

cat /etc/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   abc8@qq.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.168

   smtp_connect_timeout 30

   router_id LVS_1

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

        192.168.1.170/24

        192.168.1.171/24

    }

}

 

vrrp_instance VI_2 {

    state BACKUP

    interface eth0

    virtual_router_id 52

    priority 50

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.174/24

        192.168.1.175/24

    }

}

(2)Backup節點的keepalived.conf

cat /etc/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   abc@qq.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.168

   smtp_connect_timeout 30

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

        192.168.1.170/24

        192.168.1.171/24

    }

}

 

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.174/24

        192.168.1.175/24

    }

}

6.指定KeepAlived輸出日誌

默認狀況下,KeepAlived的日誌會輸出到/var/log/messages文件中,若是想讓keepAlived的日誌輸出到指定文件,則需修改2個配置文件:/etc/sysconfig/keepalived和/etc/rsyslog.conf後重啓rsyslog和 keepalived服務。

vi /etc/sysconfig/keepalived

#修改前

KEEPALIVED_OPTIONS="-D"

#修改後

#KEEPALIVED_OPTIONS="-D"

KEEPALIVED_OPTIONS="-D-d -S 0"

vi /etc/syslog.conf

#keepalived

local0.*      /var/log/keepalived.log     #新增長一行

/etc/in.d/rsyslog restart

/etc/init.d/keepalived restart

6、Keepalived管理LVS實戰

一、演示環境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

KeepAlived Master

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

KeepAlived Backup

VIP:192.168.1.169

192.168.1.218

CentOS6.5_32

LNMP

RS1

192.168.1.228

CentOS6.5_32

LNMP

RS2

二、在Master和Backup節點上安裝KeepAlivd和LVS
三、在Mastet節點上配置KeepAlived管理LVS

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   abc8@qq.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.168

   smtp_connect_timeout 30

   router_id LVS_1

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

 

virtual_server 192.168.1.169 80 { 

    delay_loop 6                 #每隔多少秒keepalived監測rs的狀態 

    lb_algo wrr                  #設置分發的算法 

lb_kind DR                    #設置分發的模式,這裏使用DR模式演示 

nat_mask 255.255.255.0     #掩碼

    persistence_timeout20     #會話保持

    protocol TCP 

#上面這一段至關於ipvsadm -A-t 192.168.1.169:80 -s wrr -p 20

 

real_server 192.168.1.21880 {    #第一臺rs服務器的配置,注意IP和端口 

        weight 100            #權重 

        TCP_CHECK {           #健康檢查

        connect_timeout10    #10秒無響應超時 

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

     } 

real_server 192.168.1.22880 {    #第二臺rs服務器 

        weight 100 

        TCP_CHECK { 

        connect_timeout10 

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

#上面這2段真實服務器配置至關於下面2行

#ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.218:80 -g -w 1

#ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.228:80 -g -w 1

}

四、在Backup節點上配置KeepAlived管理LVS

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

 

virtual_server 192.168.1.169 80 { 

    delay_loop 6

    lb_algo wrr

lb_kind DR

nat_mask 255.255.255.0

    persistence_timeout 20

protocol TCP 

 

real_server 192.168.1.21880 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

     } 

real_server 192.168.1.22880 {

        weight 100 

        TCP_CHECK { 

        connect_timeout10 

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

}

五、在Master和Backup節點重啓KeepAlivd

/etc/init.d/keepalived restart

六、查看Master節點狀態(需等幾秒)

ip add

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

inet addr:192.168.1.169/24 scopeglobal secondary eth0

ipvs -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.218:80           Route   1     0          0

  -> 192.168.1.228:80           Route   1     0          0

七、測試主備切換
(1)中止Master上的keepalived

/etc/init.d/keepalived stop

(2)查看Master上的vip

ip add | grep 1.169

ipvs -L -n

       #<--均爲空,說明viplvs均已down

(3)查看Backup上的vip

ip add | grep 1.169

inet addr:192.168.1.169/24 scope global secondary eth0  #說明Backup節點已接管vip

ipvs -L -n   #實際上在keepalived.conf配置好之後,自動啓起來了,只不過沒有vip,不對外提供服務

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.218:80           Route   1     0          0

  -> 192.168.1.228:80           Route   1     0          0

八、在RS節點上抑制ARP響應(RS1和RS2上分別執行)

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 "1" >/proc/sys/net/ipv4/conf/all/arp_announce

7、Keepalived管理Nginx反向代理實戰

一、演示環境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

KeepAlived Master + Nginx

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

KeepAlived Backup + Nginx

VIP:192.168.1.169

192.168.1.218

CentOS6.5_32

LNMP

RS1

192.168.1.228

CentOS6.5_32

LNMP

RS2

二、在Master和Backup節點上安裝KeepAlivd和Nginx
三、在Master節點上配置keepalived.conf

cd /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_7

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

四、在Backup節點上配置keepalived.conf

cd /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

五、在Master和Backup上重啓keepalived

/etc/init.d/keepalived restart

ip add | grep 1.169

六、檢查RS節點

curl 192.168.1.218

http://www.abc.org218

curl 192.168.1.228

http://bbs.abc.org228

七、配置Nginx負載均衡
(1)配置Master和Backup節點的負載均衡配置文件upstream01.conf

cd /application/nginx/conf/extra

vi upstream01.conf

upstream www_real_servers {

server 192.168.1.218:80 weight=5;

    server 192.168.1.228:80weight=5;

}

server {

listen 80;

server_name  192.168.1.169

location / {

   proxy_pass http://www_real_servers

}

}

(2)將負載均衡配置文件upstream01.conf加入nginx.conf

vi /application/nginx/conf/nginx.conf

#include extra/www.conf;

#include extra/bbs.conf;

#include extra/blog.conf;

include extra/upstream01.conf;

八、啓動nginx和keepalived(Master和Backup節點)

/application/nginx/sbin/nginx

/etc/init.d/keepalived start

九、測試1:負載均衡測試

在IE頁面訪問http://192.168.1.169,並刷新

http://www.abc.org218

http://bbs.abc.org228

十、測試2:故障測試
(1)中止192.168.1.228

pkill -9 nginx

(2)在IE頁面訪問http://192.168.1.169,並刷新

http://www.abc.org218

http://www.abc.org218

(3)接着中止192.168.1.218

pkill -9 nginx

(4)在IE頁面訪問http://192.168.1.169

報502錯誤:502 Bad Gateway

十一、生產場景選用方案
(1)大併發,且簡單的4層轉發用LVS
(2)大併發,且功能要求複雜,URI轉發用LVS + Nginx
(3)併發不大,用Nginx/HAProxy

通常大公司,會根據業務進行選擇,3個場景都會用到

相關文章
相關標籤/搜索