真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

負(fù)載均衡集群中的session解決方案是怎么樣的

創(chuàng)新互聯(lián)建站主營(yíng)東莞網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開發(fā),東莞h5成都小程序開發(fā)搭建,東莞網(wǎng)站營(yíng)銷推廣歡迎東莞等地區(qū)企業(yè)咨詢

下文給大家?guī)?lái)負(fù)載均衡集群中的session解決方案是怎么樣的,希望能夠給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助,負(fù)載均衡涉及的東西比較多,理論也不多,網(wǎng)上有很多書籍,今天我們就用創(chuàng)新互聯(lián)在行業(yè)內(nèi)累計(jì)的經(jīng)驗(yàn)來(lái)做一個(gè)解答。

在我們給Web站點(diǎn)使用負(fù)載均衡之后,必須面臨的一個(gè)重要問(wèn)題就是Session的處理辦法,無(wú)論是PHP、Python、Ruby還是Java,只要使用云服務(wù)器保存Session,在做負(fù)載均衡時(shí)都需要考慮Session的問(wèn)題。

負(fù)載均衡集群中的session解決方案是怎么樣的

分享目錄:

  1. 問(wèn)題在哪里?如何處理?

  2. 會(huì)話保持(案例:Nginx、Haproxy)

  3. 會(huì)話復(fù)制(案例:Tomcat)

  4. 會(huì)話共享(案例:Memcached、redis)


問(wèn)題在哪里?

從用戶端來(lái)解釋,就是當(dāng)一個(gè)用戶第一次訪問(wèn)被負(fù)載均衡代理到后端服務(wù)器A并登錄后,服務(wù)器A上保留了用戶的登錄信息;當(dāng)用戶再次發(fā)送請(qǐng)求時(shí),根據(jù)負(fù)載均衡策略可能被代理到后端不同的服務(wù)器,例如服務(wù)器B,由于這臺(tái)服務(wù)器B沒有用戶的登錄信息,所以導(dǎo)致用戶需要重新登錄。這對(duì)用戶來(lái)說(shuō)是不可忍受的。所以,在實(shí)施負(fù)載均衡的時(shí)候,我們必須考慮Session的問(wèn)題。

在負(fù)載均衡中,針對(duì)Session的處理,我們一般有以下幾種方法:

    • Session 保持

    • Session 復(fù)制

    • Session 共享

會(huì)話保持

Session保持(會(huì)話保持)是我們見到最多的名詞之一,通過(guò)會(huì)話保持,負(fù)載均衡進(jìn)行請(qǐng)求分發(fā)的時(shí)候保證每個(gè)客戶端固定的訪問(wèn)到后端的同一臺(tái)應(yīng)用服務(wù)器。會(huì)話保持方案在所有的負(fù)載均衡都有對(duì)應(yīng)的實(shí)現(xiàn)。而且這是在負(fù)載均衡這一層就可以解決Session問(wèn)題。

Nginx做負(fù)載均衡的Session保持

對(duì)于Nginx可以選用Session保持的方法實(shí)行負(fù)載均衡,nginx的upstream目前支持5種方式的分配方式,其中有兩種比較通用的Session解決方法,ip_hash和url_hash。注意:后者不是官方模塊,需要額外安裝。

ip_hash

每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,達(dá)到了Session保持的方法。

例:

upstream bakend {
   ip_hash;
   server192.168.0.11:80;
   server192.168.0.12:80;
 }

Haproxy做負(fù)載均衡的Session保持

    Haproxy作為一個(gè)優(yōu)秀的反向代理和負(fù)載均衡軟件,也提供了多種Session保持的方法,下面列舉了兩種最常用的:

源地址 Hash

haroxy 將用戶IP經(jīng)過(guò)hash計(jì)算后指定到固定的真實(shí)服務(wù)器上(類似于nginx 的ip hash 指令)

配置指令:balancesource

使用cookie進(jìn)行識(shí)別 

也就是Haproxy在用戶第一次訪問(wèn)的后在用戶瀏覽器插入了一個(gè)Cookie,用戶下一次訪問(wèn)的時(shí)候?yàn)g覽器就會(huì)帶上這個(gè)Cookie給Haproxy,Haproxy進(jìn)行識(shí)別。

配置指令:cookie  SESSION_COOKIE  insert indirect nocache

配置例子如下:

cookie SERVERID insert indirect nocache
server web01 192.168.56.11:8080 check cookie web01
server web02 192.168.56.12:8080 check cookie web02

會(huì)話保持的缺點(diǎn):

會(huì)話保持看似解決了Session同步的問(wèn)題,但是卻帶來(lái)的一些其它方面的問(wèn)題:

  • 負(fù)載不均衡了:由于使用了Session保持,很顯然就無(wú)法保證負(fù)載絕對(duì)的均衡。

  • 沒有徹底解決問(wèn)題:如果后端有服務(wù)器宕機(jī),那么這臺(tái)服務(wù)器的Session丟失,被分配到這臺(tái)服務(wù)請(qǐng)求的用戶還是需要重新登錄。


負(fù)載均衡集群中的session解決方案是怎么樣的
會(huì)話復(fù)制

既然,我們的目標(biāo)是所有服務(wù)器上都要保持用戶的Session,那么將每個(gè)應(yīng)用服務(wù)器中的Session信息復(fù)制到其它服務(wù)器節(jié)點(diǎn)上是不是就可以呢?這就是Session的第二中處理辦法:會(huì)話復(fù)制。

 會(huì)話復(fù)制在Tomcat上得到了支持,它是基于IP組播(multicast)來(lái)完成Session的復(fù)制,Tomcat的會(huì)話復(fù)制分為兩種:

  • 全局會(huì)話復(fù)制:利用Delta Manager復(fù)制會(huì)話中的變更信息到集群中的所有其他節(jié)點(diǎn)。

  • 非全局復(fù)制:使用Backup Manager進(jìn)行復(fù)制,它會(huì)把Session復(fù)制給一個(gè)指定的備份節(jié)點(diǎn)。

    不過(guò),這里我不準(zhǔn)備來(lái)解釋會(huì)話復(fù)制的Tomcat配置,如果有需求可以參考Tomcat官方文檔,主要是因?yàn)闀?huì)話復(fù)制不適合大的集群。根據(jù)筆者在生產(chǎn)的實(shí)踐案例,當(dāng)時(shí)是在集群超過(guò)6個(gè)節(jié)點(diǎn)之后就會(huì)出現(xiàn)各種問(wèn)題,不推薦生產(chǎn)使用。

會(huì)話共享

既然會(huì)話保持和會(huì)話復(fù)制都不完美,那么我們?yōu)槭裁床话裇ession放在一個(gè)統(tǒng)一的地方呢,這樣集群中的所有節(jié)點(diǎn)都在一個(gè)地方進(jìn)行Session的存取就可以解決問(wèn)題。

    Session存放到哪里?

對(duì)于Session來(lái)說(shuō),肯定是頻繁使用的,雖然你可以把它存放在數(shù)據(jù)庫(kù)中,但是真正生產(chǎn)環(huán)境中我更推薦存放在性能更快的分布式KV數(shù)據(jù)中,例如:Memcached和Redis。

 

PHP設(shè)置Session共享

如果你使用的是PHP那么恭喜你,配置非常的簡(jiǎn)單。PHP通過(guò)兩行配置就可以把Session存放在Memcached或者Redis中,當(dāng)然你要提前配置好他們。修改php.ini:

session.save_handler = memcache
session.save_path = "tcp://192.168.56.11:11211"

使用Redis存儲(chǔ)Session

session.save_handler = redis
session.save_path ="tcp://localhost:6379"

提醒:別忘了給PHP安裝memcache或者redis插件。

Tomcat設(shè)置Session共享

我們可以使用MSM(Memcached Session Manager)來(lái)實(shí)現(xiàn)同樣把Session存放到Memcache中,GIthub地址如下:https://github.com/magro/memcached-session-manager目前支持Tomcat 6.x7.x和8.x的版本。

如果你想使用Redis,剛好也有開源的可以用,但是遺憾的是暫時(shí)不支持Tomcat 8.x的版本:https://github.com/jcoleman/tomcat-redis-session-manager

 

Django設(shè)置Session共享

在Django中Session是通過(guò)一個(gè)中間件管理的。如果要在應(yīng)用程序中使用Session,需要在settings.py中的MIDDLEWARE_CLASSES變量中加入’django.contrib.sessions.middleware.SessionMiddleware’ 。Django的Session引擎可以將Session存放在三個(gè)地方,分別是:數(shù)據(jù)庫(kù)、緩存、文件。

使用數(shù)據(jù)庫(kù)保存Session

如果你想使用數(shù)據(jù)庫(kù)支持的會(huì)話,你需要添加'django.contrib.sessions'到你的INSTALLED_APPS設(shè)置中。在配置完成之后,請(qǐng)運(yùn)行manage.py migrate來(lái)安裝保存會(huì)話數(shù)據(jù)的一張數(shù)據(jù)庫(kù)表。

使用緩存保持Session

對(duì)于簡(jiǎn)單的緩存會(huì)話:

可以設(shè)置SESSION_ENGINE 為"django.contrib.sessions.backends.cache"。此時(shí)會(huì)話數(shù)據(jù)將直接存儲(chǔ)在你的緩存中。然而,緩存數(shù)據(jù)將可能不會(huì)持久:如果緩存填滿或者緩存服務(wù)器重啟,緩存數(shù)據(jù)可能會(huì)被清理掉。

  若要持久的緩存數(shù)據(jù):

可以設(shè)置SESSION_ENGINE為"django.contrib.sessions.backends.cached_db"。它的寫操作使用緩存,對(duì)緩存的每次寫入都將再寫入到數(shù)據(jù)庫(kù)。對(duì)于讀取的會(huì)話,如果數(shù)據(jù)不在緩存中,則從數(shù)據(jù)庫(kù)讀取。兩種會(huì)話的存儲(chǔ)都非??欤呛?jiǎn)單的緩存更快,因?yàn)樗艞壛顺志眯?。大部分情況下,cached_db后端已經(jīng)足夠快,但是如果你需要榨干最后一點(diǎn)的性能,并且接受會(huì)話數(shù)據(jù)丟失的風(fēng)險(xiǎn),那么你可使用cache而不是cached_db

使用文件保存Session

使用文件保存Session不再我們的討論之類,因?yàn)楹茈y進(jìn)行共享,PHP默認(rèn)也是將Session存放在/tmp目錄下。

看了以上關(guān)于負(fù)載均衡集群中的session解決方案是怎么樣的,如果大家還有什么地方需要了解的可以在創(chuàng)新互聯(lián)行業(yè)資訊里查找自己感興趣的或者找我們的專業(yè)技術(shù)工程師解答的,創(chuàng)新互聯(lián)技術(shù)工程師在行業(yè)內(nèi)擁有十幾年的經(jīng)驗(yàn)了。

 

 


網(wǎng)頁(yè)名稱:負(fù)載均衡集群中的session解決方案是怎么樣的
文章出自:http://weahome.cn/article/gigoec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部