
Ambiente
Anfitrión:
- Ubuntu 18.04 escritorio de 64 bits
- Código de Visual Studio + CassandraCSharpDriver
Invitado:
- Servidor Ubuntu 18.04 de 64 bits
- Java y Cassandra instalados
- Nodo único
- Replicación 1
- Consistencia 1
- Servicio Cassandra ejecutándose
- espacio de claves y tabla creada
- Datos ingresados en la tabla
- Red Virtual Box para invitados en Bridge.
El problema
Cuando ejecuto el código en la máquina host, aparece un error:
user@desktop:~/Desktop/vsc$ dotnet run
Unhandled exception. Cassandra.NoHostAvailableException: All hosts tried for query failed (tried 192.168.0.15:9042: SocketException 'No route to host')
at Cassandra.Connections.ControlConnection.Connect(Boolean isInitializing)
at Cassandra.Connections.ControlConnection.InitAsync()
at Cassandra.Tasks.TaskHelper.WaitToCompleteAsync(Task task, Int32 timeout)
at Cassandra.Cluster.Cassandra.SessionManagement.IInternalCluster.OnInitializeAsync()
at Cassandra.ClusterLifecycleManager.InitializeAsync()
at Cassandra.Cluster.Cassandra.SessionManagement.IInternalCluster.ConnectAsync[TSession](ISessionFactory`1 sessionFactory, String keyspace)
at Cassandra.Cluster.ConnectAsync(String keyspace)
at Cassandra.Tasks.TaskHelper.WaitToComplete(Task task, Int32 timeout)
at Cassandra.Tasks.TaskHelper.WaitToComplete[T](Task`1 task, Int32 timeout)
at Cassandra.Cluster.Connect(String keyspace)
at HelloWorld.Program.Main(String[] args) in /home/user/Desktop/vsc/Program.cs:line 15
user@desktop:~/Desktop/vsc$
lo que he probado
En una máquina con Windows donde la máquina ejecuta el código y Cassandra en el mismo host sin usar una máquina virtual, el código y la base de datos funcionan bien ya que el código se puede insertar y seleccionar desde la base de datos sin ningún problema.
Puedo hacer ping en ambas direcciones sin problemas y traceroute devuelve lo siguiente:
Básico:
user@desktop:~$ traceroute 192.168.0.15
traceroute to 192.168.0.15 (192.168.0.15), 30 hops max, 60 byte packets
1 node1 (192.168.0.15) 0.737 ms 0.694 ms 0.697 ms
user@desktop:~$
Con puerto:
user@desktop:~$ traceroute 192.168.0.15 -p 9042
traceroute to 192.168.0.15 (192.168.0.15), 30 hops max, 60 byte packets
1 node1 (192.168.0.15) 0.386 ms 0.388 ms 0.422 ms
user@desktop:~$
Abrió el número de puerto en la VM invitadaiptables -I INPUT 1 -p tcp --dport 9042 -j ACCEPT
Ahora aparece el siguiente mensaje de error:
user@desktop:~/Desktop/vsc$ dotnet run
Unhandled exception. Cassandra.NoHostAvailableException: All hosts tried for query failed (tried 192.168.0.15:9042: SocketException 'Connection refused')
at Cassandra.Connections.ControlConnection.Connect(Boolean isInitializing)
at Cassandra.Connections.ControlConnection.InitAsync()
at Cassandra.Tasks.TaskHelper.WaitToCompleteAsync(Task task, Int32 timeout)
at Cassandra.Cluster.Cassandra.SessionManagement.IInternalCluster.OnInitializeAsync()
at Cassandra.ClusterLifecycleManager.InitializeAsync()
at Cassandra.Cluster.Cassandra.SessionManagement.IInternalCluster.ConnectAsync[TSession](ISessionFactory`1 sessionFactory, String keyspace)
at Cassandra.Cluster.ConnectAsync(String keyspace)
at Cassandra.Tasks.TaskHelper.WaitToComplete(Task task, Int32 timeout)
at Cassandra.Tasks.TaskHelper.WaitToComplete[T](Task`1 task, Int32 timeout)
at Cassandra.Cluster.Connect(String keyspace)
at HelloWorld.Program.Main(String[] args) in /home/user/Desktop/vsc/Program.cs:line 15
user@desktop:~/Desktop/vsc$
Pregunta
¿Cómo configuro la VM invitada para poder obtener el código en la máquina host para conectarme a la base de datos de Cassandra? ¿Supongo que el problema ocurre porque la máquina virtual no está configurada correctamente?
Me conecto al servidor usando 192.168.0.15, pero internamente el servidor parece usar 127.0.0.1. ¿Necesito reenviar cualquier conexión entrante a 127.0.0.1? ¿Cómo verifico si ese es el caso y cómo reenvío el puerto si es necesario? Como cuando estaba probando el código en Windows donde el código y el servidor eran la misma máquina, me estaba conectando al puerto local 127.0.0.1.