Cassandra分区密钥组织

时间:2017-09-06 09:16:33

标签: cassandra

我正在尝试将以下结构存储在cassandra中。

ShopID, UserID , FirstName , LastName etc....

大多数查询都是

select * from table where  ShopID = ? , UserID = ? 

这就是将(ShopID, UserID)设置为主键的原因。

根据文档,Cassandra的默认分区键是主键的第一列 - 对于我的情况它是ShopID,但我想在Cassandra集群上统一分发数据,我不能允许来自一个shopID的所有数据仅存储在一个分区中,因为一些商店有10M记录而有些只有1k。

我可以设置(ShopID, UserID)作为分区键,然后我可以在Cassandra集群中达到记录的统一分布。但在此之后,我无法接收属于某些shopid的所有用户。

select * 
from table 
where ShopID = ?

很明显,这个查询要求对整个集群进行全面扫描,但我没有任何可能做到这一点。它看起来非常严格。

我的问题是如何重新组织数据以同时解决这两个问题(统一数据分区,进行全面扫描查询的可能性)。

2 个答案:

答案 0 :(得分:3)

通常,您需要将用户ID设置为群集列,并在保存期间向表和分区键添加一些人为信息。它允许将大型自然分区分解为多个合成。但是现在您需要在读取期间查询所有合成分区以组合回自然分区。因此,我们的目标是在合成分区的数量(大小)和读取查询之间找到合理的权衡来组合所有这些。

可以找到herehere可能实施的全面说明  (示例2:用户组)。

当通过聚类日期类型列执行查询/排序/分组时,还可以查看solution(示例3:按连接日期划分的用户组)。如果您也有类似的查询,它会很有用。

答案 1 :(得分:1)

Cassandra中的每个节点都负责一些令牌范围。 Cassandra使用散列从行的分区键派生令牌,并将记录发送到其令牌范围包含此令牌的节点。不同的记录可以具有相同的令牌,并且它们在分区中分组。为简单起见,我们可以假设每个cassandra节点存储相同数量的分区。我们还希望分区的大小相等,以便在节点之间均匀分配。如果我们有一个太大的分区,这意味着我们的一个节点需要更多的资源来处理它。但是如果我们将它分成多个较小的,我们就增加了它们在所有节点之间均匀分布的可能性。

然而,节点之间的令牌范围分布与分区之间的记录分布无关。当我们添加一个新节点时,它只承担来自其他节点的偶数部分令牌范围的责任,结果是偶数个分区。如果我们有2个节点具有3 GB数据,则在添加第三个节点后,每个节点存储2 GB数据。这就是为什么可扩展性不受分区影响的原因,您不需要在添加新节点后更改历史数据。