2016-03-03 45 views
2

我想在ehcache上啓用2節點之間的項目之一的分佈式緩存,但我遇到了問題。 我使用的Ehcache核心2.6.11在Java Spring項目Ehcache - 無法獲得分佈式緩存工作

下面是每個服務器上的

節點我的Ehcache配置的相關部分1

​​

節點2

<cacheManagerPeerProviderFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties=" 
     peerDiscovery=manual, 
     rmiUrls=//node1.mydomain.com:40001/myCache1|//node1.mydomain.com:40001/myCache2"/> 

<cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="port=40002"/> 

當我更新緩存並期望它被複制 - 這裏有

03.03.2016 06:44:50 DEBUG [net.sf.ehcache.distribution.RMICacheManagerPeerProvider.lookupRemoteCachePeer():126] Lookup URL //node2.mydomain.com:40002/myCache1 
03.03.2016 06:44:50 WARN [net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue():325] Unable to send message to remote peer. Message was: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
java.rmi.ConnectException: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) 
     at net.sf.ehcache.distribution.RMICachePeer_Stub.send(Unknown Source) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue(RMIAsynchronousCacheReplicator.java:314) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.replicationThreadMain(RMIAsynchronousCacheReplicator.java:127) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.access$000(RMIAsynchronousCacheReplicator.java:58) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator$ReplicationThread.run(RMIAsynchronousCacheReplicator.java:389) 
Caused by: java.net.ConnectException: Connection refused 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at java.net.Socket.connect(Socket.java:538) 
     at java.net.Socket.<init>(Socket.java:434) 
     at java.net.Socket.<init>(Socket.java:211) 
     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) 
     at net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory.createSocket(ConfigurableRMIClientSocketFactory.java:70) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     ... 8 more 

節點2

03.03.2016 06:44:50 DEBUG [net.sf.ehcache.distribution.RMICacheManagerPeerProvider.lookupRemoteCachePeer():126] Lookup URL //node1.mydomain.com:40001/myCache1 
03.03.2016 06:44:50 WARN [net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue():325] Unable to send message to remote peer. Message was: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
java.rmi.ConnectException: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) 
     at net.sf.ehcache.distribution.RMICachePeer_Stub.send(Unknown Source) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue(RMIAsynchronousCacheReplicator.java:314) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.replicationThreadMain(RMIAsynchronousCacheReplicator.java:127) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.access$000(RMIAsynchronousCacheReplicator.java:58) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator$ReplicationThread.run(RMIAsynchronousCacheReplicator.java:389) 
Caused by: java.net.ConnectException: Connection refused 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at java.net.Socket.connect(Socket.java:538) 
     at java.net.Socket.<init>(Socket.java:434) 
     at java.net.Socket.<init>(Socket.java:211) 
     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) 
     at net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory.createSocket(ConfigurableRMIClientSocketFactory.java:70) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     ... 8 more 

UPDATE

我已經改變了錯誤,我得到我的節點

節點1

我的配置現在使用自動發現而不是手動。 我有四臺服務器,2在站點A和2在站點B 複製的現在工作作爲兩個節點,但是沒有複製是發生在站點B或站點A和站點B.

之間預期站點A我在每個節點和其他節點之間使用了netcat和telnet,並且接受了所有連接。

這裏是我的Ehcache配置爲自動發現的有關章節

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
           properties="peerDiscovery=automatic, 
              multicastGroupAddress=230.3.0.0, 
              multicastGroupPort=4700, 
              timeToLive=255"/> 

<cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="port=43000, 
       socketTimeoutMillis=20000"/> 

誰能提供任何深入瞭解如何複製不工作在站點B或我可以嘗試任何想法?

感謝

+0

你使用IPV4嗎?如果您使用IPV6,那麼在ehcache複製中可能會出現一些問題 –

+0

我們正在使用IPV4 – Damien

回答

2

請檢查下面的步驟來解決此問題

  1. 中添加監聽的主機名,如下。

    <cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="hostName=localhost,port=40001"/> 
    
  2. 檢查端口40002是否可以訪問,以便它可以從node1訪問。應該可以從節點1訪問手段node2.mydomain.com:40002。從控制檯,你可以使用telnet程序來檢查它。同樣,檢查node1是否可以從node2訪問。 (我相信這是造成問題的原因)

可選:您不需要在兩臺服務器中有不同的端口。它可以有相同的端口號40001

+0

我之前嘗試過hostname = localhost,但它在日誌中發出警告 - 該部分究竟做了什麼? – Damien

+1

如果端口40001在同一臺主機上打開(我的答案中的第2點),它不應該發出警告。這個警告必須是冰山一角。如果你解決它,你的問題必須解決 – Thanga

+0

我已經更新我的代碼(和問題)以使用自動發現,但不幸的是仍然有問題。我在所有節點之間嘗試過telent和netcat,並且連接已打開。任何想法,爲什麼,y複製目前只有一半的工作? – Damien

1

當我們收到一位網絡專家的建議時,我回到了手動發現的方法,即使用跨數據中心的多播技術打開了整個世界的痛苦。

對Thanga的建議使用手動方法已經工作