溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行tengine session_sticky_module模塊源碼分析和使用

發(fā)布時間:2021-12-17 16:23:30 來源:億速云 閱讀:194 作者:柒染 欄目:網(wǎng)絡(luò)管理

如何進行tengine session_sticky_module模塊源碼分析和使用,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

nginx以前對session 保持支持不太好,主要采用ip_hash把同一來源的客戶(同一C段的IP)固定指向后端的同一臺機器,ip_hash有個缺點是不能實現(xiàn)很好的負(fù)載均衡;直到nginx的擴展模塊nginx-sticky-module的出現(xiàn),解決了session sticky的問題。

個人感覺tengine的session sticky模塊更好一些,于是把tengine的sticky移植到了nginx里。

temgine session_sticky_module模塊是一個負(fù)載均衡模塊,通過cookie實現(xiàn)客戶端與后端服務(wù)器的會話保持, 在一定條件下可以保證同一個客戶端訪問的都是同一個后端服務(wù)器。

基本參數(shù):

  • cookie設(shè)置用來記錄會話的cookie名稱

  • domain設(shè)置cookie作用的域名,默認(rèn)不設(shè)置

  • path設(shè)置cookie作用的URL路徑,默認(rèn)不設(shè)置

  • maxage設(shè)置cookie的生存期,默認(rèn)不設(shè)置,即為session cookie,瀏覽器關(guān)閉即失效


mode設(shè)置cookie的模式:

  • insert: 在回復(fù)中本模塊通過Set-Cookie頭直接插入相應(yīng)名稱的cookie

  • rewrite: 使用服務(wù)端標(biāo)識覆蓋后端設(shè)置的用于session sticky的cookie。如果后端服務(wù)在響應(yīng)頭中沒有設(shè)置該cookie,則認(rèn)為該請求不需要進行session sticky,使用這種模式,后端服務(wù)可以控制哪些請求需要sesstion sticky,哪些請求不需要。

option 設(shè)置用于session sticky的cookie的選項,可設(shè)置成indirect或direct。indirect不會將session sticky的cookie傳送給后端服務(wù),該cookie對后端應(yīng)用完全透明。direct則與indirect相反。

maxidle設(shè)置session cookie的最長空閑的超時時間

  • maxlife設(shè)置session cookie的最長生存期

  • fallback設(shè)置是否重試其他機器,當(dāng)sticky的后端機器掛了以后,是否需要嘗試其他機器

  • hash設(shè)置cookie中server標(biāo)識是用明文還是使用md5值,默認(rèn)使用md5

目前控制臺只支持兩種模式,insert和rewrite模式。

兩種模式下,其他的配置都是相同的。

如何進行tengine session_sticky_module模塊源碼分析和使用

在insert模式下,cookie的值不經(jīng)過后端,完全由lb進行管理,每個后端的rs生成一個唯一的id值,加上maxidle和maxlife值,用分隔符隔開,用作cookie的value,來進行會話保持,這個條件需要option=indirect和session_sticky_hide_cookie配合。

如何進行tengine session_sticky_module模塊源碼分析和使用

在rewrite模式下,除了mode改變,其他完全沒變,cookie的值由后端rs是否設(shè)置來決定。

session_sticky格式補充

第一次請求的時候,因為請求不帶cookie值,或者說cookie值本身是錯誤的,會觸發(fā)第一次選取rs,并且將cookie值通過response返回

curl -v 127.0.0.3:978

* About to connect() to 127.0.0.3 port 978 (#0)

*   Trying 127.0.0.3... connected

* Connected to 127.0.0.3 (127.0.0.3) port 978 (#0)

> GET / HTTP/1.1

> User-Agent: kcurl/1.0 (curl 7.19.7) (x86_64-unknown-linux-gnu) libcurl/7.19.7 OpenSSL/1.0.1e zlib/1.2.3

> Host: 127.0.0.3:978

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: Tengine/2.3.0

< Date: Sun, 28 Apr 2019 10:24:01 GMT

< Content-Type: text/plain

< Content-Length: 3

< Connection: keep-alive

< Set-Cookie: LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041; Path=/

<

* Connection #0 to host 127.0.0.3 left intact

* Closing connection #0

821

返回的cookie值構(gòu)成為,

LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041;

LBSID:配置文件中session_sticky指定的鍵值

d349ca31adc862f4d7e6faa19e516d6d:所選取的后端計算出來的哈希值

1556447041:lastseen,最后一次使用這個cookie的時間戳(用于比較maxidle,下一次請求的將把這個時間戳帶回來,如果與當(dāng)前的時間戳比較超出maxidle,過期處理)

1556447041:firstseen,第一次使用這個cookie的時間戳(用于比較maxlife,基本在請求和返回交互的過程中不會修改)

curl --cookie "LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041; Path=/" 127.0.0.3:978

* About to connect() to 127.0.0.3 port 978 (#0)

*   Trying 127.0.0.3... connected

* Connected to 127.0.0.3 (127.0.0.3) port 978 (#0)

> GET / HTTP/1.1

> User-Agent: kcurl/1.0 (curl 7.19.7) (x86_64-unknown-linux-gnu) libcurl/7.19.7 OpenSSL/1.0.1e zlib/1.2.3

> Host: 127.0.0.3:978

> Accept: */*

> Cookie: LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041; Path=/

>

< HTTP/1.1 200 OK

< Server: Tengine/2.3.0

< Date: Sun, 28 Apr 2019 10:30:13 GMT

< Content-Type: text/plain

< Content-Length: 3

< Connection: keep-alive

< Set-Cookie: LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447413|1556447041; Path=/

<

* Connection #0 to host 127.0.0.3 left intact

* Closing connection #0

821

可見,第二次請求帶著cookie,返回值更新了,lastseen,并且選定了剛剛的rs(d349ca31adc862f4d7e6faa19e516d6d),并且lastseen也更新了時間戳

max_idle測試

curl 10.10.117.238/ok -v

* About to connect() to 10.10.117.238 port 80 (#0)

*   Trying 10.10.117.238...

* Connected to 10.10.117.238 (10.10.117.238) port 80 (#0)

> GET /ok HTTP/1.1

> User-Agent: curl/7.29.0

> Host: 10.10.117.238

> Accept: */*

>

< HTTP/1.1 200 OK

< Server:  LB 1.0.0

< Date: Thu, 17 Oct 2019 07:26:09 GMT

< Content-Type: application/octet-stream

< Content-Length: 2

< Connection: keep-alive

< Set-Cookie: LBSID=10.0.23.20:80|1571367|1572197167; Path=/

<

* Connection #0 to host 10.10.117.238 left intact

ok

第一次請求選擇了rs:10.0.23.20:80

curl --cookie "LBSID=10.0.23.20:80|1571297169|1571297169; Path=/" 10.10.117.238/ok -v

* About to connect() to 10.10.117.238 port 80 (#0)

*   Trying 10.10.117.238...

* Connected to 10.10.117.238 (10.10.117.238) port 80 (#0)

> GET /ok HTTP/1.1

> User-Agent: curl/7.29.0

> Host: 10.10.117.238

> Accept: */*

> Cookie: LBSID=10.0.23.20:80|15734169|1571297217; Path=/

>

< HTTP/1.1 200 OK

< Server: LB 1.0.0

< Date: Thu, 17 Oct 2019 07:26:38 GMT

< Content-Type: application/octet-stream

< Content-Length: 2

< Connection: keep-alive

< Set-Cookie: LBSID=10.0.23.20:80|15734169|1571297217; Path=/

<

* Connection #0 to host 10.10.117.238 left intact

ok

max_idle設(shè)置為30,在18秒內(nèi)的請求沒有超時,繼續(xù)使用10.0.234.20:80這個rs。

curl --cookie "LBSID=10.0.234.20:80|1571297198|1571297217; Path=/" 10.10.117.238/ok -v

* About to connect() to 10.10.117.238 port 80 (#0)

*   Trying 10.10.117.238...

* Connected to 10.10.117.238 (10.10.117.23) port 80 (#0)

> GET /ok HTTP/1.1

> User-Agent: curl/7.29.0

> Host: 10.10.117.238

> Accept: */*

> Cookie: LBSID=10.0.23.20:80|1571297198|1571297217; Path=/

>

< HTTP/1.1 200 OK

< Server: LB 1.0.0

< Date: Thu, 17 Oct 2019 07:27:47 GMT

< Content-Type: application/octet-stream

< Content-Length: 2

< Connection: keep-alive

< Set-Cookie: LBSID=10.0.23.6:80|1571297198|1571297217; Path=/

<

* Connection #0 to host 10.10.117.238 left intact

ok

一旦超過max_idle,該session失效,重新選擇rs,更新lastseen和firstseen

關(guān)于如何進行tengine session_sticky_module模塊源碼分析和使用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI