MSM--Memcached_Session_Manager介绍及使用
我 們都知道對于一些大型的web2.0的網站,在正式部署時一般是部署在不同故障域的多臺應用服務器上,以j2ee應用為例,一般我們都會部署在 tomcat下,假如我們部署了10臺tomcat服務器,那這10臺tomcat可能是部署在不同的機器上,然后將應用程序copy到這10臺 tomcat下,然后啟動所有tomcat,一般來說這樣做的目的是為了達到負載均衡以及避免單點故障,另外也考慮到國內網絡環境的原因,避免跨網絡運營 商訪問而導致訪問速度低下的問題,當然不要忘了坐鎮這10臺tomcat前端的還有我們的反向代理服務器,比如nginx,這個就是另一個話題了,我今天 主要講的是,對于這種分布式tomcat環境,我們如何保證session 的唯一性(我假定你知道session是什么)。這也是在日期公司的一個項目中負責解決的一個問題,當然實際上這并不是什么新的議題,之前就有很多解決方 案,但是一般來說的大體的解決方案是自己通過編寫一段代碼或者通過配置tomcat的filter,將產生的session放到同一個內存數據庫中,事實 上這確實可行的,只不過我比較懶,我總是覺得這種問題應該有更省事更成熟的解決方案,那確實是有的,也就是我馬上介紹 的?Memcached_Session_Manager,簡稱msm,這就是一個用于解決分布式tomcat環境下session共享的問題的開源解決 方案。
一 簡介
(以下內容由個人根據msm官網大意翻譯,原文地址:http://code.google.com/p/memcached-session-manager/)
?
?引言
MSM--memcached session manager是一個高可用的Tomcat session共享解決方案,除了可以從本機內存快速讀取Session信息(僅針對黏性Session)外,同時可使用memcached存取Session,以實現高可用。
對于非黏性Session,memcached直接存儲session。
除memcached外,還可以其他緩存組件如memcachedb,?membase等。
?特性
? ?支持Tomcat6、Tomcat7
?支持黏性、非黏性Session
?? ?無單一故障點
? ? ? ? ?可處理tomcat故障轉移
? ? ? ? ?可處理memcached故障轉移
? ? ? ? ?插件式session序列化
? ? ? ? ?允許異步保存session,以提升響應速度
? ? ? ? ?只有當session有修改時,才會將session寫回memcached
? ? ? ? ?JMX管理&監控
MSM解決的問題
假設你有一個Tomcat集群,使用黏性session,如何應對單點故障問題?為了應對更多的并發量和可用性,你可以不斷的增加Tomcat節點,但是單點故障仍舊會是個問題:如果使用黏性Session,一個Tomcat故障時,其他Tomcat并不能接管故障Tomcat節點的Session。
解決此問題的思路就是將黏性Session同時保存在Memcached中,如果單個Tomcat發生故障,集群中的其他Tomcat可以從Memcached中得到Session信息。
? ? ?【注】對于非黏性Session,MSM? V1.4.0及以后版本已經支持。
MSM如何工作
? ? ?【注】以下論述僅針對黏性Session
安裝在Tomcat上的MSM使用本機內存保存session,和StandardManager一樣。另外,當一個請求結束時,session會被送回Memcached進行備份。當下一次請求開始時,本地Session可用,直接服務,請求結束后,session又被送回Memcached備份。
當集群中的一個Tomcat掛掉,下一次請求會被路由到其他Tomcat上。負責處理此此請求的Tomcat并不清楚Session的信息。此時它會從Memcached查找該Session,更新該Session并將其保存在本機內容。此次請求結束,session被修改,送回Memcached備份。
?
?
.
What else?
上邊介紹的是處理Tomcat故障轉移,MSM又是如何處理Memcached故障轉移呢?
如果一個Memcached故障,當前Memcached中的Session會轉移到其他Memcached節點,同時,JSESSIONID被修改并送回瀏覽器。
如果使用黏性Session,應確保loadbalancer中配置生成的JSESSIONID無任何后綴。
SESSIONID的格式
MSM知道Memcached節點列表,這些節點標識會存儲在SESSIONID中,SESSIONID值類似:602F7397FBE4D9932E59A9D0E52FE178-n1?【其中n1為Memcached節點標識】
?
二 安裝
?
參考網站:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
?
環境
?
1. Linux?環境
2. Tomcat7.X?(3臺),在同一臺機器上啟動三臺Tomcat需要修改conf/server.xml中的三個端口:8080,8005,8009
3. MemBase?(1臺),也可采用memcached,使用方法一樣,只是在java客戶端連接時有不同。
4. nginx
?
準備的jar包
?
注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一樣,需要針對tomcat版本下載對應的包.
1.這是采用的最新穩定版1.6.1,序列化方式使用的是kryo,注意版本要求與msm版本基本一致,建議統一采用最新穩定版,如下。其中序列化方式是可選的。
?
2.這是采用的javolution的序列化方式所有需要的包
?
建議采用kryo序列化方式,效率更高。
?
配置
1. 將上面所提到的包全部拷貝到tomcat的lib下(三臺tomcat都需要)
? ? ? ? 2. 修改每臺tomcat的conf目錄下得context.xml文件或者server.xml文件,在其中加入如下任意一段代碼(注意:當使用多臺tomcat時,一定要使用non-sticky模式):
A:使用默認的sticky session,kryo序列化方式,memcached緩存
?
Java代碼 ??
B:使用non-sticky session
Java代碼 ?C:使用membase
Java代碼 ?當使用javolution序列化方式時將:
Java代碼 ?替換為:?
?
Java代碼 ??
配置完成后,分別啟動tomcat,正常啟動說明msm配置成功。
3. 最后附上nginx配置:
修改配置文件nginx\conf\nginx.conf
1.?找到內容server {
在它的上面加入如下內容:
?
Java代碼 ?2.?找到
Java代碼 ?把內容更改如下:
Java代碼 ?3. ?找到
Java代碼 ?把內容改成如下:
Java代碼 ??(這是監聽訪問域名綁定那臺服務器80端口的請求)
到這里所有的配置已經完成,現在準備一個簡單的web工程,并分別部署到三臺tomcat下。啟動memcached(membase),啟動三臺tomcat,啟動nginx,然后在地址欄輸入url地址,看能否成功訪問。關閉其中一臺tomcat,看是否仍然能夠正常訪問,能夠則說明配置nginx配置成功。
?
三 原理
MSM(memcached-session-manager)?支持tomcat6?和tomcat7?,利用?Value(Tomcat?閥)對Request進行跟蹤。Request請求到來時,從memcached加載session,Request請求結束時,將tomcat session更新至memcached,以達到session共享之目的,?支持?sticky ?和?non-sticky?模式。需要注意的是使用sticky模式時需要配置jvmroute參數,配置方式如下:
配置$CATALINA_HOME/conf/server.xml
Java代碼 ??? 注意每臺tomcat的jvmroute參數都不能一樣
?Sticky?模式:tomcat session?為?主session,?memcached?為備?session。Request請求到來時,?從memcached加載備?session?到?tomcat (僅當tomcat jvmroute發生變化時,否則直接取tomcat session);Request請求結束時,將tomcat session更新至memcached,以達到主備同步之目的。下面是sticky模式時響應的流程圖(圖片來源網絡):
?
?
?Non-Sticky模式:tomcat session?為?中轉session,?memcached1?為主?sessionmemcached 2?為備session。Request請求到來時,從memcached 2加載備?session?到?tomcat,(當?容器?中還是沒有session?則從memcached1加載主?session?到?tomcat,?這種情況是只有一個memcached節點,或者有memcached1?出錯時),Request請求結束時,將tomcat session更新至?主memcached1和備memcached2,并且清除tomcat session?。以達到主備同步之目的,如下是non-sticky模式的響應流程圖:(圖片來源網絡)。
?
Memcached一些特性和限制
l?在?Memcached?中可以保存的?item?數據量是沒有限制的,只有內存足夠
l?Memcached?單進程最大使用內存為?2G?,要使用更多內存,可以分多個端口開啟多個?,?Memcached進程
l?最大?30?天的數據過期時間?,?設置為永久的也會在這個時間過期,常量?REALTIME_MAXDELTA 60 * 60 *24 *30控制
l?最大鍵長為?250?字節,大于該長度無法存儲,常量?KEY_MAX_LENGTH 250?控制
l?單個?item最大數據是1MB?,超過1MB?數據不予存儲,常量?POWER_BLOCK 1048576?進行控制,它是默認的?slab大小
l?最大同時連接數是200?,通過conn_init()?中的freetotal?進行控制,最大軟連接數是?1024,通過settings.maxconns=1024進行控制
l?跟空間占用相關的參數:?settings.factor=1.25, settings.chunk_size=48,?影響?slab的數據占用和步進方式
關于Memcached的使用,應當在需要的情況下才使用Memcached,比如需要實現分布式緩存系統,否則,如果是類似單臺緩存服務器,那么建議最好不要用Memcached,改用其他緩存系統。
?
?
?
總結
以上是生活随笔為你收集整理的MSM--Memcached_Session_Manager介绍及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原)Apache添加完限速模块后的文件
- 下一篇: Mallet机器语言工具包-入门测试