如何为对 cassandra 集群或键空间的任何查询覆盖 default_fetch_size?

How to override default_fetch_size for any query to a cassandra cluster or keyspace?

我有一个带有 3 个节点的 cassandra 2.0.5 集群设置。多个服务使用具有不同键空间的同一个集群。由于 table 中的 blob 条目很大,遍历所有行的查询会导致 OutOfMemory 错误并使集群崩溃。这对我来说是 unacceptable,因为不同的服务使用同一个集群,一个不应该影响其他。

现在,有一种方法可以使用 fetchSize 参数来限制每次查询一次加载到内存中的行数,大多数驱动程序都支持 cluster 2.0 协议。

default_fetch-size 值为 5000,我想将此值覆盖为更小的值,例如 500,以避免 OOM 错误。我不能假设所有客户端在发出昂贵的查询时都会使用较小的 fetchSize。有办法吗?我在 cassandra.yaml 中找不到任何此类配置。

我可以按键空间级别设置它吗,以便对特定键空间的所有查询都将具有较小的 default_fetch_size?

据我所知,您只能设置特定语句的提取大小。 statement.setFetchSize(100);

  1. 要在所有语句上设置 fetchsize,您可以在构建会话时在 QueryOptions 中进行设置。像这样,

    Session session = Cluster.builder()
            .addContactPoint("127.0.0.1")
            .withQueryOptions(new QueryOptions().setFetchSize(100))
            .build().connect();
    
  2. 如果您想为不同的键空间设置不同的提取大小,则为每个键空间维护会话对象。像这样,

    Session sessionForKeyspace1 = Cluster.builder()
            .addContactPoint("127.0.0.1")
            .withQueryOptions(new QueryOptions().setFetchSize(100))
            .build().connect("keyspace1");
    
    Session sessionForKeyspace2 = Cluster.builder()
            .addContactPoint("127.0.0.1")
            .withQueryOptions(new QueryOptions().setFetchSize(200))
            .build().connect("keyspace2");