cassandra遵循哪种分区技术?

ne5o7dgx  于 2021-06-13  发布在  Cassandra
关注(0)|答案(2)|浏览(534)

我是cassandra的新手,在阅读关于数据库分区的文章时,我感到困惑,想知道cassandra是遵循水平分区(sharding)还是垂直分区技术?
另外,根据我的理解,由于cassandra是面向列的数据库,所以它应该遵循垂直分区技术。如果不是这样的话,有人能详细解释一下吗?

dba5bblo

dba5bblo1#

cassandra在散列算法上实现分区。因为cassandra允许有效的水平伸缩(如果分区键选择正确的话)。总之,创建表时,需要定义分区列。当您插入一条记录时,cassandra将获取这些值,对其进行散列,并确定它所属的节点。如果rf configured>1,则还将选择备用副本。它的工作方式与oracle的散列分区没有什么不同,只是oracle只在存储层执行,而不是在主机层(除非您使用oracle切分)。

ggazkfy8

ggazkfy82#

因为cassandra是面向列的db
这一点已经在堆栈溢出上讨论过了,特别是在这个答案中。cassandra不是一个面向列的数据库。它是一个分区行存储。数据以“行”的形式组织和呈现,类似于关系数据库。
cassandra是否遵循水平分割(sharding)
从技术上讲,cassandra就是你所说的“分片”数据库,但它几乎从未以这种方式被提及。本质上,每个节点负责特定范围的分区。这些分区(令牌)是一个数值,其值的范围为-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']

当然,对于vnode,节点几乎总是负责多个令牌范围。
在操作时,分区密钥被散列为令牌。这个令牌告诉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) 上面的函数指示哪些分区包含数据。
如果有另外一张table studentid 作为其分区键,该表的数据将存储在与 student table。
在任何情况下,这是发生的事情的简化版本。请随意阅读robbie strickland的vnodes(上面的链接)以及cassandra:high availability。他(imo)对cassandra的散列和分区分发过程进行了最好的描述。

相关问题