lvs+keepalived+application部署(只使用兩臺機器)

目前你們用LVS+Keepalived + APP 架構都是 2臺LVS +Keepalived 而後後端跟着 應用設備html

然而針對小客戶來講,  2臺LVS日常沒什麼壓力 還有一臺備着(雖然能夠跑雙主,但對小用戶模式意義不大)  想讓咱們充分利用起來  能不能把後端應用 也部署都LVS上linux

這樣的話 架構就是後端

#下面講解2臺設備分別部署application+LVS+keepalived 實現高可用跟設備都在服務(沒有空閒設備)服務器

架構圖 以下:架構

原理說下吧   (#DR模式)app

其實這個跟咱們日常部署LVS+Keepalived沒什麼區別  運維

當時若是整個過程你按照之前的那種部署思路 發現部署完以後  總有那麼一臺real-server不能服務(我實驗過 把備機的keepalived stop就行了)  之前也一直糾結這個tcp

緣由跟解決方法以下:(摘自 扶凱博客)oop

當客戶端發送數據包給 VIP .好比咱們的 Director1 (Master 主)這個接口正在工做,這時 LVS 能接收到這個包,而後根據 keepalived 的配置進行 load balance .這時 Director1 會使用 LVS-DR 的功能給包路由給本身或者 Director2 (Backup).
這時有個問題.在這個例子中由於咱們使用了 keepalived .這時 Director2 這臺是一臺 VIP 的備份服務器.這時 keepalived 默認會當即啓動使用 ipvsadm 的規則來配置這臺服務器怎麼樣作備份的處理.來使得更快的故障轉移.因此這時這些規則這臺備份的 Director2 主機都會存在.
這就有問題了.當從 Director1 (Master 主),好比使用 rr .會轉發大約 50% 的包從 Director1 到  Director2 (Backup)的 3306 的端口.這時由於 Director2 由於這些 LVS-DR 的配置規則會接着給這些包,在作一次 load balance .又發回去給 Director1.這時會產生一個死的循環.
隨着時間的推移,不但不能正常的處理鏈接,您的服務器也會崩潰,在他們中間或後端不斷的反覆鏈接測試

解決方案: 給進入 eth0 的包打包 mark 的標記,當數據包是發給 VIP:80  而且 MAC 不其它 LVS 服務器的話. 才作個 mark ,這樣纔會對指定的 fwmark 進行 loadbalance 放入到 LVS 中處理.只要數據包是從任意其它的 MAC 地址(非 LVS 的轉發)會被髮往 VIP:port, 會不在進行 loadbalanced 而是直接轉給後面監聽的  demon 程序進行應用的處理.實際就是咱們使用 iptables 來對進入的流量設置 MARK.而後配置 keepalived 只處理有 MARK 過的流量.不在使用之前綁定 VIP 和端口

下面咱們來給指定的包打標籤吧 (利用iptables)命令以下

在LVS 1上執行
 

iptables -t mangle -I PREROUTING -d $VIP -p t cp -m tcp --dport $VPORT -m mac ! --mac -source $MAC_Director2 -j MARK --set -mark 0x3
 
$VIP 爲VIP地址
$VPORT 爲服務端口
$MAC_Director2 是備機的MAC (keepalived 之間互相監聽的那塊網卡)
 
在LVS2上執行

iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac  ! --mac -source $MAC_Director1 -j MARK --set -mark 0x4

 
$VIP 爲VIP地址
$VPORT 爲服務端口
$MAC_Director1 是主 的MAC (keepalived 之間互相監聽的那塊網卡)
備註:關於lvs1與lvs2上的iptables的配置,這裏我採用了腳本的形式,由於生產的端口過多,且不易於管理,最終作成系統服務,便可經過service  # start |stop|status 進行維護,該腳本的名稱爲lvs_iptables.sh ,能夠從博客中下載
 
改配置文件
## 跟日常架構配置沒大區別
關於/etc/init.d/real-server 的 腳本 這裏就不介紹了 都懂的….
 
而後改下LVS1 的keepalived配置文件   #主
vrrp_instance VIP_1 {
interface eth0
state MASTER
virtual_router_id 55
priority 100
virtual_ipaddress {
192.168.20.160
  }
notify_backup   「/etc/init.d/rlsv.sh start」  ## 切到備 後執行的腳本
notify_master   「/etc/init.d/rlsv.sh stop」   ## 切到主 後執行的腳本 該腳本也可從博客中下載
notify_fault   「/etc/init.d/rlsv.sh start」      ## 故障狀態 後執行的腳本(我也沒弄懂這個狀態是啥狀態 )
}
virtual_server   fwmark 3  8080 {   ####fwmark 3 爲剛纔用iptables打的標籤
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 8080
real_server 192.168.20.135 8080 {
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.20.136 8080 {
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
備註:更多的生產的端口能夠自行添加

而後改下LVS2 的keepalived配置文件 #備

vrrp_instance VIP_1 {
interface eth0
state BACKUP
virtual_router_id 55
priority 80
virtual_ipaddress {
192.168.20.160
  }

notify_master  「/etc/init.d/rlsv.sh stop」   ##切到主 後執行的腳本
notify_backup  「/etc/init.d/rlsv.sh start」  ##切到備 後執行的腳本
}
virtual_server   fwmark 4  80 { ###fwmark 4 爲剛纔用iptables打的標籤
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 8080
real_server 192.168.20.135 8080 {
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.20.136 8080 {
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

最後都是啓動keepalived  測試

 

 備註:

這裏有個問題  若是keepalived切到備份後(這個切換觸發條件 有點糾結 我手動把keepalived down了 可是沒執行 MASTER 上的notify_backup   「/etc/init.d/real-server start」 和 notify_fault   「/etc/init.d/real-server start」   命令   )  那這個時候就有問題了  當時若是是機器down了 那沒事  當時若是是keepalived服務down了  機器沒down 那 也只能一臺在服務(這個很糾結)  全部得重點保障 主的keepalived一直正常  那整個平臺 設備利用率最高了, 但在此處我想說明一下,其實在MASTER上當keepalived若是DOWN了,能夠寫腳本檢測keepalived的狀況,而後啓動rlsv.sh的腳本,當keepalived若是up以後,rlsv.sh 的腳本會自動被關閉, 能夠暫時解決以上所提到的問題

備註:全部的腳本可下載

 

          

轉載請註明linux系統運維
http://www.linuxyw.com/linux/fuzaijunheng/20130429/146.html

相關文章
相關標籤/搜索