cassandra 如何设计一个存储子域元数据的表以避免大的分区?

toiithl6  于 2022-12-03  发布在  Cassandra
关注(0)|答案(2)|浏览(144)

我试图在cassandra中设计一个表,但是我收到了很多大分区消息。有什么想法可以改进这个“设计”以防止过载,并且仍然可以使用这样的查询:
第一个
此外,我用

update analytics set a='a' where domain='test' and tld='com' and subdomain='b';

某些分区超过100万行

xvw2m8pv

xvw2m8pv1#

我可能很天真,但我很惊讶地听到一些域可以有一百万个子域。无论如何,我怀疑绝大多数域的子域都不会超过100个,所以在大多数情况下,您当前的表模式是可以的,您只需要处理真正“大”的域。
这是社交应用的一个常见问题,在图论中,它被称为supernode problem--一个边数非常多的顶点。简单地说,它是在Twitter上拥有超过1.33亿关注者(边)的Barack Obama(顶点或节点),或者是在Instagram上拥有超过5.06亿关注者的Cristiano Ronaldo
对于遇到超级节点问题的应用程序,它们通常通过将超级节点与其他节点分开处理来解决该问题。在您的示例中,您需要在应用程序中实现一些逻辑来检测“超级域”并将其存储在单独的表中。
一个可能的表设计使用子域的前2个字符作为存储桶。例如,对于域sub.domainsr.us,我们使用前缀su作为存储桶,以使分区更小:

CREATE TABLE subdomains_by_domain_tld_prefix (
    domain text,
    tld text,
    prefix text,
    subdomain text,
    a text,
    PRIMARY KEY ((domain, tld, prefix), subdomain)
)

这只是一个示例,因此prefix不必仅限于前2个字符。您可以根据数据集对其进行调整。
此外,如果它使你的应用程序更简单,你可以选择使用这个表的所有域名。干杯!
👉 请将鼠标悬停在上面的cassandra标记上并单击Watch标记,以支持Apache Cassandra社区。🙏谢谢!

62o28rlo

62o28rlo2#

a的唯一性如何?您可以包含任何最有意义且会给予较小数据分割的数据行,然后您可以在原始PK中遗漏且需要查询的数据行上建立次要索引。请记住,无论您在PK中包含什麽数据行,在查询记录时都需要使用,因此请只包含或新增在查询中有意义且会提供较小数据分割的数据行。

相关问题