怎麼樣讓 LVS 和 realserver 工作在同一台機器上
2012-05-31 1,573閱 評論( 暫無評論 )更多0
我們有一個簡單便宜的 LVS-DR 的設定。二台機器(伺服器),二台都運行著資料庫的服務。外面請求過來的這些流量導向本地機器的伺服器或其他伺服器。因為純
4 層調度,這是我最喜歡的方式。因為節約,我這次想直接要這二台伺服器上運行 LVS 的服務。不在通過其它的機器。
所以使用 keepalived 來配置,做個主從。也同時在這個機器上。是個很完美的方案。
但是,我讓同事幫著配置。一直不能正常的工作。下面是簡單的架構圖,和配置輸出:
結構如下:
ip_vs() balances on VIP:port CIP CIP | v | CIP->MAC of eth0 on backup normal packet VIP | MAC of eth0 on active<-CIP spurious packet |—————- | | eth0 VIP eth0 VIP _______ _______ | | | |active | | | | backup |_______| |_______|
配置的輸出如下,可以見到有一個地方不一樣,就是顯示有個地方是 Local。
# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnFWM 6 rr -> 192.168.1.233:3306 Local 1 0 0 -> 192.168.1.213:3306 Route 1 0 0
二台機器上的配置都是這樣(^-^上面其實有小修改),在這種架構中,我只要停止我的備份的 keepalived ,就能正常的工作,不然一定有其中一台資料庫連接到最後就中斷停止在那個地方不動了。通過抓包,大量包被不斷的轉寄來轉寄去。
我們來詳細分析一下。
- 用戶端發送串連的請求到 VIP 的指定的連接埠
- 當前的 director 會選擇二個 realserver 來轉寄請求,會傳送資料給 localnode 的本機網卡或者備份的機器上指定的那個 MAC 的 eth0 (同時他也做為 realserver) . 正常的 LVS ,這些資料包會被監聽這個 VIP 的程式接收。
- 如果資料包是發送給備份的 director 伺服器的 eth0 介面。它會不能正常的被監聽指定連接埠的程式所接收,因為資料包會首先先經過 ip_vs()。
- 這時,有 50% 的機會,這個包被轉寄給 。這時會產生標準的回應資料包給用戶端。因為能正常的回應用戶端,這時 LVS 的功能是正常的。我們想所有的包都直接給監聽程式來處理。並不想直接通過 ip_vs() 來轉寄。
- 這時還有 50% 的資料包會直接在次轉給主 LVS 的 eth0/VIP。
- 我們不想資料包從備份的 LVS 在次轉回去給主 LVS 這樣會形成 。
- 所以我們要讓 eth0 上發到給 VIP 的包, 只要不是其它 LVS 發的,才使用 ip_vs() 來處理。
簡單來講:當用戶端發送資料包給 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-DR,又要做為資料庫的後端。所以我們要注意,只接收一個 director 的資料包。
這時我們在 Director1 中設定($MAC_Director2 是指我在 Director1 上所能見到從 Director2 發過來包的 MAC 位址) :
iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac ! --mac-source $MAC_Director2 -j MARK --set-mark 0x3
並在備份的 keepalived 的伺服器 Director2 中設定:
iptables -t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac ! --mac-source $MAC_Director1 -j MARK --set-mark 0x4
接著在 keepalived 中分別配置這二個。
Director1: virtual_server fwmark 3 {Director2: virtual_server fwmark 4 {
其實這個的完整配置象如下:
keepalived 來根據 MARK 來配置的方法
virtual_server fwmark 4 { delay_loop 10 lb_algo rr lb_kind DR protocol TCP real_server 192.168.1.213 3306 { weight 1 MISC_CHECK { misc_path "/etc/keepalived/check_slave.pl 192.168.1.213" misc_dynamic } } real_server 192.168.1.233 3306 { weight 1 MISC_CHECK { misc_path "/etc/keepalived/check_slave.pl 192.168.1.233" misc_dynamic } }}
參考資料:http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.cluster_friendly_applications.html