手頭上的一個項目“陝西省專業技術人員繼續教育學習與管理平台”是服務于全陝西省130萬專技人員的高并發且事務邏輯較複雜的一個系統,不管是編碼上還是系統架構部署上都具有一定的挑戰性。在考慮了現有裝置以及系統負載的基礎上,整個系統架構采用了六台伺服器,分别是:WEB門戶伺服器(WEB門戶+Oracle資料庫)、學習管理平台伺服器、系統核心資料庫、資源下載下傳伺服器、線上點播伺服器、資料庫備份伺服器。
系統運作了數月,WEB門戶采用的apache+mod_jk+memcached+4tomcat能夠正常應付目前的通路。管理學習系統雖然由于一些線上課程還未上線,最大的并發還未開始,但目前課程檔案的上傳、人員的表單錄入等對伺服器的造成的負載經常使伺服器響應緩慢甚至不響應。考慮到開始采用的nginx+4tomcat+ip_hash,ip_hash本身政策的缺陷使負載不能很好地均衡,于是使用memcached做叢集的session共享。此時出現了一個到現在還讓我搞不清楚的現象:系統session中存入一些timestamp的Date對象,讀取的時候,竟然會讀成UNIX原始時間戳。一直沒辦法解決這個問題,隻能采用ip_hash的方式運作着,一旦出現伺服器不響應的情況就重新開機tomcat。
這幾天上網查資料的時候,發現terracotta可以做tomcat叢集的session共享,由于其是jvm級别的cluster解決方案且采用find-gained changes機制,是以在性能要優于memcached,關鍵是其是jvm堆級别的複制,儲存任何值都沒任何問題。按照官網的說明把所有東西都配置好了,卻發現session無法正常共享。寫了個測試的jsp,列印出session id,單獨通路某一個tomcat,發現id在不停的換,我一開始懷疑是terracotta沒安好的問題,就又重裝了一遍,問題依舊。這時突然發現在IE下session是正常的,其他浏覽器下session就不正常,總是不停地換,按說沒有關閉浏覽器是不會重新生成session的。使用fiddler來檢測請求和響應的header,發現一個奇怪的問題,chrome請求一個頁面時比使用IE時,多了一個對/favicon.ico的請求,而這個請求得到的響應(404)中會産生新的session id使session發生變化。(什麼原因,怎麼解釋?)在網站的根目錄下上傳一個favicon.ico即可解決此問題。為了證明是favicon.ico不存在造成的問題,我在頁面中請求了一個不存在的js檔案,結果session id又開始不停地變。把所有不存在的檔案的引用都删掉能夠解決此問題,但是在沒有使用terracotta前根本不存在此問題,我猜想是不是terraccota在檢測到404錯誤的時候,就會重新生成session的緣故啊。查了一下tomcat的文檔,發現context有個屬性sessionCookiePath,嘗試着把這個值設定為了”/“,結果一切正常了,即使再有404錯誤,session也不會再變了。這是為什麼?在文檔中對sessionCookiePath的解釋是:
不指定此值的時候,是使用的web app中的或者是直接使用context path。我猜測terracotta是接受了此值,但在處理404資源的時候,這個path無法識别,故以為是新的一個會話,造成session改變的緣故。
不管咋樣,暫且算是解決了此問題,原因也是猜測的。有空得看一下terracotta的源代碼,看看究竟是什麼原因造成的。
其實這個項目在部署運作中,出現過各種問題,是以也做過很多架構的變動。到目前還是不能讓人滿意,隻能在後續的維護中繼續改進了。
原文出處:後端技術雜談
<a href="http://www.rowkey.me/blog/2012/08/15/terracotta/" target="_blank">原文連結</a>
轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。