您好,登錄后才能下訂單哦!
如何進行tengine session_sticky_module模塊源碼分析和使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
nginx以前對session 保持支持不太好,主要采用ip_hash把同一來源的客戶(同一C段的IP)固定指向后端的同一臺機器,ip_hash有個缺點是不能實現很好的負載均衡;直到nginx的擴展模塊nginx-sticky-module的出現,解決了session sticky的問題。
個人感覺tengine的session sticky模塊更好一些,于是把tengine的sticky移植到了nginx里。
temgine session_sticky_module模塊是一個負載均衡模塊,通過cookie實現客戶端與后端服務器的會話保持, 在一定條件下可以保證同一個客戶端訪問的都是同一個后端服務器。
cookie設置用來記錄會話的cookie名稱
domain設置cookie作用的域名,默認不設置
path設置cookie作用的URL路徑,默認不設置
maxage設置cookie的生存期,默認不設置,即為session cookie,瀏覽器關閉即失效
mode設置cookie的模式:
insert: 在回復中本模塊通過Set-Cookie頭直接插入相應名稱的cookie
rewrite: 使用服務端標識覆蓋后端設置的用于session sticky的cookie。如果后端服務在響應頭中沒有設置該cookie,則認為該請求不需要進行session sticky,使用這種模式,后端服務可以控制哪些請求需要sesstion sticky,哪些請求不需要。
option 設置用于session sticky的cookie的選項,可設置成indirect或direct。indirect不會將session sticky的cookie傳送給后端服務,該cookie對后端應用完全透明。direct則與indirect相反。
maxidle設置session cookie的最長空閑的超時時間
maxlife設置session cookie的最長生存期
fallback設置是否重試其他機器,當sticky的后端機器掛了以后,是否需要嘗試其他機器
hash設置cookie中server標識是用明文還是使用md5值,默認使用md5
目前控制臺只支持兩種模式,insert和rewrite模式。
兩種模式下,其他的配置都是相同的。
在insert模式下,cookie的值不經過后端,完全由lb進行管理,每個后端的rs生成一個唯一的id值,加上maxidle和maxlife值,用分隔符隔開,用作cookie的value,來進行會話保持,這個條件需要option=indirect和session_sticky_hide_cookie配合。
在rewrite模式下,除了mode改變,其他完全沒變,cookie的值由后端rs是否設置來決定。
第一次請求的時候,因為請求不帶cookie值,或者說cookie值本身是錯誤的,會觸發第一次選取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值構成為,
LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041;
LBSID:配置文件中session_sticky指定的鍵值
d349ca31adc862f4d7e6faa19e516d6d:所選取的后端計算出來的哈希值
1556447041:lastseen,最后一次使用這個cookie的時間戳(用于比較maxidle,下一次請求的將把這個時間戳帶回來,如果與當前的時間戳比較超出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也更新了時間戳
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設置為30,在18秒內的請求沒有超時,繼續使用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
關于如何進行tengine session_sticky_module模塊源碼分析和使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。