无法从主机连接到Cassandra

5

我使用Docker在我的MacBook Pro上配置了一个Cassandra节点,步骤如下:

VBoxManage modifyvm "default" --natpf1 "tcp-port7191,tcp,,7191,,7191"
VBoxManage modifyvm "default" --natpf1 "tcp-port7000,tcp,,7000,,7000"
VBoxManage modifyvm "default" --natpf1 "tcp-port7001,tcp,,7001,,7001"
VBoxManage modifyvm "default" --natpf1 "tcp-port9160,tcp,,7160,,7160"
VBoxManage modifyvm "default" --natpf1 "tcp-port9042,tcp,,9042,,9042"

重新启动机器

docker run --name c1 -v /Users/MyProjects/scripts/:/script -d cassandra:latest -p "7191:7191" -p "7000:7000" -p "7001:7001" -p "9160:9160" -p "9042:9042"

我可以轻松完成

docker exec -it c1 cqlsh

它说

Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.0.1 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.

现在我可以通过以下方式获取我的虚拟机的IP地址:
docker-machine env default

我可以看到IP地址为192.168.99.100

但是当我运行我的Java程序,使用上面的IP地址连接到相同的Cassandra实例时,出现错误。

    00:00:56.611 [cluster1-nio-worker-0] DEBUG com.datastax.driver.core.Connection - Connection[/192.168.99.100:9042-1, inFlight=0, closed=false] Error connecting to /192.168.99.100:9042 (Connection refused: /192.168.99.100:9042)
00:00:56.615 [cluster1-nio-worker-0] DEBUG com.datastax.driver.core.Host.STATES - Defuncting Connection[/192.168.99.100:9042-1, inFlight=0, closed=false] because: [/192.168.99.100] Cannot connect
00:00:56.616 [cluster1-nio-worker-0] DEBUG com.datastax.driver.core.Connection - Connection[/192.168.99.100:9042-1, inFlight=0, closed=true] closing connection
00:00:56.617 [cluster1-nio-worker-0] DEBUG com.datastax.driver.core.Host.STATES - [/192.168.99.100:9042] preventing new connections for the next 1000 ms
00:00:56.617 [cluster1-nio-worker-0] DEBUG com.datastax.driver.core.Host.STATES - [/192.168.99.100:9042] Connection[/192.168.99.100:9042-1, inFlight=0, closed=true] failed, remaining = 0
00:00:56.624 [run-main-0] DEBUG c.d.driver.core.ControlConnection - [Control connection] error on /192.168.99.100:9042 connection, no more host to try
com.datastax.driver.core.exceptions.TransportException: [/192.168.99.100] Cannot connect
    at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:157) ~[cassandra-driver-core-3.0.0.jar:na]
    at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:140) ~[cassandra-driver-core-3.0.0.jar:na]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:680) ~[netty-common-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:603) ~[netty-common-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:563) ~[netty-common-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:424) ~[netty-common-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:276) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:292) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:528) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) ~[netty-common-4.0.33.Final.jar:4.0.33.Final]
    at java.lang.Thread.run(Thread.java:745) ~[na:1.7.0_79]
Caused by: java.net.ConnectException: Connection refused: /192.168.99.100:9042
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_79]
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739) ~[na:1.7.0_79]
    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:224) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:289) ~[netty-transport-4.0.33.Final.jar:4.0.33.Final]
    ... 6 common frames omitted
00:00:56.625 [run-main-0] DEBUG com.datastax.driver.core.Cluster - Shutting down
[error] (run-main-0) java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
    at com.abhi.connector.CassandraConnector$class.$init$(CassandraConnector.scala:8)
    at com.abhi.models.Movies$.<init>(Movies.scala:25)
    at com.abhi.models.Movies$.<clinit>(Movies.scala)
    at com.abhi.MovieLensDataPreperation$$anonfun$storeInCassandra$1.apply(MovieLensDataPreperation.scala:55)
    at com.abhi.MovieLensDataPreperation$$anonfun$storeInCassandra$1.apply(MovieLensDataPreperation.scala:55)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at com.abhi.MovieLensDataPreperation$.storeInCassandra(MovieLensDataPreperation.scala:55)
    at com.abhi.MovieLensDataPreperation$.main(MovieLensDataPreperation.scala:51)
    at com.abhi.MovieLensDataPreperation.main(MovieLensDataPreperation.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /192.168.99.100:9042 (com.datastax.driver.core.exceptions.TransportException: [/192.168.99.100] Cannot connect))
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:231)
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:77)
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1414)
    at com.datastax.driver.core.Cluster.init(Cluster.java:162)
    at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:333)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:283)
    at com.abhi.connector.Connector$.<init>(CassandraConnector.scala:22)
    at com.abhi.connector.Connector$.<clinit>(CassandraConnector.scala)
    at com.abhi.connector.CassandraConnector$class.$init$(CassandraConnector.scala:8)
    at com.abhi.models.Movies$.<init>(Movies.scala:25)
    at com.abhi.models.Movies$.<clinit>(Movies.scala)
    at com.abhi.MovieLensDataPreperation$$anonfun$storeInCassandra$1.apply(MovieLensDataPreperation.scala:55)
    at com.abhi.MovieLensDataPreperation$$anonfun$storeInCassandra$1.apply(MovieLensDataPreperation.scala:55)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at com.abhi.MovieLensDataPreperation$.storeInCassandra(MovieLensDataPreperation.scala:55)
    at com.abhi.MovieLensDataPreperation$.main(MovieLensDataPreperation.scala:51)
    at com.abhi.MovieLensDataPreperation.main(MovieLensDataPreperation.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)

这是我配置Java连接的代码。
Cluster.builder()
  .addContactPoints("192.168.99.100").withPort(9042)
  .build()

编辑:我还用docker guest VM的IP地址替换了上面的IP地址...但这并没有解决问题。


Тѓеуџё cassandra.yaml СИГ rpc_address Тѕќ rpc_interface жЁЇуй«С║єтЊфС║Џтђ╝№╝Ъ - Ralf
rpc_address: 0.0.0.0 rpc_port: 9160 - Knows Not Much
当使用IP而不是“ localhost”时,您能否在Cassandra主机本身上连接cqlsh? - Ralf
无。MacBook-Pro-2:~$ docker exec -it c1 cqlsh 192.168.99.100 连接错误:('无法连接到任何服务器', {'192.168.99.100': 错误(111,"尝试连接[('192.168.99.100',9042)]。最后一个错误:连接被拒绝")}) - Knows Not Much
这可能是一个愚蠢的问题,但你确定IP地址正确吗?如果你配置了rpc_interface而不是rpc_address会怎样? - Ralf
1个回答

5

我使用CASSANDRA_BROADCAST_ADDRESS创建Docker容器,成功解决了问题。

这是我使用的命令:

docker run --name c1 -v /Users/MyProjects/scripts/:/script -d -p "7191:7191" 
-p "7000:7000" -p "7001:7001" -p "9160:9160" -p "9042:9042" -e 
CASSANDRA_BROADCAST_ADDRESS=192.168.99.100 cassandra:latest

创建了这样的容器之后,我可以使用以下代码从我的Scala应用程序连接:
  val keyspace: KeySpace = new KeySpace("foo")

  val cluster =
    Cluster.builder()
      .addContactPoint("192.168.99.100").withPort(9042)
      .build()

  cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(100000);
  val session: Session = cluster.connect(keyspace.name)

这节省了我很多时间。 - vinitius
请问您能否解释一下CASSANDRA_BROADCAST_ADDRESS环境变量是什么?为什么选择这个地址? - afe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接