2015-01-17 6 views
5

Sto sperimentando la funzionalità remota di akka per uno strumento che sto creando. In realtà, sono riuscito a far funzionare i sistemi principali e remoti nello stesso host con diverse porte. Si noti che i miei server remoti vengono eseguiti su un router, come spiegato in documenti akka.Instradamento remoto di Akka problema di configurazione nome host

Ora sto cercando di utilizzare diverse macchine virtuali azzurre per fare un esperimento migliore ma sto riscontrando alcuni problemi.

L'applicazione principale è la seguente configurazione (ho cambiato alcuni nomi per motivi di sicurezza):

akka.actor.deployment { 
    /querierActor/querierPool { 
    router = round-robin-pool 
    nr-of-instances = 12 
    target.nodes = [ 
     "akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 

    ] 
    } 
} 

// remote configuration. Use it for multiple machines calculation 
akka { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     maximum-frame-size = 100MiB 
     port = 2552 
     hostname = "0.0.0.0" 
    } 
    } 
} 

Mentre gli host remoti ha la seguente configurazione:

akka.actor.deployment { 
    /querierActor/querierPool { 
    router = balancing-pool 
    nr-of-instances = 15 
    } 
} 

akka { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     maximum-frame-size = 100MiB 
     hostname = "0.0.0.0" 
     port = 2560 
    } 
    } 
} 

Utilizzando questa configurazione, apparentemente server e host remoti sono in grado di comunicare ma l'host remoto inizia a registrare alcuni errori:

[ERROR] [01/17/2015 12:55:05.734] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-0/endpointWriter] dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:2560/]] arriving at [akka.tcp://[email protected]:2560] inbound addresses are [akka.tcp://[email protected]:2560] 

E dopo un po ', il server e l'host remoto iniziano a registrare errori e blocchi. Errore di

Server:

[WARN] [01/17/2015 12:21:05.658] [CRAWLER-LD-akka.remote.default-remote-dispatcher-7] [akka.tcp://[email protected]:2552/system/remote-watcher] Detected unreachable: [akka.tcp://[email protected]:2560] 
[WARN] [01/17/2015 12:21:05.664] [SYSTEM-akka.remote.default-remote-dispatcher-17] [Remoting] Association to [akka.tcp://[email protected]:2560] with unknown UID is reported as quarantined, but address cannot be quarantined without knowing the UID, gating instead for 5000 ms. 

(...) 

[INFO] [01/17/2015 12:21:05.712] [SYSTEM-akka.actor.default-dispatcher-6] [akka://SYSTEM/user/querierActor/querierPool] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://SYSTEM/user/querierActor/querierPool#-1217916605] to Actor[akka://SYSTEM/user/querierActor/querierPool#-1217916605] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

(...) 

errore remoto (linee simili più volte):

(...) 
[ERROR] [01/17/2015 14:21:16.371] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2/endpointWriter] dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:2560/]] arriving at [akka.tcp://[email protected]:2560] inbound addresses are [akka.tcp://[email protected]:2560] 
[ERROR] [01/17/2015 14:21:17.388] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2/endpointWriter] dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:2560/]] arriving at [akka.tcp://[email protected]:2560] inbound addresses are [akka.tcp://[email protected]:2560] 
[WARN] [01/17/2015 14:21:17.465] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2] Association with remote system [akka.tcp://[email protected]:2552] has failed, address is now gated for [5000] ms. Reason is: [Disassociated]. 
[INFO] [01/17/2015 14:21:17.467] [SYSTEM-akka.actor.default-dispatcher-21] [akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://SYSTEM/deadLetters] to Actor[akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3#-2070785548] was not delivered. [6] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
[INFO] [01/17/2015 14:21:17.468] [SYSTEM-akka.actor.default-dispatcher-21] [akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3] Message [akka.remote.transport.ActorTransportAdapter$DisassociateUnderlying] from Actor[akka://SYSTEM/deadLetters] to Actor[akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3#-2070785548] was not delivered. [7] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

(...) 

ho capito che il problema potrebbe essere nella configurazione hostname e ha cercato di mettere il nome host al server e host remoto. Ma, in questo caso, il sistema non carica nemmeno:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'FacadeMemory' defined in file [D:\data\development\git\semantic-web-crawler\crawlerld.core\target\classes\net\dovale\websemantics\linkedDataRecommender\facade\memory\FacadeMemory.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [facade.memory.FacadeMemory]: Constructor threw exception; nested exception is org.jboss.netty.channel.ChannelException: Failed to bind to: /remote-srv01.cloudapp.net:2560 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1077) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1022) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 
    at facade.memory.GUIMain.main(GUIMain.java:23) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [facade.memory.FacadeMemory]: Constructor threw exception; nested exception is org.jboss.netty.channel.ChannelException: Failed to bind to: /remote-srv01.cloudapp.net:2560 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1070) 
    ... 21 more 
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /remote-srv01.cloudapp.net:2560 
    at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272) 
    at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:393) 
    at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:389) 
    at scala.util.Success$$anonfun$map$1.apply(Try.scala:236) 
    at scala.util.Try$.apply(Try.scala:191) 
    at scala.util.Success.map(Try.scala:236) 
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) 
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) 
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) 
    at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) 
    at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58) 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:401) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
Caused by: java.net.BindException: Cannot assign requested address: bind 
    at sun.nio.ch.Net.bind0(Native Method) 
    at sun.nio.ch.Net.bind(Net.java:436) 
    at sun.nio.ch.Net.bind(Net.java:428) 
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214) 
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
    at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193) 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:372) 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:296) 
    at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Non so cosa sto facendo male. Ho cercato di trovare informazioni sul problema, ma qualsiasi cosa ho trovato è correlata al mio problema. Ho anche aperto le porte sulla configurazione di azzurro.

Come posso abilitare il mio server host a comunicare correttamente con i miei host remoti?

risposta

5

Sono stato in grado di risolvere il problema.

Dopo alcune ricerche infruttuose, ho dovuto provare alcune cose diverse. Sto facendo alcune supposizioni che potrebbero essere errate in quanto non ho trovato altre informazioni. Se stai leggendo questa risposta e trovi qualche errore, ti prego di farmelo sapere.

Il problema era che il framework (sun.nio.ch.Net.bind0 a quanto pare, ma non ho trovato molti documenti a riguardo) consente il seguente intervallo di ips: 0.0.0.0 (nel caso in cui si accettano connessioni da qualsiasi interfaccia di rete nella macchina), 127.0.0.0 (nel caso in cui si lavori solo con la richiesta locale - I guest) e l'indirizzo IP di qualsiasi interfaccia di rete del computer. In quest'ultimo caso, le richieste saranno consentite solo a questa specifica interfaccia.

Il problema è che la proprietà "hostname" viene anche utilizzata per indirizzare i nodi remoti di Akka. Voglio dire, quando il nodo host chiama un nodo remoto, usa questa informazione per identificare se il risultato deve essere inviato dopo aver finito. Inoltre, se si inserisce la proprietà nomehost con il valore 0.0.0.0 e si tenta di raggiungere questo nodo tramite il suo nome DNS (che non può essere associato a nessuna interfaccia di rete), avrà esito negativo. Devi identificare la macchina con lo stesso IP di una delle interfacce di rete.

Quindi, la mia messa a punto leggermente cambiata:

Per il nodo host, ho fatto questo cambiamento:

(...) 
akka.actor.deployment { 
    /sparqlQuerierMasterActor/sparqlQuerierPool { 
    router = round-robin-pool 
    nr-of-instances = 12 
    target.nodes = [ 
     "akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 

    ] 
    } 
} 
(...) 

XXX, YYY e ZZZ sono raggiungibili IP dei nodi remoti che sono anche registrati in una rete interfaccia.

La configurazione del nodo remoto modificato in:

(...) 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     maximum-frame-size = 100MiB 
     hostname = "YYY.YYY.YYY.YYY" 
     port = 2560 
    } 
    } 
(...) 

Non ho prove che posso mantenere la configurazione precedente 0.0.0.0. Forse è possibile.

Questa soluzione mi ha permesso di fare in modo che i nodi host e remoti comunichino perfettamente =)