【问题标题】:Cassandra doesn't wait for nodes to be availableCassandra 不等待节点可用
【发布时间】:2021-03-19 01:50:48
【问题描述】:

我正在使用 java 的 datastax 驱动程序:

@Dao
public interface MyDao {
    @Insert
    CompletableFuture<Void> save(MyEntity entity);
    ...
}

public class MyDaoTests {
    
    @Test
    public void myTest() {
    ...
    List<CompletableFuture<Void>> futureList = myEntityList.parallelStream()
             .map((myEntity) -> meterDataMapper.myDao().save(myEntity))
             .collect(Collectors.toList());
    CompletableFuture.allOf(futureList.toArray(CompletableFuture[]::new)).join();
    ...
   }
}

当我执行测试时,我得到这个错误:
java.util.concurrent.CompletionException: com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query

有没有办法配置驱动程序/会话以等待可用节点?

更多信息:

  • 我的测试规模约为 2500000 个实体 (myEntityList)。
  • 同步插入工作正常,但速度太慢了。
  • 我想用datastax-java-driver mapper 解决这个问题,基于注释,尽可能简单。
  • 驱动版本:4.9.0

【问题讨论】:

标签: java cassandra datastax-java-driver


【解决方案1】:

当驱动程序将所有节点标记为关闭或无响应时,或者当接触点无效(在您的情况下不太可能)时,将返回 NoNodeAvailableException

这不是让驱动程序等待节点重新联机的情况。由于驱动程序认为所有节点都不可用,因此它甚至不会尝试连接到任何节点。

查看节点上的日志以获取有关它们为何无响应的线索。如果您看到长时间的 GC 暂停和/或删除读取/突变,则表明节点已超载。如果您正在运行负载测试,请考虑限制吞吐量,以免集群过载。干杯!

【讨论】:

  • 当我将并发查询限制为 255 时,它可以正常工作。如果我达到 256,这些异常会再次出现。我需要知道这个数字是从哪里来的,我想知道为什么客户端不自己节流。
  • 我创建了一个github project,它显示了这个问题。如果您设置 max-concurrent-requests = 1024 一切都很好。如果将其设置回 1025,则会出现 NoNodeAvailableExceptions。 (我用每个值测试了 5 次)。我也没有在日志中看到任何问题。 gc.log.0 显示“应用程序线程停止的总时间”最长为 0.1 秒。
猜你喜欢
  • 2019-12-10
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2021-07-14
  • 2021-03-09
相关资源
最近更新 更多