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


目前大家用LVS+Keepalived + APP 架構都是 2台LVS +Keepalived 然后后端跟着 應用設備

然而針對小客戶來說,  2台LVS平常沒什么壓力 還有一台備着(雖然可以跑雙主,但對小用戶模式意義不大)  想讓我們充分利用起來  能不能把后端應用 也部署都LVS上

這樣的話 架構就是

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

架構圖 如下:

原理說下吧   (#DR模式)

其實這個跟我們平常部署LVS+Keepalived沒什么區別  

當時如果整個過程你按照以前的那種部署思路 發現部署完之后  總有那么一台real-server不能服務(我實驗過 把備機的keepalived stop就好了)  以前也一直糾結這個

原因跟解決方法如下:(摘自 扶凱博客)

當客戶端發送數據包給 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM