聲明:以下僅為個人的一些總結(jié)和隨寫,如有不對之處,還請看到的網(wǎng)友指出,以免誤導(dǎo)。 (詳細(xì)的配置方案請google,這里只說解決方案。)
1、熟悉幾個組件 1.4、HAProxy
—— HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案。HAProxy特別適用于那些負(fù)載特大的web站點,
這些站點通常又需要會話保持或七層處理。HAProxy運行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬計的并發(fā)連接。并且它的運行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上.
3、常用web集群
問題1:只有一個web服務(wù)器,明顯的單點故障。如果該apache出現(xiàn)問題,整個網(wǎng)站就會癱瘓。
3.2、session復(fù)制
LVS、HAProxy、Nginx做負(fù)載均衡的比較 4.2.1、terracotta是jvm級別的session共享 它基本原理是對于集群間共享的數(shù)據(jù),當(dāng)在一個節(jié)點發(fā)生變化的時候,Terracotta只把變化的部分發(fā)送給Terracotta服務(wù)器,然后由服務(wù)器把它轉(zhuǎn)發(fā)給真正需要這個數(shù)據(jù)的節(jié)點,并且共享的數(shù)據(jù)對象不需要序列化。
4.2.2、通過memcached實現(xiàn)內(nèi)存級session共享 通過memcached-session-manager(msm)插件,通過tomcat上一定的配置,即可實現(xiàn)把session存儲到memcached服務(wù)器上。注意:tomcat支持tomcat6+,并且memcached可以支持分布式內(nèi)存,msm同時支持黏性session(sticky sessions)或者非黏性session(non-sticky sessions)兩種模式,在memcached內(nèi)存中共享的對象需要序列化。結(jié)構(gòu)如圖3:
通過一定的配置,可以實現(xiàn)故障轉(zhuǎn)移(只支持對非粘性session)。如:
說明:failoverNodes:故障轉(zhuǎn)移節(jié)點,對非粘性session不可用。屬性failoverNodes="n1"的作用是告訴msm最好是把session保存在memcached "n2"節(jié)點上,只有在n2節(jié)點不可用的情況下才把session保存在n1節(jié)點。這樣即使host2上的tomcat宕機,仍然可以通過host1上的tomcat訪問存放在memcached "n1" 節(jié)點中的session。
原理在第三,四篇文章中講到了會話保持的問題,而且還遺留了一個問題,就是會話保持存在單點故障, 當(dāng)時的方案是cookie插入后綴,即haproxy指負(fù)責(zé)分發(fā)請求,應(yīng)用服務(wù)自行保持用戶會話,如果應(yīng) 用服務(wù)器宕機,則session會丟失。 現(xiàn)在來溫習(xí)下解決方案 方案1:session復(fù)制
方案2:session粘滯
方案3:session服務(wù)器
Redis保存session方案 上篇文章講到的就是session粘滯的方案,既然前2種方案都有各自的缺點,那么就采用第三中方案 可以用redis做session緩存,保存用戶session,做成主備模式,采用同步備份或者異步備份。 同步備份:在主機宕機時,備機接管之后session數(shù)據(jù)不丟失。 異步備份:在主機宕機時,備機接管主機,但是如果有一部分session還沒來得及同步到備機,session將丟失。 可以根據(jù)實際情況來決定采用同步備份還是異步備份。 系統(tǒng)架構(gòu)圖如下: 如果用戶量比較大,單服務(wù)器訪問和存儲session將會成為瓶頸,可以考慮用session服務(wù)器集群,架構(gòu)圖如下: redis集群特點 1)將數(shù)據(jù)分散到集群中的多個節(jié)點,每個節(jié)點存儲的數(shù)據(jù)量就會變少,這樣存儲和訪問 的效率會得到提升。 2)每個節(jié)點都有主備,如果節(jié)點的主存儲掛了,備份存儲會接管主存儲,提高可用性。 Redis+Tomcat實現(xiàn)session流程 1.客戶端首次請求服務(wù)端 2.服務(wù)端產(chǎn)生session并set cookie響應(yīng)給客戶端 3.客戶端再次請求服務(wù)端,會帶上cookie 4.服務(wù)端根據(jù)cookie找到對應(yīng)的session 實現(xiàn)思路 如果我們要編寫程序?qū)崿F(xiàn)這個方案,需要解決以下問題: 1.session的安全性,即不容易被仿造。 2.session的唯一性,如果用tomcat產(chǎn)生session的策略,多臺tomcat會產(chǎn)生的session會存在重復(fù)的可能。 3.session的有效期維護(hù),session會有個有效期,用戶在這個時間內(nèi)不訪問系統(tǒng),session將會失效,如果 用戶一直訪問,則要自動延長session有效期。 4.在集群session服務(wù)器中,要考慮負(fù)載均衡,這也是需要編寫客戶端代碼的,在分布式session緩存中, 需要根據(jù)sessionId哈希分布,那么就和服務(wù)器個數(shù)進(jìn)行了耦合,在添加和移除服務(wù)器的時候,將出現(xiàn)數(shù) 據(jù)不一致的問題 。 5.如何實現(xiàn)才能讓應(yīng)用程序改動最小,或者是不改動。 我們可以選擇自己寫程序來實現(xiàn)以上功能,不過在這里我使用一個現(xiàn)成的框架,即tomcat-redis-session-manager 有時間并感興趣的朋友,可以在這個基礎(chǔ)上自行實現(xiàn)一個,這樣更適合自己的項目。 服務(wù)器部署分布: ha主機 192.168.1.227:80 ha備機 192.168.1.246:80 keepalived 主機 192.168.1.227 keepalived備機 192.168.1.246 web1 http://192.168.1.226:8888/login web2 http://192.168.1.246:8888/login redis主 192.168.1.245 6380 redis備 安裝redis 主機和備機都安裝redis wget http://download./releases/redis-2.8.5.tar.gz 解壓: tar xzf redis-2.8.5.tar.gz cd redis-2.8.5 make 啟動 src/redis-server redis.conf --port 6380 & 客戶端登錄 src/redis-cli -p 6380 備機配置復(fù)制: redis.conf文件中 添加 slaveof 192.168.1.245 6380 Tomcat配置 tomcat版本:7.0.61 相關(guān)jar包: 注意這里的jar包最好是按下面的版本,否則會出現(xiàn)jar包沖突的問題。 tomcat-redis-session-manager-1.1.jar commons-pool-1.6.jar jedis-2.1.0.jar 下載tomcat redis session manager https://github.com/jcoleman/tomcat-redis-session-manager/downloads 下載 apache common pool http://commons./proper/commons-pool/download_pool.cgi 下載版本:tomcat-redis-session-manager-1.1 redis的jar包可以從maven中央倉庫下載 將以上3個jar包放入tomcat/lib目錄中 在tomcat context.xml中加入如下內(nèi)容 <!-- host: optional: defaults to "localhost" --> <!-- port: defaults to "6379" --> <!-- database: optional: defaults to "0" --> <!-- maxInactiveInterval: optional: defaults to "60" (in seconds) --> <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="192.168.1.245" port="6380" database="0" maxInactiveInterval="60" /> 啟動tomcat,瀏覽器請求tomcat http://192.168.1.226:8888/login/ 登錄redis客戶端,查看session session已經(jīng)被保存到redis 下面,我們進(jìn)行一項測試 測試流程: 1.先訪問虛擬ip1.99的應(yīng)用,得到sessionId web服務(wù)器是226 2.然后將對應(yīng)的tomcat停掉 3.刷新該應(yīng)用,若sessionId未變,則表示redis保存session成功。 我們發(fā)現(xiàn)web服務(wù)器變成了246,但是sessionId未發(fā)生變化 該方案將session集中保存在了redis服務(wù)器,并做了主備容災(zāi),從一定程度上提高了系統(tǒng)的高可用,由于 redis是內(nèi)存存儲,訪問效率較高,在性能上也是比較好的,但是本例中session不是分布式存儲,因此當(dāng)用戶量 非常大,并發(fā)訪問量非常高的時候,session服務(wù)器會成為性能瓶頸。
|
|