前言
在上一篇文章《搭建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,效果一樣