Spring boot NoHostAvailableException:尝试查询的所有主机均失败

Spring boot NoHostAvailableException:尝试查询的所有主机均失败,spring-boot,spring-data,cassandra-3.0,spring-data-cassandra,Spring Boot,Spring Data,Cassandra 3.0,Spring Data Cassandra,当我连接单个节点时,cassandra工作正常。当我连接一个三节点集群(10.20.12.20,10.20.12.21,10.20.12.22)时,它抛出以下错误。为什么它试图连接本地主机 Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/0:0:0:0:0:0:0:1:9042 (com.dat

当我连接单个节点时,cassandra工作正常。当我连接一个三节点集群(10.20.12.20,10.20.12.21,10.20.12.22)时,它抛出以下错误。为什么它试图连接本地主机

Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/0:0:0:0:0:0:0:1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/0:0:0:0:0:0:0:1:9042] Cannot connect), localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] Cannot connect))
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:232) ~[cassandra-driver-core-3.4.0.jar:na]
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79) ~[cassandra-driver-core-3.4.0.jar:na]
at com.datastax.driver.core.Cluster$Manager.negotiateProtocolVersionAndConnect(Cluster.java:1619) ~[cassandra-driver-core-3.4.0.jar:na]
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1537) ~[cassandra-driver-core-3.4.0.jar:na]
at com.datastax.driver.core.Cluster.init(Cluster.java:159) ~[cassandra-driver-core-3.4.0.jar:na]
通过(如果出现任何错误或缺少属性),它将尝试连接到本地主机,因为该主机设置为
DEFAULT\u CONTACT\u POINTS

您的语法是正确的,我猜想您的应用程序根本不会读取该属性。您可以尝试对其进行调试和验证

至于调试:触点已设置,如果您选中,它将始终设置为

在CassandraConfig中,除了覆盖
getKeyspaceName()
方法外,还需要覆盖
cluster()
cassandraMapping()
方法,以使其与所需设置一起工作。例如:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    public static final String KEYSPACE = "my_keyspace";
    // read contact points from config
    @Value("${spring.data.cassandra.contact-points}")
    private String contactPoints;


    @Override
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean bean = super.cluster();
        bean.setContactPoints(contactPoints);
        return bean;
    }
还有一个旁注:如果只添加一个接触点,您将获得预期的行为,因为驱动程序将查找所有可用的节点。实际上,如果您想限制与特定节点的通信,您需要实施
loadBalancingPolicy
以实现隔离。

通过(在出现任何错误或缺少属性的情况下),它将尝试连接到本地主机,因为这被设置为
默认\u联系人\u点

您的语法是正确的,我猜想您的应用程序根本不会读取该属性。您可以尝试对其进行调试和验证

至于调试:触点已设置,如果您选中,它将始终设置为

在CassandraConfig中,除了覆盖
getKeyspaceName()
方法外,还需要覆盖
cluster()
cassandraMapping()
方法,以使其与所需设置一起工作。例如:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    public static final String KEYSPACE = "my_keyspace";
    // read contact points from config
    @Value("${spring.data.cassandra.contact-points}")
    private String contactPoints;


    @Override
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean bean = super.cluster();
        bean.setContactPoints(contactPoints);
        return bean;
    }

还有一个旁注:如果只添加一个接触点,您将获得预期的行为,因为驱动程序将查找所有可用的节点。实际上,如果您想限制与特定节点的通信,您需要实现
loadBalancingPolicy
,以实现隔离。

您可以共享您的代码和配置吗?这将有助于发现任何可能的问题。配置#在此处设置数据库连接spring.data.cassandra.keyspace name=guru#u keyspace spring.data.cassandra.contact points=10.202.82.25,10.180.19.57,10.180.12.22 spring.data.cassandra.port=9042 spring.data.cassandra.username=cassandraCODE独立运行正常群集,但不包括上述三节点群集…不确定出了什么问题?您可以共享您的代码和配置吗?这将有助于发现任何可能的问题。配置#在此处设置数据库连接spring.data.cassandra.keyspace name=guru#u keyspace spring.data.cassandra.contact points=10.202.82.25,10.180.19.57,10.180.12.22 spring.data.cassandra.port=9042 spring.data.cassandra.username=cassandraCODE独立运行正常群集,但不包括上述三节点群集…不确定出了什么问题?非常感谢您的回复,但我正在删除记录,因此它将暂停写入一致性检查。如果我使用一个节点,它将失败。您使用过Apache Cassandra开源驱动程序吗?请告诉我如何调试存储库,无法在spring data Cassandra中初始化连接?我更新了我的答案,因为它太长,无法放入注释中。非常感谢,您所说的正确,它不是读取/加载应用程序属性,即触点。。如何加载它,默认情况下spring boot会正确加载它?在您的示例中,您需要更新CassandraConfig类以使用该属性,而不是硬编码的默认值。请参阅我更新的答案中的示例代码。非常感谢您的回复,但我正在删除记录,因此它将暂停写入一致性检查。如果我使用一个节点,它将失败。您使用过Apache Cassandra开源驱动程序吗?请告诉我如何调试存储库,无法在spring data Cassandra中初始化连接?我更新了我的答案,因为它太长,无法放入注释中。非常感谢,您所说的正确,它不是读取/加载应用程序属性,即触点。。如何加载它,默认情况下spring boot会正确加载它?在您的示例中,您需要更新CassandraConfig类以使用该属性,而不是硬编码的默认值。请参阅我更新答案中的示例代码。