高可用併發集羣lvs的幾種模式及應用

一.lvs的簡介html

  lvs是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。該項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。它的官方站點是www.linuxvirtualserver.org。如今lvs已是 Linux標準內核的一部分,在Linux2.4內核之前,使用lvs時必需要從新編譯內核以支持lvs功能模塊,可是從Linux2.4內核之後,已經徹底內置了lvs的各個功能模塊,無需給內核打任何補丁,能夠直接使用lvs提供的各類功能。前端

  lvs自從1998年開始,發展到如今已是一個比較成熟的技術項目了。能夠利用lvs技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用lvs架設的集羣系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。linux

二.lvs的特色算法

優勢:數據庫

1.高併發鏈接:LVS基於內核網絡層面工做,有超強的承載能力和併發處理能力。單臺LVS負載均衡器,可支持上萬併發鏈接。 穩定性強:是工做在網絡4層之上僅做分發之用,這個特色也決定了它在負載均衡軟件裏的性能最強,穩定性最好,對內存和cpu資源消耗極低。apache

2.成本低廉:硬件負載均衡器少則十幾萬,多則幾十萬上百萬,LVS只需一臺服務器和就能免費部署使用,性價比極高。vim

3.配置簡單:LVS配置很是簡單,僅需幾行命令便可完成配置,也可寫成腳本進行管理。後端

4.支持多種算法:支持多種論調算法,可根據業務場景靈活調配進行使用緩存

5.支持多種工做模型:可根據業務場景,使用不一樣的工做模式來解決生產環境請求處理問題。服務器

6.應用範圍廣:由於LVS工做在4層,因此它幾乎能夠對全部應用作負載均衡,包括http、數據庫、DNS、ftp服務等等

 

缺點:

工做在4層,不支持7層規則修改,機制過於龐大,不適合小規模應用。

 

三.lvs的幾種模式及圖解

1.DR(Direct Routing)模式

用直接路由技術實現虛擬服務器。當參與集羣的計算機和做爲控制管理的計算機在同一個VLAN時能夠用此方法,這種模式的數據包轉發是直接在數據鏈路層(二層)進行的

工做原理:

DR和REAL SERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,全部REAL SERVER對自己這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求所有定向給DR,而DR收到數據包後根據調度算法,找出對應的 REAL SERVER,把目的MAC地址改成REAL SERVER的MAC併發給這臺REAL SERVER。這時REAL SERVER收到這個數據包,則等於直接從客戶端收到這個數據包無異,處理後直接返回給客戶端。因爲DR要對二層包頭進行改換,因此DR和REAL SERVER之間必須在一個廣播域,也能夠簡單的理解爲在同一臺交換機上。

 

 

流程圖解:

 

 

 

 

 

(1)當用戶請求到達DirectorServer,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP

(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈

(3) IPVS比對數據包請求的服務是否爲集羣服務,如果,將請求報文中的源MAC地址修改成DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,而後將數據包發至POSTROUTING鏈。此時的源IP和目的IP均未修改,僅修改了源MAC地址爲DIP的MAC地址,目標MAC地址爲RIP的MAC地址

(4) 因爲DS和RS在同一個網絡中,因此是經過二層來傳輸。POSTROUTING鏈檢查目標MAC地址爲RIP的MAC地址,那麼此時數據包將會發至Real Server。

(5)client的請求被Director轉發並通過鏈路層尋址到達Realserver後,因爲Realserver的lo接口配置了VIP(請求中的目標IP正是VIP),因此接收請求並處理。處理完成以後,將響應報文經過lo接口傳送給eth0網卡(這個網卡通常指和調度器在一個網段的網卡)而後向外發出。此時的源IP地址爲VIP,目標IP爲CIP

(6) 響應報文最終送達至客戶端

 

DR模式的特性:

一、保證前端路由將目標地址爲VIP報文通通發給Director Server,而不是RS

二、RS可使用私有地址;也能夠是公網地址,若是使用公網地址,此時能夠經過互聯網對RIP進行直接訪問

三、RS跟Director Server必須在同一個物理網絡中

四、全部的請求報文經由Director Server,但響應報文必須不能進過Director Server

五、不支持地址轉換,也不支持端口映射

六、RS能夠是大多數常見的操做系統

七、RS的網關毫不容許指向DIP

八、RS上的lo接口配置VIP的IP地址

 

2.NAT(Network Address Translation)模式

工做原理:

用地址翻譯實現虛擬服務器。地址轉換器有能被外界訪問到的合法IP地址,它修改來自專有網絡的流出包的地址。

外界看起來包是來自地址轉換器自己,當外界包送到轉換器時,它能判斷出應該將包送到內部網的哪一個節點。

優勢是節省IP 地址,能對內部進行假裝;缺點是效率低,由於返回給請求方的流量通過轉換器。 

 

流程圖解:

 

 

 

(1)當用戶請求到達DirectorServer,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP 。

(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈。

(3) IPVS比對數據包請求的服務是否爲集羣服務,如果,修改數據包的目標IP地址爲後端服務器IP,而後將數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP ,在這個過程完成了目標IP的轉換。

(4) POSTROUTING鏈經過選路,將數據包發送給Real Server。

(5) Real Server比對發現目標爲本身的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲RIP,目標IP爲CIP 。

(6) Director Server在響應客戶端前,此時會將源IP地址修改成本身的VIP地址,而後響應給客戶端。 此時報文的源IP爲VIP,目標IP爲CIP。

 

 

 3.TUN模式

流程圖解:

 

 

 

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

 

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

 

3.RS收到請求報文後,會首先拆開第一層封裝,而後發現裏面還有一層IP首部的目標地址是本身lo接口上的VIP,因此會處理次請求報文,並將響應報文經過lo接口送給eth0網卡(這個網卡通常指和調度器在一個網段的網卡)直接發送給客戶端。注意:須要設置lo接口的VIP不能在共網上出現。

 

 

四.應用實現

1.DR模式

(1)安裝軟件

yum install -y ipvsadm  

(2).寫入策略

 

ipvsadm -A -t 172.25.27.100:80 -s rr     # -A:添加一個virtual server,-t是表示指定虛擬服務爲tcp服務,格式爲<VIP>+<:監聽端口>, -s指定使用的調度算法 rr表示輪詢 ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.2:80 -g   # -a是添加一個real server ipvsadm -ln   #查看策略

 

(3).保存策略

 

/etc/init.d/ipvsadm save  

 

(4).在調度器上添加VIP

ip addr add 172.25.85.100/24 dev eth0 

 

測試:

在另外兩臺real server上開啓apache,編寫發佈頁面

/etc/init.d/httpd start vim /var/www/html/index.html
寫入
<h1>hello world</h1>

<h1>hello china</h1>

而且添加上VIP

ip addr add 172.25.85.100/24 dev eth0 

 

在物理主機上測試:

 

查看訪問的100的mac地址

 

arp -e 172.85.27.100  

 

 

 

經過對比mac 地址,可知訪問的是server1

 

清除APR緩存

 

 arp -d 172.25.85.100

 

再curl 172.25.85.100

 

 

 

發現此時訪問的直接是real_server 主機,沒有通過lvs調度器

 

所以,必須在real_server上增長策略,使其只能經過lvs調度器訪問real_server ip

安裝arp防火牆並寫入策略:

 

yum install arptables -y arptables -A IN -d 172.25.85.100 -j DROP #將全部訪問172.25.85.100 的請求都丟棄掉 arptables -A OUT -s 172.25.85.100 -j mangle --mangle-ip-s 172.25.85.3 #全部源地址爲172.25.85.100的數據包在發出去時所有地址轉換爲真實地址 /etc/init.d/arptables_jf save   #保存規則

 

 

測試:

 

 

 

此時,再清除ARP緩存後,從新訪問real_server ip ,發現如今是經過lvs調度器來獲取的

 

當其中一臺real_server 主機關掉後,測試

 

 

 

發現此時的lvs調度器沒有健康檢查,仍然在輪詢訪問,使有的訪問被拒絕,在實際的網站訪問時,會形成必定的損失,並使用戶的體驗變差。

 

(5).Ldirectord 實現lvs健康檢查

 

  ldirectord用來實現LVS負載均衡資源在主、備節點間的故障轉移。在首次啓動時,ldirectord能夠自動建立IPVS表。此外,它還能夠監控各RealServer的運行狀態,一旦發現某RealServer運行異常時,還能夠將其從IPVS表中移除。

 

        ldirectord 進程經過向RealServer的RIP發送資源訪問請求並經過由RealServer返回的響應信息來肯定RealServer的運行狀態。在 Director上,每個VIP須要一個單獨的ldirectord進程。若是RealServer不能正常響應Director上 ldirectord的請求,ldirectord進程將經過ipvsadm命令將此RealServer從IPVS表中移除。而一旦 RealServer再次上線,ldirectord會將其從新添加至IPVS表中

 

 

yum install -y ldirectord-3.9.5-3.1.x86_64.rpm rpm -ql ldirectord

 

 

 

 

複製模板配置文件到主配置文件目錄下

cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/ vim /etc/ha.d/ldirectord.cf 編輯內容: virtual=172.25.85.100:80 # 此項用來定義LVS服務及其使用的VIP和PORT real=172.25.85.2:80 gate # 定義RealServer,語法:real=RIP:port gate|masq|ipip [weight] real=172.25.85.3:80 gate fallback=127.0.0.1:80 gate # 定義RealServer,語法:real=RIP:port gate|masq|ipip [weight] service=http # 定義基於什麼服務來測試RealServer; scheduler=rr # 調度算法爲rr #persistent=600 # 持久鏈接超時時間; #netmask=255.255.255.255 protocol=tcp # 定義此虛擬服務用到的協議; checktype=negotiate # ldirectord進程用於監控RealServer的方法;{negotiate|connect|A number|off} checkport=80 # 指健康檢查使用的端口; request="index.html" # 檢查RealServer用到的頁面 receive="Test Page" # 檢查RealServer用到的頁面內容 virtualhost=www.x.y.z

 

 

 

 

把ipvsadm關掉

/etc/init.d/ipvsadm stop

開啓ldirectord

/etc/init.d/ldirectord start

 

當server3上的apache 關掉後

ipvsadm -L

 

 

 

此時調度器已經檢測到了,此時再訪問不會再出現之前那種拒絕被鏈接的情況

 

 

當兩臺real_server 的apache主機都宕機後

 

 

 

提供當後端RS所有宕掉後,返回的fallback頁面,爲本機httpd服務

echo "此頁面正在維護" > /var/www/html/index.html /etc/init.d/httpd start

 

 

 

因爲只有一個調度器,當調度器主機宕機後,全部服務都不能正常訪問,爲了實際中形成損失,咱們必須準備臺備用的調度器,來應對這種危機

 

(6).Keepalived 高可用集羣管理

 

因爲ldirectord 與Keepalived 衝突,必須將ldirectord停掉

 tar zxf keepalived-1.3.6.tar.gz cd keepalived-1.3.6 ./configure --prefix=/usr/local/keepalived --with-init=SYSV make make install cd /usr/local/keepalived/etc/rc.d/init.d/ ln -s /usr/local/keepalived/etc/keepalived/ /etc/ #作軟鏈接 cd /etc/keepalived/ ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ln -s /usr/local/keepalived/sbin/keepalived /sbin/ ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cd /usr/local/keepalived/etc/rc.d/init.d/ chmod +x keepalived #加可執行權限 cd /etc/keepalived vim keepalived.conf
編輯內容: global_defs { notification_email {   root@localhost    ##發送郵件者爲本機root用戶 } notification_email_from  keepalived@localhost    ##從本機keepalived用戶接收郵件 smtp_server
127.0.0.1       smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr #vrrp_strict         ##若是不註釋掉會自動開啓iptables並在全部表中加入動做DROP ALL vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.85.100 } } virtual_server 172.25.85.100 80 { ##虛擬主機 delay_loop 6 lb_algo rr lb_kind DR ##是使用的DR模型 # persistence_timeout 50 ##先將此註釋掉,能夠更加直觀的感覺到兩臺rs使用的DR進行的輪轉 protocol TCP real_server 172.25.85.2 80 { ##real_server主機地址和端口兩臺rs均是使用的80端口 weight 1 ##權重是能夠本身進行修改的,在實際使用中,權重使用的不同是由於,權重較重一方的服務器性能更加好 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.25.85.3 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }

 

/etc/init.d/keepalived start ipvsadm -l

 

 

 

 

 

Keeplived 高可用

 

找臺新的主機按照前面步驟佈置keeplived ,可直接將server1的keeplived 配置文件複製過來,進行稍做修改

 

[root@server4 keepalived]# vim keepalived.conf   #修改state 和 priority

 

vrrp_instance VI_1 {

 

    state BACKUP  #將狀態由原來的master 改成備用

 

    interface eth0  

 

    virtual_router_id 51

 

    priority 50    #更改優先級,使其和server1上的優先級不一樣,避免若一臺主機掛掉之後,若優先級是一致的,等原來的主機恢復後,會由於優先級是一致的而致使爭搶,同時操做電腦上的同一臺文件,而致使腦裂。

 

    advert_int 1

 

    authentication {

 

        auth_type PASS

 

        auth_pass 1111

 

 

 

[root@server4 keepalived]# /etc/init.d/keepalived start 

 

 

 

 

查看ip 可知此時ip 在server1上,即如今訪問的是server1

 

[root@server1~]#echo c > /proc/sysrq-trigger  #故意讓系統崩潰,實現宕機的目的

 

 

 

測試並查看IP 和mac 地址,發現此時服務已經徹底有server4接管,從而實現了lvs集羣高可用。

 2.NAT模式

在Director上

(1)開啓路由機制
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
(2)寫入ipvsadm規則 ,在此以前先關閉iptables
這裏寫圖片描述

在RS上
(1)配置ip和網關,網關設爲Director的IP地址
這裏寫圖片描述
這裏寫圖片描述

(2)開啓apache,並編寫測試頁面
這裏寫圖片描述
這裏寫圖片描述

測試:
這裏寫圖片描述
這時ipvsadm上的鏈接數會發生變化
這裏寫圖片描述

3.TUN模式

在Director上

(1)開啓路由機制
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

這裏寫圖片描述
(2)寫入ipvsadm策略
ipvsadm -C #清除以.前的 rules
ipvsadm-A -t 172.25.85.100:80 -s rr
-ipvsadma -t  172.25.85.100:80 -r  172.25.85.2:80 -i
-ipvsadma -t  172.25.85.100:80 -r  172.25.85.3:80 -i


(3)保存 rule
/etc.init.d/ipvsadm save

在RealServer上
(1)設置網關爲Director的IP地址
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p


ifconfig tunl0 192.168.0.200 netmask 255.255.255.255 up
route add -host 192.168.0.200 dev tunl0

echo `hostname` > /var/www/html/index.htmlservice httpd start  測試選擇一臺主機訪問 http:// 192.168.0.100 反覆刷新網頁,每次出現的網頁不一樣則表示成功。 

相關文章
相關標籤/搜索