使用JGroups TCP實現EHCache的集群

ygp8 9年前發布 | 37K 次閱讀 JGroups 緩存組件

最近一個項目采用ehcache作為緩存技術,因為負載需要,使用兩臺服務器做負載均衡,所以需要做緩存的集群處理,綜合各方面因素,決定使用JGroups的方式,接下來是連續3天的折磨,今天終于搞定,把這個過程總結出來分享,希望類似需要的朋友別再重蹈我的曲折。


1、首先不要一上來就搜索如何配置,要把基礎環境搭好,這也是網上90%的類似文章中不涉及的。像 http://blog.csdn.net/kindy1022/article/details/6681299 這樣的文章才真正有用,但仍然不夠詳細。接下來是詳細內容:

(1)我使用nginx + tomcat7 + jdk7;

(2)ehcache版本為2.10,建議大家直接使用ehcache-2.10.jar而不要用ehcache-core-xxx.jar+ehcache-terracotta-xxx.jar;

(3)jgroups使用最新的jgroups-3.6.4FINAL.jar,這個容易被忽略,網上很少有人提到,因為有ehcahce-jgroupsreplication-xxx.jar,所以會以為這就夠了,關鍵啟動還不報錯。另外不必降版本;

(4)ehcache-jgroupsreplication-1.7.jar(就是查看這里面的源碼時,發現JGroupsCacheReceiver需要jgroups jar包的支持)

2、再說配置文件,這是網上傳訛最多的,一是不講版本,直接貼配置,二是配置本身也有錯誤。建議大家去jgroups和ehcache的官網上看相關的配置,注意是相關的配置,ehcache官網上給出的jgroups也不完整,也沒標版本。這里一定要注意。建議大家將jgroups的配置使用單獨的配置文件,這樣更合理一些。

(1)echache配置文件ehcache.xml,首先增加peerprovider

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
        properties="jgroups_tcp.xml" />


(2)為每一個需要同步的cache配置listener,當然asynchronousReplicationIntervalMillis不是必須的,默認是1000,bootstrapCacheLoaderFactory也可以不要

<cache name="mybatis_common" overflowToDisk="true" eternal="true"  
        timeToIdleSeconds="300" timeToLiveSeconds="600" maxElementsInMemory="10000"  
        maxElementsOnDisk="100" diskPersistent="true" diskExpiryThreadIntervalSeconds="300"  
        diskSpoolBufferSizeMB="50" memoryStoreEvictionPolicy="LRU">
          <cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
              properties="replicateAsynchronously=true, replicatePuts=true,
              replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true",
              asynchronousReplicationIntervalMillis=500/>
          <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory" 
              properties="bootstrapAsynchronously=false"/>
</cache>


(3)jgroups_tcp.xml如下:參考 http://www.jgroups.org/manual/index.html#_tcp

<TCP bind_port="7800" />
<TCPPING timeout="3000"
         initial_hosts="app1_IP[7800],app2_IP[7800]"
         port_range="10"
         num_initial_members="3"/>
<VERIFY_SUSPECT timeout="1500"  />
<pbcast.NAKACK2 use_mcast_xmit="false" gc_lag="100"
               retransmit_timeout="300,600,1200,2400,4800"
               discard_delivered_msgs="true"/>
<pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
               max_bytes="400000"/>
<pbcast.GMS print_local_addr="true" join_timeout="3000" shun="false"
               view_bundling="true"/>


到底是bind_port還是start_port,官網給出的是bind_port。

3、一般情況下,這樣就足夠了,但是事有例外,如果仍然不行,看看下面的可能性:

(1)集群的服務器能不能連通,有沒有防火墻之類

(2)每臺服務器是不是有完整的、唯一的hostname,如果你的hostname有中文,建議改成英文,如果你恰好使用mac電腦開發測試,那它的電腦名和hostname是兩回事,默認的hostname是localhost,這個不行,要改成正經的。

(3)現在的eclipse可以反編譯class文件,并且可以在class上打斷點debug,在ehcahce-jgroupsreplication-xxx.jar里找到listener類和JGroupsCacheReceiver,加上斷點,看發送和接收消息是否都被觸發。


Good Luck。

來自:http://my.oschina.net/u/866380/blog/501082

 本文由用戶 ygp8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!