2014-07-10 2 views
1

ehcache 노드 중 하나가 실수로 127.0.0.1에 연결하려고 시도하는 이유를 이해할 수 있습니까?하나의 ehcache 노드가 실수로 127.0.0.1에 연결하려고 시도했습니다.

나는 ehcache 2.8.3을 사용하고 있습니다. 내 노드 중 하나가 NAT 모드의 VMWare에서 실행 중입니다. 따라서 호스트 컴퓨터에는 192.168.10.1 (Windows 7)이고 VMWare에있는 호스트 컴퓨터는 192.168.10.128 (CentOS 6)입니다.

내가 192.168.10.1에으로 Ehcache의 설정을 192.168.10.128에서

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
           properties="peerDiscovery=manual, rmiUrls=//192.168.10.128:51000/myCache1|//192.168.10.1:51000/myCache1"/> 

<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
           properties="hostName=0.0.0.0,port=51000,socketTimeoutMillis=2000"/> 

<diskStore path="java.io.tmpdir"/> 

<defaultCache 
     maxEntriesLocalHeap="10000" 
     eternal="false" 
     timeToIdleSeconds="120" 
     timeToLiveSeconds="120" 
     diskSpoolBufferSizeMB="30" 
     maxEntriesLocalDisk="10000000" 
     diskExpiryThreadIntervalSeconds="120" 
     memoryStoreEvictionPolicy="LRU" 
     statistics="false"> 
    <persistence strategy="localTempSwap"/> 
</defaultCache> 

<cache name="myCache1" 
     maxEntriesLocalHeap="10000" 
     maxEntriesLocalDisk="10000" 
     eternal="false" 
     diskSpoolBufferSizeMB="20" 
     timeToIdleSeconds="300" 
     timeToLiveSeconds="600" 
     memoryStoreEvictionPolicy="LFU" 
     transactionalMode="off"> 
    <persistence strategy="localTempSwap"/> 

    <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> 
</cache> 

메시지를 다음 한 성공적으로 전달받을. 그러나 반대 방향은 효과가 없습니다. 나는 왜 내가이 설정 파일에 어디하지 않으면 127.0.0.1에 연결을 시도

2014-07-11 02:02:19.260 +0400 DEBUG Lookup URL //192.168.10.128:51000/myCache1 
2014-07-11 02:02:20.262 +0400 DEBUG Lookup URL //192.168.10.1:51000/myCache1 
2014-07-11 02:02:21.264 +0400 WARN Unable to send message to remote peer. Message was: Connection refused to host: 127.0.0.1; nested exception is: 
     java.net.ConnectException: Connection refused: connect 
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
     java.net.ConnectException: Connection refused: connect 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) ~[na:1.7.0_60] 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) ~[na:1.7.0_60] 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) ~[na:1.7.0_60] 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129) ~[na:1.7.0_60] 
     at net.sf.ehcache.distribution.RMICachePeer_Stub.send(Unknown Source) ~[services.jar:1.1] 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue(RMIAsynchronousCacheReplicator.java:314) [services.jar:1.1] 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.replicationThreadMain(RMIAsynchronousCacheReplicator.java:127) [services.jar:1.1] 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.access$000(RMIAsynchronousCacheReplicator.java:58) [services.jar:1.1] 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator$ReplicationThread.run(RMIAsynchronousCacheReplicator.java:389) [services.jar:1.1] 
Caused by: java.net.ConnectException: Connection refused: connect 
     at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[na:1.7.0_60] 
     at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) ~[na:1.7.0_60] 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[na:1.7.0_60] 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[na:1.7.0_60] 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[na:1.7.0_60] 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.7.0_60] 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.7.0_60] 
     at java.net.Socket.connect(Socket.java:579) ~[na:1.7.0_60] 
     at java.net.Socket.connect(Socket.java:528) ~[na:1.7.0_60] 
     at java.net.Socket.<init>(Socket.java:425) ~[na:1.7.0_60] 
     at java.net.Socket.<init>(Socket.java:208) ~[na:1.7.0_60] 
     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) ~[na:1.7.0_60] 
     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147) ~[na:1.7.0_60] 
     at net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory.createSocket(ConfigurableRMIClientSocketFactory.java:71) ~[services.jar:1.1] 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) ~[na:1.7.0_60] 
     ... 8 common frames omitted 

192.168.10.1에 로그에 오류를 다음 얻을?

192.168.10.128:51000에서 192.168.10.1로 텔넷 할 수 있습니다.

는 또한 bootstraping 수 있도록 노력하고

2014-07-11 02:35:30.515 +0400 DEBUG cache peers: [RMICachePeer_Stub[UnicastRef2 [liveRef: [endpoint:[127.0.0.1:18405,[email protected]d0](remote),objID:[-43892557:1472247d06b:-7fff, -5287536613776006259]]]]] 
2014-07-11 02:35:30.516 +0400 DEBUG Bootstrapping myCache1 from RMICachePeer_Stub[UnicastRef2 [liveRef: [endpoint:[127.0.0.1:18405,[email protected]d0](remote),objID:[-43892557:1472247d06b:-7fff, -5287536613776006259]]]] 

은 왜 내가 127.0.0.1:18405에 피어 있다고 생각 않습니다 다음 로그 메시지보기 시작?

답변

3

JDK 및 ehcache 소스 코드에서 수 시간 동안 디버깅을 한 후에 알아 냈습니다.

잘못된 핵심 가정은 오류가있는 Windows 노드에 문제가 있다는 것입니다. 그것은 잘못된 주소를 공급하는 리눅스 노드였습니다.

공식으로 Ehcache 자주 묻는 질문 says :

이것은 우분투/데비안 리눅스 기본 네트워크 구성에 대한 2008 년의 변화에 ​​의해 발생합니다. 본질적으로 Java 호출 InetAddress.getLocalHost(); 항상 루프 백 주소를 반환합니다. 은 127.0.0.1입니다. 왜? 이러한 최근의 배포판에서 $ 호스트 이름의 시스템 호출은 항상 루프백 장치에 매핑 된 주소 인 을 반환하며 이로 인해 Ehcache의 RMI 피어 생성 논리가 항상 루프백 주소를 할당하게되어 사용자가보고있는 오류가 발생합니다. 해야 할 일은 네트워크 설정을 열어서 호스트의 호스트가 네트워크상의 다른 피어가 액세스 할 수있는 유효한 네트워크 주소를 반환하는지 확인하는 것입니다.

Linux 노드가 "127.0.0"이되었습니다.클래스의 방법에 따라 1 "에서 java.rmi.registry.LocateRegistry

public static Registry getRegistry(String host, int port, RMIClientSocketFactory csf) throws RemoteException 
{ 
    Registry registry = null; 

    if (port <= 0) 
     port = Registry.REGISTRY_PORT; 

    if (host == null || host.length() == 0) { 
     // If host is blank (as returned by "file:" URL in 1.0.2 used in 
     // java.rmi.Naming), try to convert to real local host name so 
     // that the RegistryImpl's checkAccess will not fail. 
     try { 
      host = java.net.InetAddress.getLocalHost().getHostAddress(); 
     } catch (Exception e) { 
      // If that failed, at least try "" (localhost) anyway... 
      host = ""; 
     } 
    } 

    LiveRef liveRef = new LiveRef(new ObjID(ObjID.REGISTRY_ID), new TCPEndpoint(host, port, csf, null), false); 
    RemoteRef ref = (csf == null) ? new UnicastRef(liveRef) : new UnicastRef2(liveRef); 

    return (Registry) Util.createProxy(RegistryImpl.class, ref, false); 
} 

내 Windows 노드가이 lookupRemoteCachePeer

public final synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException { 
    List remoteCachePeers = new ArrayList(); 
    List staleList = new ArrayList(); 
    for (Iterator iterator = peerUrls.keySet().iterator(); iterator.hasNext();) { 
     String rmiUrl = (String) iterator.next(); 
     String rmiUrlCacheName = extractCacheName(rmiUrl); 

     if (!rmiUrlCacheName.equals(cache.getName())) { 
      continue; 
     } 
     Date date = (Date) peerUrls.get(rmiUrl); 
     if (!stale(date)) { 
      CachePeer cachePeer = null; 
      try { 
       cachePeer = lookupRemoteCachePeer(rmiUrl); 
       remoteCachePeers.add(cachePeer); 
      } catch (Exception e) { 
       if (LOG.isDebugEnabled()) { 
        LOG.debug("Looking up rmiUrl " + rmiUrl + " through exception " + e.getMessage() 
          + ". This may be normal if a node has gone offline. Or it may indicate network connectivity" 
          + " difficulties", e); 
       } 
      } 
     } else { 
       LOG.debug("rmiUrl {} should never be stale for a manually configured cluster.", rmiUrl); 
      staleList.add(rmiUrl); 
     } 

    } 

    //Remove any stale remote peers. Must be done here to avoid concurrent modification exception. 
    for (int i = 0; i < staleList.size(); i++) { 
     String rmiUrl = (String) staleList.get(i); 
     peerUrls.remove(rmiUrl); 
    } 
    return remoteCachePeers; 
} 
테라코타에서

공식 통보도 보인다 hosts 파일을 수정하는 것입니다 호출 클래스 net.sf.ehcache.distribution.ManualRMICacheManagerPeerProvider의 다음과 같은 방법으로 수신 된 나는 Ops 팀이 내 서버의 명령 줄에 올바른 바인딩 주소를 제공하는 것이 더 쉬울 것이라고 결론 내렸다.

java -Djava.rmi.server.hostname=192.168.10.128 -jar services.jar 
+1

호스트 파일을 수정합니다. 실제 호스트 이름을 127.0.0.1로 매핑하는 것은 잘못된 것입니다. 나는 그것이 임시적인 수태라고 생각한다. – EJP

+0

내 호스트 파일은 다음과 같습니다 - 127.0.0.1 localhost.localdomain localhost 10.135.14.34 myhost.mydomain.com myhost. 10.135.14.34의 IP 주소는 유효하지만 여전히 오류가 발생합니다 - 어떤 아이디어입니까? – Damien

+0

나는이 행동을하고 있었고 연결하려고 시도한 주소는 공개적인 주소였습니다! 호스트 파일을 수정하는 것이 옳은 것처럼 보일 수도 있지만 서버가 무엇을 어떻게 호스트 이름을 해석하는지 알 수는 없습니다. 나는 그저 내 길을 어딘가에서 도메인을 얻는다고 추측하고 있으며 WAN 연결의 공용 IP가 아닌 해당 도메인 (당사 웹 사이트)의 공개 IP 주소로 확인되었습니다. – Alfabravo

관련 문제