具有倾斜流量的系统的 Cassandra 分区策略

Cassandra partitioning strategy for systems with skewed traffic

稍长的问题描述请耐心等待。 我是 Cassandra 世界的新手,我正在尝试将我当前的产品从基于 Oracle 的数据层迁移到 Cassandra。

为了支持范围查询,我创建了如下所示的实体:

create table if not exists my_system.my_system_log_dated(
  id uuid,
  client_request_id text,
  tenant_id text,
  vertical_id text,
  channel text,
  event text,
  event_type text,
  created_date date,
  primary key((created_date, tenant_id, vertical_id, channel, event), 
  event_type, client_request_id, id)
) with clustering order by (created_date desc);

现在,我遇到了几个 documentation/resources/blogs 提到我应该将分区大小保持在 100 MB 以内以获得最佳性能的集群。由于我的系统每天处理特定分区键组合的流量,我无法使用上述分区键将其保持在 100 MB 以下。

为了解决这个问题,我引入了一个名为 bucket_id 的新因素,并正在考虑为其分配一天中的小时值,以进一步将分区分成更小的块并保持它们小于 100 mb(即使这意味着我一天必须进行 24 次读取才能提供流量详细信息,但我对读取效率低下感到满意)。这是带有 bucket id

的模式
 create table if not exists my_system.my_system_log_dated(
  id uuid,
  client_request_id text,
  tenant_id text,
  vertical_id text,
  channel text,
  event text,
  bucket_id int,
  event_type text,
  created_date date,
  primary key((created_date, tenant_id, vertical_id, channel, event, 
  bucket_id), event_type, client_request_id, id)
) with clustering order by (created_date desc);

即使这样,也有几个组合 超过 100 MB,而所有其他卷都在该范围内。

考虑到这种情况,我有以下问题:

  1. 您的分区很少超过 100 MB 限制是绝对的错误吗?
  2. 虽然使用更小的存储桶说 15 分钟 window,但我得到的所有分区键组合都在 100 MB 以下,但这也会产生严重倾斜的分区,这意味着分区键的高容量组合会上升到 80 MB而剩下的一次则远低于 15 MB。这是否会对我的集群性能产生不利影响?
  3. 有没有更好的方法解决这个问题?

以下是我认为可能有用的更多信息:

提前感谢您的意见!!

您使用存储桶 ID 的方法看起来不错。回答您的问题:

  1. 不,这不是硬性限制,实际上,考虑到过去几年的硬件改进,它可能太低了。我见过 2 GB 和 5 GB 的分区(尽管它们在维修时会让你很头疼),但这些都是极端情况。不要接近这些值。底线是,如果您不超过这 100 MB,您会没事的。如果你有至少 15 GB 的 ram,使用 G1GC,你就是黄金。
  2. 分区大小的均匀分布对于保持整个集群的数据负载平衡很重要,而且它也很好,这样您就可以确信您的查询将接近平均延迟(因为它们将读取数据大小大致相同),但它本身不会带来性能问题。
  3. 这个方法看起来不错,但如果那是一个时间序列,我认为它考虑到了你所说的,那么我建议你在 [=10] 中使用 TWCS (Time Window Compaction Strategy) =].检查如何配置此压缩策略,因为您设置的时间window将非常重要。

我能够进行设备分桶化,以防止由于任何意外流量激增而对集群健康造成任何风险。同样的描述在这里 https://medium.com/walmartlabs/bucketisation-using-cassandra-for-time-series-data-scans-2865993f9c00