【问题标题】:NoHostAvailableException: All host(s) tried for query failedNoHostAvailableException:所有主机尝试查询失败
【发布时间】:2019-02-25 22:57:38
【问题描述】:

当我连接一个单节点 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]

【问题讨论】:

  • 你能分享你的代码和配置吗?这将有助于发现任何可能的问题。
  • CONFIGURATION # 在这里设置数据库连接的配置 spring.data.cassandra.keyspace-name=guru_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=cassandra
  • 它在独立集群上运行良好,但在以上三个节点集群上运行良好......不知道出了什么问题?

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


【解决方案1】:

通过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进行排除。

【讨论】:

  • 非常感谢您的回复,但我正在删除记录,所以如果我使用一个节点,它会在那里写一致性检查它会失败。你用过 Apache Cassandra 开源驱动吗?
  • 请告诉我如何调试存储库,无法在 spring-data-cassandra 中获得初始化连接的位置?
  • 我更新了我的答案,因为它太长了,无法放入评论中。
  • 非常感谢,你说的对,它不是读取/加载 application.properties 即接触点..如何加载它,默认情况下 spring boot 加载它正确吗?
  • 在您的示例中,您需要更新 CassandraConfig 类以使用该属性而不是硬编码的默认值。请在我更新的答案中查看示例代码。
猜你喜欢
  • 2021-01-30
  • 1970-01-01
  • 2017-02-17
  • 2023-03-20
  • 2021-09-16
  • 2016-02-13
  • 2019-03-14
  • 2015-01-28
  • 2015-01-03
相关资源
最近更新 更多