亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

詳解Tomcat集群如何同步會話

2024-09-01 13:49:58
字體:
來源:轉載
供稿:網友

Tocmat集群中最重要的交換信息就是會話消息,對某個tomcat實例某會話做的更改要同步到集群其他tomcat實例的該會話對象,這樣才能保證集群所有實例的會話數據一致。在tribes組件的基礎上完成這些工作就相當容易些,tribes是tomcat實現的一個通信框架。

如下圖,tomcat實現會話同步的過程中大致會使用如下組件,現在假設中間的tomcat實例的會話改變了,它會通過會話管理器Manager將改變的動作消息封裝成消息然后調用集群對象Cluster,通過Cluster將消息發送出去,同時Cluster又依賴于tribes,最后消息其實是交由tribes真正發送的,通信過程是以ClusterMessage為對象傳輸的,它會先被序列化進行傳輸,到達左邊和右邊的tomcat實例時會被反序列化,消息由tribes接收后往Cluster上傳,最后到達會話管理器Manager,Manager根據動作消息去同步會話。

Tomcat集群同步會話,tomcat集群,tomcat集群會話

所以Cluster其實就是實現了ChannelListener的監聽類,當tribes接收到消息后就會調用此監聽器的messageReceived方法處理邏輯,此方法又會繼續往上通知Manager的messageDataReceived方法,此方法內完成會話同步處理邏輯。關于會話具體的同步機制tomcat提供了兩種,分別是“集群增量會話管理器——DeltaManager”和“集群備份會話管理器——BackupManager”。

DeltaManager會話管理器

DeltaManager會話管理器是tomcat默認的集群會話管理器,它主要用于集群中各個節點之間會話狀態的同步維護。集群增量會話管理器的職責是將某節點的會話該變同步到集群內其他成員節點上,它屬于全節點復制模式,所謂全節點復制是指集群中某個節點的狀態變化后需要同步到集群中剩余的節點,非全節點方式可能只是同步到其中某個或若干節點。

在集群中全節點會話復制的一個大致步驟如下圖所示,客戶端發起一個請求,假設通過一定的負載均衡設備分發策略分到其中一個結點node1,如果還未存在session對象的話web容器將會創建一個會話對象,接著執行一些邏輯處理,在對客戶端響應之前有個重要的事情是要把session對象同步到集群中其他節點上,最后再響應客戶端。當客戶端第二次發起請求時,假如分發到node3節點上,由于同步了node1的session會話,所以在執行邏輯時并不會取不到session的值。如果刪除某個會話對象則要同時通知其他節點把相應會話刪除,如果修改了某個會話的某些屬性也同樣要更新到其他節點的會話中。

Tomcat集群同步會話,tomcat集群,tomcat集群會話

DeltaManager其實就是一個會話同步通信解決方案,除了具備上面提到的全節點復制外,它還有具有只復制會話增量的特性,增量是以一個完整請求為周期,即會將一個請求過程中所有會話修改量在響應前進行集群同步。往下看Tomcat具體實現方案。
為區分不同的動作必須要先定義好各種事件,例如會話創建事件、會話訪問事件、會話失效事件、獲取所有會話事件、會話增量事件、會話ID改變事件等等,實際上tomcat集群會有9種事件,集群根據這些不同的事件就可以彼此進行通信,接收方對不同事件做不同的操作。

如下圖,例如node1節點創建完一個會話后,即向其他三個節點發送EVT_SESSION_CREATED事件,其他三個節點接收到此事件后則各自在自己本地創建一個會話,會話包含了兩個很重要的屬性——會話ID和創建時間,這兩個屬性都必須由node1節點跟著EVT_SESSION_CREATED一起發送出去,本地會話創建成功后即完成了會話創建同步工作,此時你通過會話ID查找集群中任意一個節點都可以找到對應的會話。同樣對于會話訪問事件,node1向其他節點發送EVT_SESSION_ACCESSED事件及會話ID,其他節點根據會話ID找到對應會話并更新會話最后訪問時間,以免被認為是過期會話而被清理。類似的還有會話失效事件(同步集群銷毀某會話)、會話ID改變事件(同步集群更改會話ID)等等操作。

Tomcat集群同步會話,tomcat集群,tomcat集群會話

Tomcat使用SessionMessageImpl類定義了各種集群通信事件及操作方法,在整個集群通信過程中就是按照此類定義好的事件進行通信,SessionMessageImpl包含的事件如下{ EVT_SESSION_CREATED、EVT_SESSION_EXPIRED、EVT_SESSION_ACCESSED、EVT_GET_ALL_SESSIONS、EVT_SESSION_DELTA、EVT_ALL_SESSION_DATA、EVT_ALL_SESSION_TRANSFERCOMPLETE、EVT_CHANGE_SESSION_ID、EVT_ALL_SESSION_NOCONTEXTMANAGER },除此之外它繼承了序列化接口(方便序列化)、集群消息接口(集群的操作)、會話消息接口(事件定義及會話操作)。

Tomcat集群同步會話,tomcat集群,tomcat集群會話

集群增量會話管理器DeltaManager可以說是通過SessionMessageImpl消息來管理DeltaSession,即根據SessionMessageImpl里面的事件響應不同的操作。Tomcat的集群通信使用的是tribes組件(相關章節會對tribes組件詳細分析),網絡IO都交由tribes后應用可以更專注邏輯處理,DeltaManager存在一個messageDataReceived(ClusterMessage cmsg)方法,此方法會在本節點接收到其他節點發送過來的消息后被調用,且傳入的參數為ClusterMessage類型,可轉化為SessionMessage類型,然后根據SessionMessage定義的9種事件做不同處理。

其中有一個事件需要關注的是EVT_SESSION_DELTA,它是對會話增量同步處理的事件,某個節點在一個完整的請求過程中對某會話相關屬性的所有操作被抽象到了DeltaRequest對象中,而DeltaRequest被序列化后會放到SessionMessage中,所以EVT_SESSION_DELTA事件處理邏輯就是從SessionMessage獲取并反序列化出DeltaRequest對象,再將DeltaRequest包含的對某個會話的所有操作同步到本地該會話中,至此完成會話增量同步。

Tomcat集群同步會話,tomcat集群,tomcat集群會話

總的來說DeltaManager就是DeltaSession的管理器,它提供了會話增量的同步方式而不是全量同步,極大提高了同步效率。

集群備份會話管理器——BackupManager

全節點復制的網絡流量隨節點數量增加呈平方趨勢增長,也正是因為這個因素導致無法構建較大規模的集群,為了使集群節點能更加大,首要解決的就是數據復制時流量增長的問題,于是tomcat提出了另外一種會話管理方式,每個會話只會有一個備份,它使會話備份的網絡流量隨節點數量的增加呈線性趨勢增長,大大減少了網絡流量和邏輯操作,可構建較大的集群。

下面看看這種方式具體的工作機制,集群一般是通過負載均衡對外提供整體服務,所有節點被隱藏在后端組成一個整體。前面各種模式的實現都無需負載均衡協助,所以圖中都把負載均衡省略了。最常見的負載方式是前面用apache拖所有節點,它支持將類似“326257DA6DB76F8D2E38F2C4540D1DEA.tomcat1”的會話id進行分解,定位到tomcat集群中以tomcat1命名的節點上(這種方式稱為Session Stick,由apache jk模塊實現)。

每個會話存在一個原件和一個備份,且備份與原件不會保存在同一個節點上,如下圖,例如當客戶端發起請求后通過負載均衡被分發到tomcat1實例節點上,生成一個包含.tomcat1后綴的會話標識,并且tomcat1節點根據一定策略選出此次會話對象備份的節點,然后將包含了{會話id,備份ip}的信息發送給tomcat2、tomcat3、tomcat4,如圖中虛線所示,這樣每個節點都有一個會話id、備份ip列表,即每個節點都有每個會話的備份ip地址。

完成上面一步后就是將會話內容備份到備份節點上,假如tomcat1的s1、s2兩個會話的備份地址為tomcat2,則把會話對象備份到tomcat2中,類似的有tomcat2把s3會話備份到tomcat4,tomcat4把s4、s5兩個對話備份到tomcat3,這樣集群中所有的會話都已經有了一份備份。當tomcat1一直不出故障,由于Session Stick技術客戶端將一直訪問到tomcat1節點上,保證一直能獲取到會話。而當tomcat1出故障了,這時tomcat也提供了一個failover機制,apache感知到后端集群tomcat1節點被移除了,這時它會把請求隨機分配到其他任意節點上,接下去會有兩種情況:

①剛好分到了備份節點tomcat2上,此時仍能獲取到s1會話,除此之外,tomcat2還要另外做的事是將這個s1會話標記為原件且繼續選取一個備份地址備份s1會話,這樣一來又有了備份。

②假如分到了非備份節點tomcat3,此時肯定找不到s1會話,于是它將向集群所有節點發問,“請問誰有s1會話的備份ip地址信息?”,因為只有tomcat2有s1的備份地址信息,它接收到詢問后應答告知tomcat3節點s1會話的備份在tomcat2,根據這個信息就能查到s1會話了,并且tomcat3在自己本地生成s1會話并標為原件,tomcat2上的副本不變,這樣一來同樣能找到s1會話,正常完整整個請求處理。

Tomcat集群同步會話,tomcat集群,tomcat集群會話

接著分析Tomcat對上面機制詳細的實現,正常情況下為了支持高效的并發操作,tomcat的所有會話集使用ConcurrentHashMap

public Object put(Object key, Object value) {
  ①實例化MapEntry,將key和value傳入,并設置源節點為目前節點。
  ②判斷本地內存是否已包含key,如是則不僅要本地remove掉,還要跨節點remove。
  ③通過Round robin算法從MapMember中選擇一個作為備份節點。
  ④實例化一個包含MSG_BACKUP標識的MapMessage對象并發送給備份節點。
  ⑤實例化一個包含MSG_PROXY標識的MapMessage對象并發送給除了備份節點外的其他(代理)節點。
  ⑥put進本地緩存。
}

其次,再看看它如何通過get實現獲取會話對象操作:

public Object get(Object key) {
 ①獲取本地的MapEntry對象,它或許直接包含了會話對象,或許包含了會話對象的存放位置信息。
 ②判斷本節點是否屬于源節點,如為源節點則直接獲取MapEntry對象里面的會話對象并返回。
 ③判斷本節點是否屬于備份節點,若為備份節點則直接獲取MapEntry對象里面的會話對象作為返回對象,并且還要將本節點升為源節點、重新選取一個新備份節點,把MapEntry對象拷貝到新備份節點。
 ④判斷本節點是否屬于代理節點,若為代理節點則向其他節點發送會話對象拷貝請求,“集群中誰有此會話對象請發送給我”,把接收到的會話對象放到本節點并作為返回對象,最后將本節點升為源節點。
}

最后,看看刪除會話對象remove操作的實現:

public Object remove(Object key) {
 ①刪除本地此MapEntry對象。
 ②廣播其他節點刪除此MapEntry對象。
}

通過上面三個方法已經很清晰描述了新的Map是如何進行跨節點的增刪改查的,BackupManager會話管理器就是通過這個新的Map進行會話管理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片在线看免费观看| 久久精品国产久精国产一老狼| 成人午夜一级二级三级| 亚洲福利视频二区| 欧美俄罗斯性视频| 91精品国产综合久久香蕉最新版| 久久成人免费视频| 亚洲二区中文字幕| 国精产品一区一区三区有限在线| 欧美激情视频免费观看| 日本精品久久久| 成人精品网站在线观看| 日本久久久a级免费| 亚洲电影中文字幕| 日韩免费中文字幕| 亚洲欧洲一区二区三区久久| 国产成一区二区| 日韩精品免费在线播放| 亚洲久久久久久久久久久| 欧美激情视频免费观看| 日韩在线观看免费网站| 国产精品96久久久久久又黄又硬| 久久夜精品va视频免费观看| 91国产视频在线播放| 亚洲91精品在线| 亚洲国产欧美自拍| 夜夜躁日日躁狠狠久久88av| 亚洲性生活视频在线观看| 精品偷拍各种wc美女嘘嘘| 日韩不卡中文字幕| 精品在线观看国产| 国产精品久久综合av爱欲tv| 中文字幕视频一区二区在线有码| 国产精品女主播视频| 亚洲无亚洲人成网站77777| 日韩av在线免费观看一区| 日韩av毛片网| 国产一区二区三区在线免费观看| 伊人久久久久久久久久久| 国产在线观看精品| 亚洲女人天堂网| 日韩av大片在线| 成人性生交大片免费观看嘿嘿视频| 国产欧美一区二区三区四区| 中文字幕欧美精品日韩中文字幕| 亚洲国产精彩中文乱码av在线播放| 亚洲成人av在线播放| 国产亚洲精品久久久久久| 亚洲福利在线视频| 久久久久这里只有精品| 国内精品久久久久久久| 亚洲一区二区中文字幕| 国产成人精品在线| 欧美色另类天堂2015| 欧美电影院免费观看| 国产91在线播放精品91| 日韩国产精品亚洲а∨天堂免| 奇米成人av国产一区二区三区| 亚洲精品综合久久中文字幕| 中文字幕亚洲天堂| 91最新在线免费观看| 色婷婷综合久久久久中文字幕1| 成人性教育视频在线观看| 久久免费国产视频| 国内揄拍国内精品少妇国语| 91久久久久久久久| 欧美亚洲视频在线观看| 中文字幕国产亚洲2019| 在线观看视频99| 久久久国产视频91| 91亚洲人电影| 欧美激情欧美激情在线五月| 国产亚洲精品久久久久久| 国产日韩欧美夫妻视频在线观看| 亚洲精品视频中文字幕| 久久久久久久久久久av| 欧美激情videos| 欧美成在线观看| 亚洲成人黄色在线观看| 久久久久久久久久婷婷| 久久资源免费视频| 98午夜经典影视| 成人h视频在线观看播放| 91av视频在线观看| 欧美成人免费大片| 日韩欧美综合在线视频| 主播福利视频一区| 全亚洲最色的网站在线观看| 欧美成人午夜激情视频| 国产精品美女在线| 中文字幕成人精品久久不卡| 欧美亚洲另类激情另类| 国内精品久久久久久| 久久99国产精品久久久久久久久| 一本一本久久a久久精品牛牛影视| 国产国语videosex另类| 庆余年2免费日韩剧观看大牛| 亚洲精品一区av在线播放| 久久久久久久久久国产精品| 久久久久久久国产精品| 日韩成人在线视频观看| 国产精品一区二区三区毛片淫片| 亚洲国产精品久久久久秋霞不卡| 免费成人高清视频| 亚洲午夜精品久久久久久久久久久久| 国模视频一区二区| 亚洲精品国产suv| 久久天天躁夜夜躁狠狠躁2022| 欧美成人精品在线| 国产女同一区二区| 亚洲一区二区在线| 久久亚洲精品一区| 92裸体在线视频网站| 中文字幕精品www乱入免费视频| 91精品国产91久久久久久吃药| 国产一区二区三区在线看| 国产视频观看一区| 国产亚洲a∨片在线观看| 成人国产精品久久久久久亚洲| 91欧美视频网站| 亚洲japanese制服美女| 日本三级久久久| 久久国产精品久久精品| 不卡av电影在线观看| 亚洲人成电影在线观看天堂色| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩在线视频网站| 欧美夫妻性视频| 亚洲国产精品va在线看黑人| 久久男人av资源网站| 日韩欧美主播在线| 国产91色在线免费| 韩国精品美女www爽爽爽视频| 国产精品久久久久aaaa九色| 精品国产一区二区三区四区在线观看| 亚洲欧美综合另类中字| 丝袜亚洲欧美日韩综合| 国产精品精品久久久久久| 精品国内产的精品视频在线观看| 国产欧美日韩综合精品| 亚洲美女av在线播放| 国产成人亚洲综合91精品| 国产欧美一区二区白浆黑人| 91免费国产视频| 国产精品欧美日韩久久| 亚洲国产日韩欧美综合久久| 久久777国产线看观看精品| 欧美一区二区三区免费观看| 欧美黄色成人网| 欧美大片在线看| 亚洲成人久久一区| 日本一区二区在线播放| 性色av一区二区三区红粉影视| 欧美一区二区三区艳史| 欧美日韩国产成人高清视频| 国产精品极品美女在线观看免费| 亚洲欧美精品一区| 91老司机在线| 国精产品一区一区三区有限在线| 黄色成人av网| 91精品国产高清久久久久久久久| 欧洲日本亚洲国产区| 欧美乱人伦中文字幕在线| 最新的欧美黄色|