具有倾斜流量的系统的 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,而所有其他卷都在该范围内。
考虑到这种情况,我有以下问题:
- 您的分区很少超过 100 MB 限制是绝对的错误吗?
- 虽然使用更小的存储桶说 15 分钟 window,但我得到的所有分区键组合都在 100 MB 以下,但这也会产生严重倾斜的分区,这意味着分区键的高容量组合会上升到 80 MB而剩下的一次则远低于 15 MB。这是否会对我的集群性能产生不利影响?
- 有没有更好的方法解决这个问题?
以下是我认为可能有用的更多信息:
- 此实体的平均行大小约为 200 字节
- 我也在考虑负载未来验证系数 2 并估计负载加倍。
- 特定分区键组合的峰值负载约为一天 280 万条记录
- 同一个组合高峰流量小时约140万条记录
- 同样在 15 分钟内 window 大约有 550,000 条记录。
提前感谢您的意见!!
您使用存储桶 ID 的方法看起来不错。回答您的问题:
- 不,这不是硬性限制,实际上,考虑到过去几年的硬件改进,它可能太低了。我见过 2 GB 和 5 GB 的分区(尽管它们在维修时会让你很头疼),但这些都是极端情况。不要接近这些值。底线是,如果您不超过这 100 MB,您会没事的。如果你有至少 15 GB 的 ram,使用 G1GC,你就是黄金。
- 分区大小的均匀分布对于保持整个集群的数据负载平衡很重要,而且它也很好,这样您就可以确信您的查询将接近平均延迟(因为它们将读取数据大小大致相同),但它本身不会带来性能问题。
- 这个方法看起来不错,但如果那是一个时间序列,我认为它考虑到了你所说的,那么我建议你在 [=10] 中使用 TWCS (Time Window Compaction Strategy) =].检查如何配置此压缩策略,因为您设置的时间window将非常重要。
我能够进行设备分桶化,以防止由于任何意外流量激增而对集群健康造成任何风险。同样的描述在这里 https://medium.com/walmartlabs/bucketisation-using-cassandra-for-time-series-data-scans-2865993f9c00
稍长的问题描述请耐心等待。 我是 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,而所有其他卷都在该范围内。
考虑到这种情况,我有以下问题:
- 您的分区很少超过 100 MB 限制是绝对的错误吗?
- 虽然使用更小的存储桶说 15 分钟 window,但我得到的所有分区键组合都在 100 MB 以下,但这也会产生严重倾斜的分区,这意味着分区键的高容量组合会上升到 80 MB而剩下的一次则远低于 15 MB。这是否会对我的集群性能产生不利影响?
- 有没有更好的方法解决这个问题?
以下是我认为可能有用的更多信息:
- 此实体的平均行大小约为 200 字节
- 我也在考虑负载未来验证系数 2 并估计负载加倍。
- 特定分区键组合的峰值负载约为一天 280 万条记录
- 同一个组合高峰流量小时约140万条记录
- 同样在 15 分钟内 window 大约有 550,000 条记录。
提前感谢您的意见!!
您使用存储桶 ID 的方法看起来不错。回答您的问题:
- 不,这不是硬性限制,实际上,考虑到过去几年的硬件改进,它可能太低了。我见过 2 GB 和 5 GB 的分区(尽管它们在维修时会让你很头疼),但这些都是极端情况。不要接近这些值。底线是,如果您不超过这 100 MB,您会没事的。如果你有至少 15 GB 的 ram,使用 G1GC,你就是黄金。
- 分区大小的均匀分布对于保持整个集群的数据负载平衡很重要,而且它也很好,这样您就可以确信您的查询将接近平均延迟(因为它们将读取数据大小大致相同),但它本身不会带来性能问题。
- 这个方法看起来不错,但如果那是一个时间序列,我认为它考虑到了你所说的,那么我建议你在 [=10] 中使用 TWCS (Time Window Compaction Strategy) =].检查如何配置此压缩策略,因为您设置的时间window将非常重要。
我能够进行设备分桶化,以防止由于任何意外流量激增而对集群健康造成任何风险。同样的描述在这里 https://medium.com/walmartlabs/bucketisation-using-cassandra-for-time-series-data-scans-2865993f9c00