当前位置: 首页 > 知识库问答 >
问题:

使用cqlsh执行删除时的Cassandra NoHostAvailableException

红鸿运
2023-03-14

我们有一个有7个节点的集群,我们使用datastax java驱动程序连接到集群。问题是我得到的是常量NoHostAvailableException,如下所示:

原因:com.datastax.driver.core.exceptions.noHostAvailableException:所有尝试查询的主机都失败了(尝试:/172.31.7.243:9042(com.datastax.driver.core.exceptions.driverException:试图获取可用连接时超时(您可能希望增加每个主机连接的驱动程序数)),/172.31.7.245:9042(com.datastax.driver.core.exceptions.driverException:试图获取可用连接时超时(您可能希望增加每个主机连接的驱动程序数),连接(您可能希望增加每台主机连接的驱动程序数)),/172.31.7.247:9042,/172.31.7.232:9042,/172.31.7.233:9042,/172.31.7.244:9042[仅显示前3台主机的错误,使用getErrors()了解详细信息])

所有节点都已启动:

UN  172.31.7.244  152.21 GB  256     14.5%  58abea69-e7ba-4e57-9609-24f3673a7e58  RAC1
UN  172.31.7.245  168.4 GB   256     14.5%  bc11b4f0-cf96-4ca5-9a3e-33cc2b92a752  RAC1
UN  172.31.7.246  177.71 GB  256     13.7%  8dc7bb3d-38f7-49b9-b8db-a622cc80346c  RAC1
UN  172.31.7.247  158.57 GB  256     14.1%  94022081-a563-4042-81ab-75ffe4d13194  RAC1
UN  172.31.7.243  176.83 GB  256     14.6%  0dda3410-db58-42f2-9351-068bdf68f530  RAC1
UN  172.31.7.233  159 GB     256     13.6%  01e013fb-2f57-44fb-b3c5-fd89d705bfdd  RAC1
UN  172.31.7.232  166.05 GB  256     15.0%  4d009603-faa9-4add-b3a2-fe24ec16a7c1  RAC1

但是其中两个节点的cpu负载很高,尤其是232节点,因为我在该节点中使用cqlsh运行了大量删除操作。

我知道删除会产生墓碑,但在集群中有7个节点,我不认为所有主机都不可访问是正常的。

com.datastax.driver.core.Cluster cluster = null;
        //Get contact points
        String[] contactPoints=this.environment.getRequiredProperty(CASSANDRA_CLUSTER_URL).split(",");
        cluster = com.datastax.driver.core.Cluster.builder()
            .addContactPoints(contactPoints))
            .withCredentials(this.environment.getRequiredProperty(CASSANDRA_CLUSTER_USERNAME), 
                this.environment.getRequiredProperty(CASSANDRA_CLUSTER_PASSWORD))
                .withQueryOptions(new QueryOptions()
                .setConsistencyLevel(ConsistencyLevel.QUORUM))
                .withLoadBalancingPolicy(new TokenAwarePolicy(new RoundRobinPolicy()))
                .withRetryPolicy(new LoggingRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE))
                .withPort(Integer.parseInt(this.environment.getRequiredProperty(CASSANDRA_CLUSTER_PORT)))
                .build();

        Metadata metadata = cluster.getMetadata();
        for ( Host host : metadata.getAllHosts() ) {
            LOG.info("Datacenter: "+host.getDatacenter()+"; Host: "+host.getAddress()+"; DC: "+host.getDatacenter()+"\n");
        }

UPDATE:如果我在withe.geterrors()中获得错误消息,我将获得:

/172.31.7.243:9042=com.datastax.driver.core.operationtimedoutexception:[/172.31.7.243:9042]操作超时,/172.31.7.244:9042=com.datastax.driver.core.operationtimedoutexception:[/172.31.7.244:9042=com.datastax.driver.core.operationtimedoutexception:[/172.31.7.244:9042]操作超时:9042]操作超时,/172.31.7.247:9042=com.datastax.driver.core.operationtimedoutexception:[/172.31.7.247:9042]操作超时}

更新:

>

  • 密钥空间的复制因子是3。
  • 对于这些删除,我使用不同的文件和cql查询运行它们:

    cqlsh ip_node_1-f脚本-1.重复cqlsh ip_node_1-f脚本-2.重复cqlsh ip_node_1-f脚本-3.重复...

    我没有指定任何一致性级别,所以使用默认的一致性级别。

    前面的每个文件都包含如下所示的删除:

    从keyspace_name.search中删除,其中idline1=837和idline2=841和partid=8558和id=18C04C20-8A3A-11E5-9E20-0025905A2AB2;

      null

    更新(18-03-2016):

    在开始执行删除之后,我发现一些节点的cpu增加了很多:

    我检查了这些节点上的进程,只有cassandra在运行,但占用了大量CPU。其余的节点几乎没有使用CPU。

  • 共有1个答案

    沈弘盛
    2023-03-14

    我发现您的数据模型有两个问题。

    >

  • 使用两个二级索引。一个在分区键上的字段上。我不知道卡珊德拉在这种情况下的表现。最坏的情况是,即使您使用完整的分区键(就像您在示例delete中所做的那样),cassandra也会在辅助索引中进行查找。在这种情况下,这将意味着一个完整的集群扫描,因为辅助索引只存储在每个分区。由于只有一部分分区键被索引,cassandra不知道索引信息位于哪个分区上。这种行为至少可以解释超时的原因。

    您说,您删除了一个特定分区中的许多行。这也是一个问题。对于每次删除,cassandra都会创建一个墓碑。墓碑越多,读起来就越慢。这迟早会导致超时或异常(我相信当到达1000个墓碑时,cassandra会写警告,当到达10.000个墓碑时抛出异常)。顺便说一句。这些墓碑也在二级索引中创建。默认情况下,cassandra将在执行压缩后的gc_grace_seconds(默认为10天)移除墓碑。您可以在每个表中更改此属性。有关这些表属性的更多信息,请参见:表属性

  •  类似资料:
    • 在房间中,删除注释不会发出任何信息。这就是dao的样子 这使得它在做类似的事情时成为一个问题 因为我们没有的发射。我使用以下代码在后台线程上调用deleteUser。 这工作正常。但是,在订阅方法中,我现在需要访问AndroidUI来显示一个宣布成功删除的祝酒词。自然,我得到了这个异常(因为链中缺少观察) 然而,当我像这样放置观察 我奇怪地发现了这个例外:

    • 关于这个问题有好几篇帖子,但仍然没有找到答案。这是父类Userr。在@OneToMany关系中,我想删除一个特定的子帐户。 现在,当我通过“删除”查询执行此操作时,我得到以下异常。 组织。springframework。刀。InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredExceptio

    • 所以我有java的后端和Angular的前端。当我向我的spring boot restendpoint发送删除请求时,我得到了403代码。Angular发送第一个选项请求,并返回403,因此不会发生删除请求。另外,获取和发布工作正常。 我试过禁用csrf,但没有成功。我也在我的浏览器中使用它,所以我不应该禁用它。在soapUI中,DELETE可以正常工作。 这是我的安全配置类 我想做这个删除请求

    • -我发现shiftRows函数存在一个导致excel中断的错误。https://bz.apache.org/bugzilla/show_bug.cgi?id=57423我不确定这是否已经修复。我已经在bugzilla上添加了一个评论来进一步了解这一点。 如果满足特定的单元格值条件,我正尝试从excel文件中删除行(而不是删除的内容)。 我成功地实现了这一点,但问题是它破坏了我的excel并且当我重

    • 问题内容: 我正在尝试使用sed删除空行: 但我没有运气。 例如,我有以下几行: 我希望它像: 这应该是什么代码? 问题答案: 您的“空”行中可能有空格或制表符。使用POSIX类与去除只含有空格的所有行: 使用ERE的较短版本,例如gnu sed: (请注意,sed的确实 不 支持PCRE)。

    • 这个的代码应该是什么?