在多台後台伺服器的環境下,我們為了確保乙個客戶只和一台伺服器通訊,我們勢必使用長連線。使用什麼方式來實現這種連線呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對不是乙個好的辦法,如果前端是cdn,或者說乙個區域網的客戶同時訪問伺服器,導致出現伺服器分配不均衡,以及不能保證每次訪問都粘滯在同一臺伺服器。如果基於cookie會是一種什麼情形,想想看, 每台電腦都會有不同的cookie,在保持長連線的同時還保證了伺服器的壓力均衡。
問題分析:
一開始請求過來,沒有帶session資訊,jvm_route就根據round robin的方法,發到一台tomcat上面。
tomcat新增上session 資訊,並返回給客戶。
使用者再此請求,jvm_route看到session中有後端伺服器的名稱,它就把請求轉到對應的伺服器上。
暫時jvm_route模組還不支援預設fair的模式。jvm_route的工作模式和fair是衝突的。對於某個特定使用者,當一直為他服務的 tomcat宕機後,預設情況下它會重試max_fails的次數,如果還是失敗,就重新啟用round robin的方式,而這種情況下就會導致使用者的session丟失。
總的說來,jvm_route是通過session_cookie這種方式來實現session粘性,將特定會話附屬到特定tomcat上,從而解決session不同步問題,但無法解決宕機後會話轉移問題。 假如沒有這個jvm_route,使用者再請求的時候,由於沒有session資訊,nignx就會再次隨機的傳送請求到後端的tomcat伺服器,這種情況,對於普通的頁面訪問是沒有問題的。對於帶有登入驗證資訊的請求,其結果就是永遠登入不了應用伺服器。 這個模組通過session cookie的方式來獲取session粘性。如果在cookie和url中並沒有session,則這只是個簡單的round-robin 負載均衡。
解決方案
nginx中的ip_hash技術能夠將某個ip的請求定向到同一台後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:
upstream backend
1 nginx不是最前端的伺服器。
ip_hash要求nginx一定是最前端的伺服器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那麼nginx取ip時只能得到squid的伺服器ip位址,用這個位址來作分流是肯定錯亂的。
2 nginx的後端還有其它方式的負載均衡。
假如nginx後端又有其它負載均衡,將請求又通過另外的方式分流了,那麼某個客戶端的請求肯定不能定位到同一臺session應用伺服器上。
3 多個外網出口。
很多公司上網有多個出口,多個ip位址,使用者訪問網際網路時候自動切換ip。而且這種情況不在少數。使用 ip_hash 的話對這種情況的使用者無效,無法將某個使用者繫結在固定的tomcat上 。
nginx_upstream_jvm_route 是乙個nginx的擴充套件模組,用來實現基於 cookie 的 session sticky 的功能。
簡單來說,它是基於cookie中的jsessionid來決定將請求傳送給後端的哪個server,nginx_upstream_jvm_route會在使用者第一次請求後端server時,將響應的server標識繫結到cookie中的jsessionid中,從而當使用者發起下一次請求時,nginx會根據jsessionid來決定由哪個後端server來處理。
1 nginx_upstream_jvm_route安裝
(1)進入nginx原始碼路徑
2 nginx配置
upstream tomcats_jvm_route
3 tomcat配置
修改192.168.33.10:8090tomcat的server.xml,
將修改為:
同理,在192.168.33.11:8090server.xml中增加jvmroute="tomcat02"。
4 測試
啟動tomcat和nginx,訪問nginx**,使用google瀏覽器,f12,檢視cookie中的jsessionid, 形如:abcd123456oiuh897sdfsdf.tomcat01 ,重新整理也不會變化
分布式SESSION一致性
session是伺服器為客戶端建立的乙個會話,儲存使用者的相關資訊,用以標識使用者身份等。在單伺服器環境下是不需要考慮會話的一致性的問題的,但是在集群環境下就會出現一些問題,假如乙個使用者在登入請求時負載均衡到了a伺服器,a伺服器為其分配了session,下次請求資料時被分配到了b伺服器,此時由於b...
分布式一致性
分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...
分布式一致性
分布式系統的乙個重要問題是資料的複製。對資料的複製一般有兩個原因 資料複製的主要難題是保持各個副本的一致性。即在更新乙個副本時,必須確保同時更新其他的副本,否則資料的各個副本將不再相同。一致性模型實質上是程序和資料儲存之間的乙個約定。正常情況下,乙個資料項上執行讀操作時,它期待該操作返回的是該資料在...