Cassandra服务器出错:无法用任何种子闲聊

时间:2014-06-28 19:00:20

标签: cassandra cassandra-2.0

我将第二个节点添加到单节点cassandra集群,并在第二个节点上获取堆栈跟踪:

ERROR 18:13:42,841 Exception encountered during startup
java.lang.RuntimeException: Unable to gossip with any seeds
        at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1193)
        at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:446)
        at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:655)
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:611)
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:504)
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:378)
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:496)
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:585)
java.lang.RuntimeException: Unable to gossip with any seeds
        at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1193)
        at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:446)
        at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:655)
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:611)
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:504)
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:378)
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:496)
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:585)
Exception encountered during startup: Unable to gossip with any seeds
ERROR 18:13:42,885 Exception in thread Thread[StorageServiceShutdownHook,5,main]
java.lang.NullPointerException
        at org.apache.cassandra.gms.Gossiper.stop(Gossiper.java:1270)
        at org.apache.cassandra.service.StorageService$1.runMayThrow(StorageService.java:572)
        at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
        at java.lang.Thread.run(Thread.java:744)

同样的问题还有其他SO问题,但没有一个答案对我有用:

Apache Cassandra: Unable to gossip with any seeds

new cassandra node can't gossip with seed

Datastax Enterprise is crashing with Unable to gossip with any seeds error

我在两个节点上运行Cassandra 2.0.8和jdk 1.7.0_51。一个节点托管在DigitalOcean,另一个托管在Linode。我试过了 在cassandra-rackdc.properties中将它们配置为相同的数据中心和不同的数据中心,它没有 区别。我试过listen_address和broadcast_address空白和硬编码,没有任何区别。我确实限制了 密码套件列表,用于阻止大量有关丢失密码套件的日志消息。从库存cassandra.yaml,我改变了 以下条目,不包括与并发写入和压缩相关的条目。为了这个问题,无论在哪里 在配置中有一个硬编码的IP地址,我用它替换了那些。每个盒子都有防火墙,但我已经试过了 防火墙已禁用。我也尝试过使用' internode_encryption:none''结果是一样的。我使用过telnet 和netcat确认每个主机可以连接到另一个端口7000和7001。

在原始主持人身上:

- seeds: "<host1>"
listen_address:
broadcast_address:
endpoint_snitch: GossipingPropertyFileSnitch
internode_encryption: all
cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]

在新主持人身上:

- seeds: "<host1>"
listen_address:
broadcast_address:
endpoint_snitch: GossipingPropertyFileSnitch
internode_encryption: all
cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]

编辑:

另外,使用netstat我可以看到新服务器成功建立了与原始服务器端口7001的tcp连接。

编辑:

好的,第二天。我已在两台机器上升级到java 1.7.0_60。八卦现在适用于internode_encryption: none。我非常怀疑新结果与JDK的变化有关;它更可能与擦洗目录等中的一些疏忽有关。

我评论了每个配置文件中列出密码的行。 Gossip仍然以internode_encryption: all的方式失败。种子节点的日志是干净的,但是另一个节点重复记录Filtering out TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA as it isnt supported by the socket,直到八卦失败。我认为日志条目与失败有关。为什么一个记录这个而另一个没记录,我不知道。他们都是debian运行相同的jdk版本。

编辑:

在两个节点上安装JCE使得过滤警告消失。此时仍然没有加密的节点间通信。

编辑:

启用调试后,种子节点会记录:

DEBUG 22:44:57,409 Error reading the socket d862c40[SSL_NULL_WITH_NULL_NULL: Socket[addr=/10.128.139.94,port=60611,localport=7001]]
javax.net.ssl.SSLHandshakeException: no cipher suites in common

我已按照http://www.datastax.com/documentation/cassandra/2.0/cassandra/security/secureSSLCertificates_t.html?scroll=task_ds_c14_xjy_2k的说明仔细创建了两台服务器的证书。

1 个答案:

答案 0 :(得分:3)

现在正在使用未加密或加密的通信。在两台服务器上安装JCE扩展并更改证书生成后,加密通信开始工作。 preparing server certificates for Cassandra 2.0的数据存储区指令删除了Cassandra 1.2 instructions中存在的参数。包括参数似乎有所不同。附加参数是 -keyalg RSA

Seed server:
keytool -genkey -alias prod01 -keystore .keystore -keyalg RSA
keytool -export -alias prod01 -file prod01.cer -keystore .keystore -keyalg RSA

Other server:
keytool -genkey -alias prod00 -keystore .keystore -keyalg RSA
keytool -export -alias prod00 -file prod00.cer -keystore .keystore -keyalg RSA

然后,确保两个服务器都有两个证书,并使用它们在两个服务器上使用这些命令创建信任存储:

keytool -import -v -trustcacerts -alias prod00 -file prod00.cer -keystore .truststore
keytool -import -v -trustcacerts -alias prod01 -file prod01.cer -keystore .truststore
chmod go-rwx .keystore