java - 如何取消Cassandra的node发现吗?

查看:112
本文介绍了java - 如何取消Cassandra的node发现吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我用docker在本地部署了单节点的Cassandra,只暴露了9160端口,但是我启动Java客户端时除了连接上127.0.0.1:9160,程序还探测到172.18.0.5(这个地址是随记生成的,我进入到Cassandra的docker里面,用nodetool status可以看到这个地址)。

  • docker中的Cassandra版本是 2.1.10

  • java程序中引用的Cassandra包的版本是2.1.0

异常:

 m.p.cassandra.connection.NodeDiscovery   : Found a node we don't know about 172.18.0.5(172.18.0.5):9160 for TokenRange TokenRange(start_token:2797529887040935278, end_token:2862413517619411597, endpoints:[172.18.0.5], rpc_endpoints:[172.18.0.5], endpoint_details:[EndpointDetails(host:172.18.0.5, datacenter:datacenter1, rack:rack1)])
m.p.c.connection.HConnectionManager      : Transport exception host to HConnectionManager: 172.18.0.5(172.18.0.5):9160

me.prettyprint.hector.api.exceptions.HectorTransportException: Unable to open transport to 172.18.0.5(172.18.0.5):9160 , java.net.SocketTimeoutException: connect timed out
    at me.prettyprint.cassandra.connection.client.HThriftClient.open(HThriftClient.java:185)
    at me.prettyprint.cassandra.connection.client.HThriftClient.open(HThriftClient.java:40)
    at me.prettyprint.cassandra.connection.ConcurrentHClientPool.createClient(ConcurrentHClientPool.java:179)
    at me.prettyprint.cassandra.connection.ConcurrentHClientPool.<init>(ConcurrentHClientPool.java:61)
    at me.prettyprint.cassandra.connection.LatencyAwareHClientPool.<init>(LatencyAwareHClientPool.java:27)
    at me.prettyprint.cassandra.connection.DynamicLoadBalancingPolicy.createConnection(DynamicLoadBalancingPolicy.java:124)
    at me.prettyprint.cassandra.connection.HConnectionManager.addCassandraHost(HConnectionManager.java:95)
    at me.prettyprint.cassandra.connection.NodeDiscovery.doAddNodes(NodeDiscovery.java:49)
    at me.prettyprint.cassandra.connection.NodeAutoDiscoverService.doAddNodes(NodeAutoDiscoverService.java:45)
    at me.prettyprint.cassandra.connection.NodeAutoDiscoverService$QueryRing.run(NodeAutoDiscoverService.java:51)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: connect timed out
    at org.apache.thrift.transport.TSocket.open(TSocket.java:185)
    at org.apache.thrift.transport.TFramedTransport.open(TFramedTransport.java:81)
    at me.prettyprint.cassandra.connection.client.HThriftClient.open(HThriftClient.java:179)
    ... 16 common frames omitted
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    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 org.apache.thrift.transport.TSocket.open(TSocket.java:180)
    ... 18 common frames omitted

解决方案

Cassandra的docker中那个随机生成的ip(172.18.0.5)映射的其实和它内部localhost是同一个node,但是从外部的host是只能访问localhost地址,而访问不到那个随机生成的ip(172.18.0.5)地址的,因为localhost地址是做了映射的,那个随机生成的ip(172.18.0.5)地址是没有做映射。

所以,我就想如何让外部的host可以访问那个随机生成的ip(172.18.0.5),我想了一会儿之后,发现这样比较麻烦,得每次启动Cassandra的docker之后,手动去改外部的hosts文件。

然后,我想可不可以不随机生成ip(172.18.0.5),我就找到了Cassandra的CASSANDRA_LISTEN_ADDRESS这个环境变量,dockerhub上的解释如下:

This variable is for controlling which IP address to listen for incoming connections on. The default value is auto, which will set the listen_address option in cassandra.yaml to the IP address of the container as it starts. This default should work in most use cases.

大概意思就是不设置CASSANDRA_LISTEN_ADDRESS变量,就会随机生成ip(172.18.0.5)。

于是,我就设置了这个CASSANDRA_LISTEN_ADDRESS变量的值为localhost,然后运行程序也没有报上面的那个错误了。

这篇关于java - 如何取消Cassandra的node发现吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆