LVS持久化與超時時間問題
前言
在上一篇文章 《搭建DNS+LVS(keepAlived)+OpenResty伺服器(Docker環境)》 中,我搭建了dns+lvs+openresty+web叢集;先來回顧一下架構圖:

可以看到,我把web伺服器分成了兩組,一組為web01,web02,掛在了openresty01下,另外一組:web03,web04,web05掛在了openresty02下;最後搭建完成,演示時,我分別使用了curl和瀏覽器,在curl演示時很正常,請求能輪流分到每個web容器,但在瀏覽器中演示時,重新整理時顯示輪流某一組web,而不是在所所有web應用輪流,我當時以為是瀏覽器快取導致,所以新開了個頁籤;
我們來看一下:


概念
這兩天又深入學習了lvs的持久化;我之前以前在keepalived中配置了持久化時間(persistence_timeout)為0,再加上負載均衡策略(lb_algo)配置成rr,就能夠輪流rs,其實不然,除了這些之外,還有連線空閒的超時時間;
1. 把來自同一個客戶端IP的請求轉發到同一個RS的持久化時間:persistence_timeout,通過這個持久化時間,我們可以實現會話保持 2. 一個連線建立後處於空閒狀態的超時時間 - tcp連線的空閒超時時間 - LVS收到客戶端FIN訊息的超時時間 - udp的超時時間
設定超時時間通過 ipvsadm --set tcp tcpfin udp 命令;檢視連線狀態使用 ipvsadm -lnc 命令檢視
實戰分析
經過觀察分析,curl命令請求時,每次請求都從不同的埠發請求,所以每次lvs都當做一個新的客戶端來處理,而且curl請求完後,就關閉了tcp連線;而瀏覽器則不然,每次重新整理很可能還是以同一個埠發出請求,而且tcp連線也會保持,所以lvs就會認為是同一個客戶端,每次重新整理就會指向同一rs,即openresty,openresty再將請求輪流分到下一層的web應用;
我們來看一下瀏覽器重新整理的情況:

重新整理後看一下lvs伺服器上連線狀態:

可見經過多次重新整理(七八次),tcp連線共有三個,兩個處於連線中狀態,一個處於FIN_WAIT狀態;
再來看一下curl命令執行情況:

再看一下lvs伺服器上連線狀態

可見連線都處於FIN_WAIT狀態
將tcp/tcpfin/udp超時時間都設定為1s
[root@lvs02 /]# ipvsadm --set 1 1 1
再看來瀏覽器重新整理情況:

可以看見,請求比較均勻的分到了web應用。
再到lvs伺服器檢視連線狀態時,顯示為空,因為1s時間比較短,很快就超時了;
附
-
上一篇文章,我配置的LVS模式是DR,如果將其改成NAT,如何配置?
修改keepalived配置檔案,lb_kind配置成NAT,再在其下新增一行nat_mask
255.255.255.0,rs伺服器上不用再繫結VIP地址、抑制ARP廣播;需要配置一個預設閘道器
route add default gateway 192.168.254.100
-
上一篇文章中,我提到如果直接在MAC本中安裝dokcer,無法直接從MAC中ping docker容器的IP
找到一篇文章解決方法,使用openvpn方式,我沒有實踐過,可作大家參考。
完美解決 MacOS 下不能 ping Docker 容器的問題 -
後來我是在虛擬機器中安裝的docker,MAC中能ping通過虛擬機器,虛擬機器能ping通docker,但mac不能ping通過docker,如何解決?
在mac中新增一條靜態路由,將docker容器的ip都轉到虛擬機器IP
sudo route -n add -net 192.168.254.0/24 192.168.253.129 也可以: sudo route -n add -net 192.168.254.0 -netmask 255.255.255.0 192.168.253.129,效果一樣
參考: https://www.jianshu.com/p/31b4a8266f0c