Cassandra 中的范围查询是一个更大的分区还是几个更小但分布更广的分区?

One bigger partition or few smaller but more distributed partitions for Range Queries in Cassandra?

我们有一个 table 来存储按文件分区的数据。一个文件在 json 中是 200MB 到 8GB - 但显然有很多开销。压缩原始数据将大大降低这一点。我摄取了大约 35 GB 的 json 数据,只有一个节点获得了略多于 800 MB 的数据。这可能是由于 "write hotspots"——但我们只写一次并且只读。我们不更新数据。目前,我们每个文件有一个分区。

通过使用二级索引,我们在数据库中搜索包含特定地理位置的分区(=第一个查询),然后将此查询的结果用于范围查询找到的分区的时间范围(=第二个查询) . 如果需要,这甚至可能是整个文件,但在 95% 的查询中,只查询分区的块。

我们在 6 节点集群上的复制因子为 2。数据分布相当均匀,根据 nodetool status *tablename*,每个节点拥有 31.9% 到 35.7%(有效)数据。

良好的读取性能对我们来说很关键。

我的问题:

  1. 就卷或行大小而言,多大的分区太大了?有这方面的经验法则吗?
  2. 对于范围查询性能:将我们的 "big" 分区拆分成更多更小的分区是否更好?我们使用 "big" 分区构建了我们的模式,因为我们认为当我们在一个分区上进行范围查询时,最好将它全部放在一个节点上,这样可以轻松获取数据。请注意,由于 RF 2,数据在一个副本上也可用。
  1. C* 支持非常大的行,但这并不意味着达到那个级别是个好主意。 right 限制取决于特定的用例,但一个好的大概值可能在 10k 到 50k 之间。当然,一切都是妥协,所以如果你有 "huge"(以字节为单位)行,那么严格限制每个分区中的行数。如果您有 "small"(以字节为单位)行,您可以稍微放宽该限制。这是因为 one partition 意味着 one node only due to your RF=1, 所以你所有的查询对于一个特定的分区只会命中一个节点。
  2. 范围查询理想情况下应该只去一个分区。范围查询意味着在获取查询的节点上对您的分区进行顺序扫描。但是,您将自己限制在该节点的 吞吐量 以内。如果您在更多节点之间拆分范围查询(即通过添加 bucket 之类的内容来更改数据分区方式),您需要从不同节点获取数据并执行 并行个查询,直接增加了总吞吐量。当然,您会丢失不同存储桶中记录的顺序,因此如果您的分区中的顺序很重要,那么这是不可行的。