Cassandra 遵循哪种分区技术?

Cassandra follows which partitioning technique?

我是 Cassandra 的新手,在阅读有关数据库分区 - 垂直和水平分区时,我感到困惑,想知道 Cassandra 是否遵循水平分区(分片)或垂直分区技术?

另外,根据我的理解,Cassandra是面向列的DB,应该遵循垂直分区技术。如果不是这种情况,那么有人可以详细解释一下吗?

Cassandra 在哈希算法上实现分区。因此,Cassandra 允许高效的水平扩展(如果分区键选择正确)。总之,当您创建 table 时,您定义了分区列。当您插入一条记录时,Cassandra 将获取这些值,对其进行哈希处理,并确定它所属的节点。如果您配置的 RF > 1,则还将选择备用副本。它的工作原理与 Oracle 的散列分区没有什么不同,除了 Oracle 只在存储层而不是主机层(除非你使用 Oracle 分片)。

as Cassandra is column oriented DB

这一点已在 Stack Overflow 上讨论得令人作呕,specifically in this answer。 Cassandra 不是 面向列的数据库。它是一个 分区行存储 。数据在 "rows," 中组织和呈现类似于关系数据库。

whether Cassandra follows Horizontal partitioning (sharding)

从技术上讲,Cassandra 就是您所说的 "sharded" 数据库,但几乎从未以这种方式提及它。本质上,每个节点负责特定范围的分区。这些分区(令牌)是一个数值,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 数据驻留在哪个节点上。考虑这个 table:

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)

因为这个 table 有一个简单的主键定义 studentid,用作分区键。上面 token(studentid) 函数的结果表明哪些分区包含数据。

如果有另一个 table 也使用 studentid 作为其分区键,则 table 的数据将存储在与 student 相同的节点上table.

无论如何,这是所发生情况的简化版本。请随意阅读有关 vNodes(上面的 link)以及 Robbie Strickland 的 Cassandra: High Availability 的文章。他撰写了 (IMO) Cassandra 散列和分区分布过程的最佳描述。