terracotta和jetty7.5集羣實現session共享

   近段時間一直在做jetty集羣的session共享,剛開始想使用memcache,跟同事討論之後決定採用性能更好的terracotta,但誰也沒有做過,且中文文檔少得可憐,且僅有的幾個中文文檔都是關於jetty6.1.5terracotta的,而jetty7jetty6差別蠻大的,但其實配置差不多的,接連配置下來,還是遇到好些問題。

架構:LVS+Jetty7.5+terracotta+nagios+mysql集羣來進行的,體系結構就不多說了,網上很多的,本文就在於Jetty7.5+terracotta部分。

 terracotta分爲server端和client端,具體的可以看官方文檔的體系結構介紹:

server端:運行terracotta軟件

client端:和webapp一起運行在應用服務器上,也就是和jetty7容器一起運行

準備工作:

下載terracotta3.7http://www.terracotta.org/ 

 server端安裝:

在其中一臺服務器(我這裏使用的centos5.5)上操作:

1、解壓tar包到/usr/loca/terracotta下(這個目錄是我事先建立好的)。

2、進入該目錄下:(這個目錄官方文檔上叫做‘<terracotta>’)

cd /usr/local/terracotta/terracotta-3.7.0/

3、修改該目錄下的config-samples目錄下的tc-config.xml文件(默認沒有這個文件,只有一個包含全部配置項目的sample文件,將該文件複製後修改爲這個名字就可以了)

(具體這個文件中的配置是什麼意思請看我博客中的另外一篇,詳細講述了配置項的功能和含義):

<?xml version="1.0" encoding="UTF-8" ?>

<tc:tc-config xmlns:tc="http://www.terracotta.org/config"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-6.xsd">

  <tc-properties>

    <property name="l2.nha.dirtydb.autoDelete" value="true"/>

    <property name="l1.cachemanager.enabled" value="true"/>

    <property name="logging.maxLogFileSize" value="1024"/>

  </tc-properties>

  <system>

    <configuration-model>development</configuration-model>

  </system>

  <servers>

    <server host="terracotta" name="my_server" bind="192.168.0.182">

      <data>/opt/terracotta/server-data</data>

      <logs>/opt/terracotta/server-logs</logs>

    </server>

  </servers>

  <clients>

    <logs>logs-%i</logs>

  </clients>

</tc:tc-config>

注意serverhost屬性,可以直接配置爲IP,如果配置爲其他名稱,比如terracotta,則在客戶端的/etc/hosts文件中要配置解析對象:192.168.0.182  terracotta  才行,要不然會報無法解析域名的錯誤。logs-%i直接修改爲logs-182,這個%i代表本機的IP地址

4、server端就配置完了,是最簡單的配置,如需添加其餘的配置只需要按照我的另外一篇博客的說明添加就好了,但還是要注意你自己業務或性能需求。

client端:

client端的配置也很簡單,只需要在web.xml文件中添加一個過濾器就可以了:

        <filter>

         <filter-name>terracotta</filter-name>

         <filter-class>org.terracotta.session.TerracottaJetty74xSessionFilter</filter-class>

         <init-param>

           <param-name>tcConfigUrl</param-name>

           <param-value>192.168.0.182:9510</param-value>

         </init-param>

        </filter>

        <filter-mapping>

         <filter-name>terracotta</filter-name>

         <url-pattern>/*</url-pattern>

         <!-- Enable all available dispatchers. -->

         <dispatcher>ERROR</dispatcher>

         <dispatcher>INCLUDE</dispatcher>

         <dispatcher>FORWARD</dispatcher>

         <dispatcher>REQUEST</dispatcher>

        </filter-mapping>

 就是這個TerracottaJetty74xSessionFilter過濾器,這個過濾器是terracotta提供的,所以還需要terracottajar包支持:terracotta-session-1.3.0.jarterracotta-toolkit-1.6-runtime-5.0.0.jar

   tcConfigUrl指的就是這個客戶端要去那個URLserver所在地)下載配置文件來對客戶端進行配置(r如果有多個server--就是所謂的terracotta集羣,則需要使用都好進行分隔),這就保證了不論有多少客戶端,配置都是一樣的,端口9510是默認的,如果要修改,那麼在server端的tc-config.xml文件中也需要修改。

配置完了,就可以啓動了,注意,先啓動terracotta server端:(通過-f參數來指定我們自己的配置文件)

  ./start-tc-server.sh -f ../config-samples/tc-config.xml 

等啓動完成了:

 Terracotta Server instance has started up as ACTIVE node on 192.168.0.182:9510 successfully, and is now ready for work

就可以分別啓動客戶端了--也就是啓動jetty服務器。顯示下文後表示連接成功:

2012-09-27 11:43:05,209 INFO - Terracotta 3.7.0, as of 20120717-133013 (Revision unknown-20453 by [email protected] from 3.7.0)

2012-09-27 11:43:35,443 INFO - Successfully loaded base configuration from server at '192.168.0.182:9510'.

2012-09-27 11:43:35,619 INFO - Successfully loaded base configuration from file at '/tmp/tc-config2732927072243054676.xml'.

2012-09-27 11:43:35,744 INFO - Log file: '/usr/local/jetty/jetty-distribution-7.6.5.v20120716/logs-192.168.0.166/terracotta-client.log'.

2012-09-27 11:43:51,771 INFO - Connection successfully established to server at 192.168.0.182:9510

2012-09-27 11:43:59.139:INFO:oejs.TransparentProxy:TransparentProxy @ /test_chat/javadoc-proxy to http://download.eclipse.org/jetty/stable-7/apidocs

2012-09-27 11:43:59.492:INFO:oejdp.ScanningAppProvider:Deployment monitor /usr/local/jetty/jetty-distribution-7.6.5.v20120716/contexts at interval 1

2012-09-27 11:43:59.527:INFO:oejd.DeploymentManager:Deployable added: /usr/local/jetty/jetty-distribution-7.6.5.v20120716/contexts/javadoc.xml

2012-09-27 11:43:59.997:INFO:oejsh.ContextHandler:started o.e.j.s.h.ContextHandler{/javadoc,file:/usr/local/jetty/jetty-distribution-7.6.5.v20120716/javadoc/}

2012-09-27 11:44:00.091:INFO:oejs.AbstractConnector:Started [email protected]:8080

測試部分:

接下來我們就要進行測試了,到底能不能session複製成功呢?我們採用jetty7自帶的session測試來進行測試:

1、在瀏覽器中輸入:http://192.168.0.180:8080/test_chat/ 

   這個180是我集羣的VIP,內網測試用。test_chat是我將自帶的test.war代碼修改了之後的項目,不修改也沒有影響

 

2、點擊session就會出現新建session的按鈕:

 

        3、我們新建一個sessionk,v

 

看到我們有了這個鍵值對:k,v,且sessionidIA91osG5iGTJ0W2jLto7.1 

還要注意這個Context,這個context管理器是terracotta提供的。

4、然後我們另外打開一個窗口,重複之前的操作,並重新設置k1,v1

 

5、然後刷新之前的那個窗口:爲了提醒讀者看兩個session不一樣,請看其中有一項Last所記錄的最後修改時間不相同,證明兩個session是同一個。

發現相同了:

 

測試完成,能夠實現session的共享。希望對讀者有幫助,如果發現有問題,不吝賜教,萬分感激!謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章