实际上,PRIMARY KEY不与分区键相同。分区键是主键的一部分。是的,它是决定行如何在集群中分布的部分。
在这种情况下,用户名如何分配数据?
如果我创建你的表,插入一些值并查询它,我可以通过在我的 SELECT 中使用 token 函数来获得一些分配过程的窗口:
> SELECT token(user_name), user_name FROM user2;
system.token(user_name) | user_name
-------------------------+-----------
-5077180869401877077 | Patdard
-4874582970682694928 | Robo
4639906948852899531 | Bill
4645660266327417866 | Bob
4877648712764681009 | Valentina
5726383012007749221 | Helcine
7724711996172375448 | Jebediah
(7 rows)
假设我有 5 个节点。在 Cassandra 中,每个节点负责一个主令牌范围。让我们假设以下内容:
1) 5534023222112865485 to -9223372036854775808
2) -9223372036854775807 to -5534023222112865485
3) -5534023222112865484 to -1844674407370955162
4) -1844674407370955161 to 1844674407370955161
5) 1844674407370955161 to 5534023222112865484
注意:通过运行计算的范围:
python -c 'print [str(((2**64 / 5) * i) - 2**63) for i in range(5)]'
在 MVP Robbie Strickland 的Cassandra High Availability中也有这种描述。
Cassandra 获取分区键的散列令牌值(在本例中为user_name)并使用它来确定行显示分配到哪个节点。鉴于上面的哈希标记值,以及我列出的范围,这些是每个用户名应该去的节点:
Node 1: Helcine, Jebediah
Node 3: Patdard, Robo
Node 5: Bill, Bob, Valentina
根据您的复制因子 (RF),Cassandra 还可能将每行的额外副本放置在其他节点上。