我是Cassandra的新手,在阅读有关对数据库进行垂直和水平分区时,我很困惑,想知道Cassandra是遵循水平分区(分片)还是垂直分区技术?
此外,根据我的理解,由于Cassandra是面向列的DB,因此应遵循垂直分区技术。如果不是这种情况,那么任何人都可以详细解释吗?
因为Cassandra是面向列的数据库
这一点已经在堆栈溢出specifically in this answer上进行了讨论。 Cassandra是NOT面向列的数据库。它是分区行存储。数据以类似于关系数据库的“行”的形式组织和显示。
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的哈希和分区分发过程的best描述。
Cassandra在散列算法上实现分区。因此,Cassandra允许进行有效的水平缩放(如果正确选择了分区键)。总而言之,当您创建表时,您将定义分区列。当您插入记录时,Cassandra将获取值,对其进行哈希处理,然后确定其所属的节点。如果您将RF配置为> 1,则还将选择备用副本。它的工作方式与Oracle的散列分区没有什么不同,除了Oracle仅在存储层而不是主机层上进行(除非您使用Oracle分片)。