Cassandra 的哈希值是不是跨多个表具有相同的值?

Posted

技术标签:

【中文标题】Cassandra 的哈希值是不是跨多个表具有相同的值?【英文标题】:Is Cassandra's hash for same value across multiple tables?Cassandra 的哈希值是否跨多个表具有相同的值? 【发布时间】:2016-01-21 16:01:59 【问题描述】:

我有一个多租户应用程序,其中tenantId 将成为每个查询的一部分,因此我将其放入所有表的分区键中。

示例:

CREATE TABLE users 
tenantId text,
user text,
active boolean,
PRIMARY_KEY (tenantId, user)


CREATE TABLE roles 
tenantId text,
rolename text,
PRIMARY_KEY (tenantId, rolename)

现在,想象一下 100 多个这样的表格......

我的问题是:

Cassandra 是否会对tenantId 'foo' 进行散列以将所有表中的所有数据指向同一个节点并使其成为 uber 热点,还是会在集群中均匀分布每个表和租户数据?

【问题讨论】:

令牌是主键的哈希值,因此将tenantId 放入每个分区键都无济于事。我想知道你会生成多少个独特的tenantId?在某些低基数的情况下,二级索引可能有意义。 Richard Low explains it 比我做得好很多。 【参考方案1】:

简单的答案,令牌值(分区键的哈希)是相同的,它不依赖于表名或其他任何东西。原因是我们在整个集群中使用了相同的分区(Murmur3)。

所以在您的情况下,是的,如果您的分区键是 tenantId,则来自一个客户的所有数据都将分发到相同的副本,这适用于 所有表有这个分区键

【讨论】:

所以,我必须像这样为每个分区键创建一个虚拟分区键存储桶,然后将它们分散:“用户”的分区键 PRIMARY_KEY ( (tenantId, tablename), user) where tablename始终是“用户”,对于“角色”PRIMARY_KEY ( (tenantId, tablename), rolename),其中表名始终是“角色”。你怎么看? 这并不能解决关于tenandID 的分布不佳的根本问题。即使您将表名添加为额外的分区键组件,1 个租户使用的分区总数 = 表数。我怀疑你有 1000 个表,所以最终,1 个租户的数据将只分布到几个分区,分区与不同的表一样多 您能否举例说明 Achilles 生成的表在多租户设计中的外观?我查看并找不到多租户文档页面,但我知道您在某些时候支持多租户。 Achilles 中的多租户依赖于运行时的动态表查找。在运行时,您可以执行select().xxx().fromTable(schemaProvider).where().tenantId_Eq(...)。所有的表查找都是由 schemaProvider 完成的。在这种情况下,通过为不同的客户/客户组提供不同的表/键空间来实现多租户

以上是关于Cassandra 的哈希值是不是跨多个表具有相同的值?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 分区键可以跨一个键空间中的多个表吗?

如何知道映射表中是不是存在特定值?

Java中的多值哈希表

在 Perl 中测试两个哈希键是不是具有相同的结构

哈希表中的条目是否可以使用相同的键和相同的值?

ruby 在哈希中删除相同的值多个键