我是cassandra的新手,在阅读关于数据库分区的文章时,我感到困惑,想知道cassandra是遵循水平分区(sharding)还是垂直分区技术?另外,根据我的理解,由于cassandra是面向列的数据库,所以它应该遵循垂直分区技术。如果不是这样的话,有人能详细解释一下吗?
dba5bblo1#
cassandra在散列算法上实现分区。因为cassandra允许有效的水平伸缩(如果分区键选择正确的话)。总之,创建表时,需要定义分区列。当您插入一条记录时,cassandra将获取这些值,对其进行散列,并确定它所属的节点。如果rf configured>1,则还将选择备用副本。它的工作方式与oracle的散列分区没有什么不同,只是oracle只在存储层执行,而不是在主机层(除非您使用oracle切分)。
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的散列和分区分发过程进行了最好的描述。
studentid
token(studentid)
student
2条答案
按热度按时间dba5bblo1#
cassandra在散列算法上实现分区。因为cassandra允许有效的水平伸缩(如果分区键选择正确的话)。总之,创建表时,需要定义分区列。当您插入一条记录时,cassandra将获取这些值,对其进行散列,并确定它所属的节点。如果rf configured>1,则还将选择备用副本。它的工作方式与oracle的散列分区没有什么不同,只是oracle只在存储层执行,而不是在主机层(除非您使用oracle切分)。
ggazkfy82#
因为cassandra是面向列的db
这一点已经在堆栈溢出上讨论过了,特别是在这个答案中。cassandra不是一个面向列的数据库。它是一个分区行存储。数据以“行”的形式组织和呈现,类似于关系数据库。
cassandra是否遵循水平分割(sharding)
从技术上讲,cassandra就是你所说的“分片”数据库,但它几乎从未以这种方式被提及。本质上,每个节点负责特定范围的分区。这些分区(令牌)是一个数值,其值的范围为-2^63到+2^63-1。
事实上,在将节点简化为持有单个令牌范围的场景中,可以根据集群(数据中心)中的节点数计算范围,如下所示:
当然,对于vnode,节点几乎总是负责多个令牌范围。
在操作时,分区密钥被散列为令牌。这个令牌告诉cassandra数据驻留在哪个节点上。考虑下这张表:
因为这个表有一个简单的主键定义
studentid
,用作分区键。调查结果token(studentid)
上面的函数指示哪些分区包含数据。如果有另外一张table
studentid
作为其分区键,该表的数据将存储在与student
table。在任何情况下,这是发生的事情的简化版本。请随意阅读robbie strickland的vnodes(上面的链接)以及cassandra:high availability。他(imo)对cassandra的散列和分区分发过程进行了最好的描述。