LVS持久化與超時(shí)時(shí)間問(wèn)題

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


可以看到,我把web服務(wù)器分成了兩組,一組為web01,web02,掛在了openresty01下,另外一組:web03,web04,web05掛在了openresty02下;最后搭建完成,演示時(shí),我分別使用了curl和瀏覽器,在curl演示時(shí)很正常,請(qǐng)求能輪流分到每個(gè)web容器,但在瀏覽器中演示時(shí),刷新時(shí)顯示輪流某一組web,而不是在所所有web應(yīng)用輪流,我當(dāng)時(shí)以為是瀏覽器緩存導(dǎo)致,所以新開(kāi)了個(gè)頁(yè)簽;
我們來(lái)看一下:
curl命令演示

瀏覽器演示

這兩天又深入學(xué)習(xí)了lvs的持久化;我之前以前在keepalived中配置了持久化時(shí)間(persistence_timeout)為0,再加上負(fù)載均衡策略(lb_algo)配置成rr,就能夠輪流rs,其實(shí)不然,除了這些之外,還有連接空閑的超時(shí)時(shí)間;

1. 把來(lái)自同一個(gè)客戶(hù)端IP的請(qǐng)求轉(zhuǎn)發(fā)到同一個(gè)RS的持久化時(shí)間:persistence_timeout,通過(guò)這個(gè)持久化時(shí)間,我們可以實(shí)現(xiàn)會(huì)話(huà)保持
2. 一個(gè)連接創(chuàng)建后處于空閑狀態(tài)的超時(shí)時(shí)間
   - tcp連接的空閑超時(shí)時(shí)間
   - LVS收到客戶(hù)端FIN消息的超時(shí)時(shí)間
   - udp的超時(shí)時(shí)間

設(shè)置超時(shí)時(shí)間通過(guò) ipvsadm --set tcp tcpfin udp 命令;查看連接狀態(tài)使用ipvsadm -lnc命令查看

經(jīng)過(guò)觀察分析,curl命令請(qǐng)求時(shí),每次請(qǐng)求都從不同的端口發(fā)請(qǐng)求,所以每次lvs都當(dāng)做一個(gè)新的客戶(hù)端來(lái)處理,而且curl請(qǐng)求完后,就關(guān)閉了tcp連接;而瀏覽器則不然,每次刷新很可能還是以同一個(gè)端口發(fā)出請(qǐng)求,而且tcp連接也會(huì)保持,所以lvs就會(huì)認(rèn)為是同一個(gè)客戶(hù)端,每次刷新就會(huì)指向同一rs,即openresty,openresty再將請(qǐng)求輪流分到下一層的web應(yīng)用;
我們來(lái)看一下瀏覽器刷新的情況:


刷新后看一下lvs服務(wù)器上連接狀態(tài):

可見(jiàn)經(jīng)過(guò)多次刷新(七八次),tcp連接共有三個(gè),兩個(gè)處于連接中狀態(tài),一個(gè)處于FIN_WAIT狀態(tài);

再來(lái)看一下curl命令執(zhí)行情況:

再看一下lvs服務(wù)器上連接狀態(tài)

可見(jiàn)連接都處于FIN_WAIT狀態(tài)

將tcp/tcpfin/udp超時(shí)時(shí)間都設(shè)置為1s

[root@lvs02 /]# ipvsadm --set 1 1 1

再看來(lái)瀏覽器刷新情況:

可以看見(jiàn),請(qǐng)求比較均勻的分到了web應(yīng)用。
再到lvs服務(wù)器查看連接狀態(tài)時(shí),顯示為空,因?yàn)?s時(shí)間比較短,很快就超時(shí)了;

附:

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

修改keepalived配置文件,lb_kind配置成NAT,再在其下添加一行nat_mask
255.255.255.0,rs服務(wù)器上不用再綁定VIP地址、抑制ARP廣播;需要配置一個(gè)默認(rèn)網(wǎng)關(guān)

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

找到一篇文章解決方法,使用openvpn方式,我沒(méi)有實(shí)踐過(guò),可作大家參考。
完美解決 MacOS 下不能 ping Docker 容器的問(wèn)題

  1. 后來(lái)我是在虛擬機(jī)中安裝的docker,MAC中能ping通過(guò)虛擬機(jī),虛擬機(jī)能ping通docker,但mac不能ping通過(guò)docker,如何解決?

在mac中添加一條靜態(tài)路由,將docker容器的ip都轉(zhuǎn)到虛擬機(jī)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,效果一樣

參考: http://www.itdecent.cn/p/31b4a8266f0c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容