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

时间:2018-09-21 13:55:32

标签: spring-boot spring-data cassandra-3.0 spring-data-cassandra

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

原因:com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所有主机均失败(尝试:localhost / 0:0: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]无法连接),localhost / 127.0.0.1:9042(com.datastax.driver .core.exceptions.TransportException:[localhost / 127.0.0.1:9042]无法连接)) 在com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:232)〜[cassandra-driver-core-3.4.0.jar:na] 在com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)〜[cassandra-driver-core-3.4.0.jar:na] 在com.datastax.driver.core.Cluster $ Manager.negotiateProtocolVersionAndConnect(Cluster.java:1619)〜[cassandra-driver-core-3.4.0.jar:na] 在com.datastax.driver.core.Cluster $ Manager.init(Cluster.java:1537)〜[cassandra-driver-core-3.4.0.jar:na] 在com.datastax.driver.core.Cluster.init(Cluster.java:159)〜[cassandra-driver-core-3.4.0.jar:na]

1 个答案:

答案 0 :(得分:2)

通过default(在发生任何错误或缺少属性的情况下),它将尝试连接到本地主机,因为它被设置为DEFAULT_CONTACT_POINTS

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

至于调试:将接触点设置为here,如果选中它,将始终设置为default=localhost

在您的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进行排他。