因为 Cassandra 是面向列的数据库
这一点已经在 Stack Overflow 上讨论过,specifically in this answer。 Cassandra 不是 面向列的数据库。它是一个分区的行存储。数据以“行”的形式组织和呈现,类似于关系数据库。
Cassandra 是否遵循水平分区(分片)
从技术上讲,Cassandra 就是您所说的“分片”数据库,但几乎从未以这种方式提及它。本质上,每个节点负责特定范围的分区。这些分区(令牌)是一个数值,Murmur3Partitioner 范围从 -2^63 到 +2^63-1。
事实上,在一个节点被简化为持有一个单个令牌范围的场景中,您可以像这样根据集群(数据中心)中节点的数量来计算范围:
python -c 'print [str(((2**64 / 6) * i) - 2**63) for i in range(6)]'
['-9223372036854775808', '-6148914691236517206', '-3074457345618258604',
'-2', '3074457345618258600', '6148914691236517202']
当然对于vNodes,一个节点几乎总是负责多个令牌范围。
在操作时,分区键被散列成一个令牌。这个令牌告诉 Cassandra 数据驻留在哪个节点上。考虑这张表:
SELECT token(studentid),studentid,fname,lname FROM student ;
system.token(studentid) | studentid | fname | lname
-------------------------+-----------+-------+----------
-5626264886876159064 | janderson | Jordy | Anderson
-1472930629430174260 | aploetz | Avery | Ploetz
8993000853088610283 | mgin | Micah | Gin
(3 rows)
因为这个表有一个简单的主键定义studentid,它被用作分区键。上面token(studentid)函数的结果表明哪些分区包含数据。
如果有另一个表也使用studentid 作为其分区键,则该表的数据将存储在与student 表相同的节点上。
无论如何,这是所发生情况的简化版本。随意阅读 vNodes(上面的链接)以及 Robbie Strickland 的 Cassandra: High Availability。他撰写了 (IMO) 对 Cassandra 的散列和分区分布过程的最佳描述。