2

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

此外,据我了解,由于 Cassandra 是面向列的数据库,因此它应该遵循垂直分区技术。如果不是这种情况,那么任何人都可以详细解释一下吗?

4

2 回答 2

3

因为 Cassandra 是面向列的数据库

这一点已经在 Stack Overflow 上讨论过,特别是在这个答案中。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:高可用性。他撰写了 (IMO) Cassandra 散列和分区分布过程的最佳描述。

于 2020-05-22T14:42:51.383 回答
2

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

于 2020-05-22T14:40:51.253 回答