目前大家用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 tcp -m tcp --dport $VPORT -m mac ! --mac -source $MAC_Director1 -j MARK --set -mark 0x4
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” ## 切到主 后執行的腳本 該腳本也可從博客中下載
}
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