【问题标题】:MaxConnectionsPerHost vs MaxRequestsPerConnection Cassandra driverMaxConnectionsPerHost 与 MaxRequestsPerConnection Cassandra 驱动程序
【发布时间】:2018-06-29 16:26:48
【问题描述】:

我正在为 C* 处理大量查询集。我已经用

限制了异步查询执行器
Semaphore maxInFlight = new Semaphore(MAX_REQUEST_PER_CON_REMOTE);
...
maxInFlight.acquireUninterruptibly();
ResultSetFuture future = executeAsync(...);
Futures.addCallback(future, new FutureCallback<ResultSet>() {
     @Override
     public void onSuccess(ResultSet rs) {
     ...
     maxInFlight.release();
     }

     @Override
     public void onFailure(Throwable t) {
     ...
     maxInFlight.release();
     }, executor);

其中 MAX_REQUEST_PER_CON_REMOTE 是 MaxRequestsPerConnection 参数。 MaxConnectionsPerHos 默认等于 1,我没有更改。

我相信,随着节点数量的增加或复制因子的增加,我可以增加 MaxConnectionsPerHos 或 MaxRequestsPerConnection 以提高生产力。 增加一个或另一个有什么好处吗?

然后我想更改信号量许可的依赖关系,但实际上不知道如何。这个想法是在添加或删除 Host 时添加侦听器并更新 maxInFlight。

【问题讨论】:

    标签: java performance cassandra bigdata datastax-java-driver


    【解决方案1】:

    如果您不使用白名单或黑名单策略,则驱动程序将分别连接到每个主机(当然取决于配置,如果您使用的是 DC Aware 策略)。因此,当您添加新节点时,驱动程序将添加到该节点的新连接,并且负载将被重新分配(如果您的查询没有“热”分区)。如果你增加复制因子,那么它也没有多大关系,因为向副本发送请求将不是由驱动程序完成,而是由“协调器”节点完成......

    因此,当您在本地 DC 中有 N 个节点时,理论上您可以发送最多 N * MaxInFlighConnections 个请求(但这取决于您的请求中数据的分布情况)。

    另外,我看到您正在使用MAX_REQUEST_PER_CON_REMOTE - 最好只向本地 DC 的节点发送请求。您还可以为每个连接配置多达 32k 个请求,在大多数情况下,这对于一个执行请求的客户端来说绰绰有余。

    您可以在Driver's documentation找到更多信息。

    附:我有一个separate class,它使用与 Semaphore 相同的方法,但会自动添加侦听器 - 随意抓住它。

    【讨论】:

    • 嗨,亚历克斯。感谢您的回答。在您在 github 上的代码中,我看到您也通过常量限制了请求的数量,但是,例如,如果一台主机出现故障或者可能添加了新主机,它不会改变。我相信有一种方法可以使其动态变化,具体取决于活动主机的数量或响应时间或其他。但实际上,我只是不知道它是否会提高性能。
    • 自动执行此操作确实是一个更大的问题,因为我们需要限制每个连接到特定主机的请求数量,这取决于集群中的数据分布和您的查询 - 它可以是某些分区范围会比其他分区范围获得更多的请求。在这种情况下,具有全局限制也会导致 BusyPoolException...我与开发人员讨论过 - 他们可能在 Java 驱动程序的下一个主要版本中实现比我的代码更复杂的东西
    猜你喜欢
    • 2015-10-25
    • 2014-09-15
    • 2017-11-15
    • 2021-02-09
    • 2016-08-04
    • 2016-02-27
    • 2017-01-20
    • 2015-04-12
    • 2017-11-26
    相关资源
    最近更新 更多