LVS持久化與超時時間問題分析


前言

在上一篇文章《搭建DNS+LVS(keepAlived)+OpenResty服務器(Docker環境)》中,我搭建了dns+lvs+openresty+web集群;先來回顧一下架構圖:

問題現象

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

持久化概念

這兩天又深入學習了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時間比較短,很快就超時了;

  1. 上一篇文章,我配置的LVS模式是DR,如果將其改成NAT,如何配置?

修改keepalived配置文件,lb_kind配置成NAT,再在其下添加一行nat_mask
255.255.255.0,rs服務器上不用再綁定VIP地址、抑制ARP廣播;需要配置一個默認網關

route add default gateway 192.168.254.100
  1. 上一篇文章中,我提到如果直接在MAC本中安裝dokcer,無法直接從MAC中ping docker容器的IP

找到一篇文章解決方法,使用openvpn方式,我沒有實踐過,可作大家參考。
完美解決 MacOS 下不能 ping Docker 容器的問題

  1. 后來我是在虛擬機中安裝的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


免責聲明!

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



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