什么是Sticky盗飒?# 為了理解Sticky的工作原理嚷量,我們可以先考慮一個(gè)問(wèn)題:負(fù)載均衡怎么做?
DNS解析逆趣,在域名解析時(shí)分配給不同的服務(wù)器IP蝶溶;
IP Hash,根據(jù)客戶端的IP,將請(qǐng)求分配到不同的服務(wù)器上抖所;
cookie梨州,服務(wù)器給客戶端下發(fā)一個(gè)cookie,具有特定cookie的請(qǐng)求會(huì)分配給它的發(fā)行者田轧。
Sticky就是基于cookie的一種負(fù)載均衡解決方案暴匠,通過(guò)cookie實(shí)現(xiàn)客戶端與后端服務(wù)器的會(huì)話保持, 在一定條件下可以保證同一個(gè)客戶端訪問(wèn)的都是同一個(gè)后端服務(wù)器。請(qǐng)求來(lái)了傻粘,服務(wù)器發(fā)個(gè)cookie每窖,并說(shuō):下次來(lái)帶上,直接來(lái)找我弦悉。
為方便敘述窒典,文中的cookie都指sticky使用的cookie。
Sticky工作原理 Sticky是nginx的一個(gè)模塊,通過(guò)分發(fā)和識(shí)別cookie稽莉,來(lái)使同一個(gè)客戶端的請(qǐng)求落在同一臺(tái)服務(wù)器上瀑志。sticky的處理過(guò)程如下(假設(shè)cookie名稱為route):
1.客戶端首次發(fā)起請(qǐng)求,請(qǐng)求頭未帶route的cookie污秆。nginx接收請(qǐng)求劈猪,發(fā)現(xiàn)請(qǐng)求頭沒(méi)有route,則以輪詢方式將請(qǐng)求分配給后端服務(wù)器良拼。
2.后端服務(wù)器處理完請(qǐng)求岸霹,將響應(yīng)頭和內(nèi)容返回給nginx。
3.nginx生成route的cookie将饺,返回給客戶端贡避。route的值與后端服務(wù)器對(duì)應(yīng),可能是明文予弧,也可能是md5刮吧、sha1等Hash值。
4.客戶端接收請(qǐng)求掖蛤,并創(chuàng)建route的cookie杀捻。
5.客戶端再次發(fā)送請(qǐng)求時(shí),帶上route蚓庭。
6.nginx接收到route致讥,直接轉(zhuǎn)給對(duì)應(yīng)的后端服務(wù)器。
關(guān)于sticky的詳細(xì)的配置過(guò)程在 這里器赞。
參數(shù)解析
這里引用淘寶Tengine的文檔:
語(yǔ)法:session_sticky [cookie=name] [domain=your_domain] [path=your_path] [maxage=time] [mode=insert|rewrite|prefix] [option=indirect] [maxidle=time] [maxlife=time] [fallback=on|off] [hash=plain|md5]
默認(rèn)值:session_sticky cookie=route mode=insert fallback=on
上下文:upstream
說(shuō)明:
本指令可以打開(kāi)會(huì)話保持的功能垢袱,下面是具體的參數(shù):
cookie設(shè)置用來(lái)記錄會(huì)話的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ù)中本模塊通過(guò)Set-Cookie頭直接插入相應(yīng)名稱的cookie爽锥。
prefix: 不會(huì)生成新的cookie涌韩,但會(huì)在響應(yīng)的cookie值前面加上特定的前綴,當(dāng)瀏覽器帶著這個(gè)有特定標(biāo)識(shí)的cookie再次請(qǐng)求時(shí)氯夷,模塊在傳給后端服務(wù)前先刪除加入的前綴臣樱,后端服務(wù)拿到的還是原來(lái)的cookie值,這些動(dòng)作對(duì)后端透明腮考。如:”Cookie: NAME=SRV~VALUE”擎淤。
rewrite: 使用服務(wù)端標(biāo)識(shí)覆蓋后端設(shè)置的用于session sticky的cookie。如果后端服務(wù)在響應(yīng)頭中沒(méi)有設(shè)置該cookie秸仙,則認(rèn)為該請(qǐng)求不需要進(jìn)行session sticky,使用這種模式桩盲,后端服務(wù)可以控制哪些請(qǐng)求需要sesstion sticky寂纪,哪些請(qǐng)求不需要。
option 設(shè)置用于session sticky的cookie的選項(xiàng)赌结,可設(shè)置成indirect或direct捞蛋。indirect不會(huì)將session sticky的cookie傳送給后端服務(wù),該cookie對(duì)后端應(yīng)用完全透明柬姚。direct則與indirect相反拟杉。
maxidle設(shè)置session cookie的最長(zhǎng)空閑的超時(shí)時(shí)間
maxlife設(shè)置session cookie的最長(zhǎng)生存期
fallback設(shè)置是否重試其他機(jī)器,當(dāng)sticky的后端機(jī)器掛了以后量承,是否需要嘗試其他機(jī)器
hash 設(shè)置cookie中server標(biāo)識(shí)是用明文還是使用md5值搬设,默認(rèn)使用md5
maxage是cookie的生存期。不設(shè)置時(shí)撕捍,瀏覽器或App關(guān)閉后就失效拿穴。下次啟動(dòng)時(shí),又會(huì)隨機(jī)分配后端服務(wù)器忧风。所以如果希望該客戶端的請(qǐng)求長(zhǎng)期落在同一臺(tái)后端服務(wù)器上默色,可以設(shè)置maxage。
hash不論是明文還是hash值狮腿,都有固定的數(shù)目腿宰。因?yàn)閔ash是server的標(biāo)識(shí),所以有多少個(gè)server缘厢,就有等同數(shù)量的hash值吃度。
一些例外
同一客戶端的請(qǐng)求,有可能落在不同的后端服務(wù)器上## 如果客戶端啟動(dòng)時(shí)同時(shí)發(fā)起多個(gè)請(qǐng)求贴硫。由于這些請(qǐng)求都沒(méi)帶cookie规肴,所以服務(wù)器會(huì)隨機(jī)選擇后端服務(wù)器,返回不同的cookie。當(dāng)這些請(qǐng)求中的最后一個(gè)請(qǐng)求返回時(shí)拖刃,客戶端的cookie才會(huì)穩(wěn)定下來(lái)删壮,值以最后返回的cookie為準(zhǔn)。
cookie不一定生效## 由于cookie最初由服務(wù)器端下發(fā)兑牡,如果客戶端禁用cookie央碟,則cookie不會(huì)生效。
客戶端可能不帶cookie Android客戶端發(fā)送請(qǐng)求時(shí)均函,一般不會(huì)帶上所有的cookie亿虽,需要明確指定哪些cookie會(huì)帶上。如果希望用sticky做負(fù)載均衡苞也,請(qǐng)對(duì)Android開(kāi)發(fā)說(shuō)加上cookie洛勉。
注意事項(xiàng) * cookie名稱不要和業(yè)務(wù)使用的cookie重名。Sticky默認(rèn)的cookie名稱是route如迟,可以改成任何值收毫。但切記,不可以與業(yè)務(wù)中使用的cookie重名殷勘。 * 客戶端發(fā)的第一個(gè)請(qǐng)求是不帶cookie的此再。服務(wù)器下發(fā)的cookie,在客戶端下一次請(qǐng)求時(shí)才能生效玲销。