Database Cassandra遵循哪种分区技术?

Database Cassandra遵循哪种分区技术?,database,cassandra,partitioning,sharding,column-oriented,Database,Cassandra,Partitioning,Sharding,Column Oriented,我是Cassandra的新手,在阅读有关数据库分区(垂直和水平)的文章时,我感到困惑,想知道Cassandra是遵循水平分区分片还是垂直分区技术 此外,根据我的理解,因为Cassandra是面向列的DB,所以它应该遵循垂直分区技术。如果不是这样的话,有人能详细解释一下吗 Cassandra在散列算法上实现分区。因为Cassandra允许在正确选择分区键的情况下进行有效的水平缩放。总之,在创建表时,定义分区列。插入记录时,Cassandra将获取值,对其进行散列,并确定它所属的节点。如果已将RF配

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


此外,根据我的理解,因为Cassandra是面向列的DB,所以它应该遵循垂直分区技术。如果不是这样的话,有人能详细解释一下吗

Cassandra在散列算法上实现分区。因为Cassandra允许在正确选择分区键的情况下进行有效的水平缩放。总之,在创建表时,定义分区列。插入记录时,Cassandra将获取值,对其进行散列,并确定它所属的节点。如果已将RF配置为>1,则还将选择备用副本。它的工作方式与Oracle的散列分区没有什么不同,只是Oracle只在存储层执行,而不是在主机层执行,除非您使用Oracle分片。

Cassandra在散列算法上实现分区。因为Cassandra允许在正确选择分区键的情况下进行有效的水平缩放。总之,在创建表时,定义分区列。插入记录时,Cassandra将获取值,对其进行散列,并确定它所属的节点。如果已将RF配置为>1,则还将选择备用副本。它的工作方式与Oracle的散列分区没有什么不同,只是Oracle只在存储层执行,而不是在主机层执行,除非您使用Oracle分片

因为Cassandra是面向列的DB

这一点已经在堆栈溢出上讨论过了。Cassandra不是一个面向列的数据库。这是一个分区行存储。数据是按行组织和显示的,类似于关系数据库

Cassandra是否遵循水平分区分片

从技术上讲,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']
当然,一个节点几乎总是负责多个令牌范围

在操作时,分区密钥被散列到令牌中。此标记告诉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主键定义,它被用作分区键。上面的tokenstudentid函数的结果指示哪些分区包含数据

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

无论如何,这只是所发生事情的简化版本。请随意阅读上面的vNodes链接以及Robbie Strickland的链接。他在IMO中对Cassandra的哈希和分区分发过程进行了最好的描述

因为Cassandra是面向列的DB

这一点已经在堆栈溢出上讨论过了。Cassandra不是一个面向列的数据库。这是一个分区行存储。数据是按行组织和显示的,类似于关系数据库

Cassandra是否遵循水平分区分片

从技术上讲,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']
当然,一个节点几乎总是负责多个令牌范围

在操作时,分区密钥被散列到令牌中。此标记告诉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主键定义,它被用作分区键。上面的tokenstudentid函数的结果指示哪些分区包含数据

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


无论如何,这只是所发生事情的简化版本。请随意阅读上面的vNodes链接以及Robbie Strickland的链接。他在IMO中对Cassandra的散列和分区分发过程进行了最好的描述。

您是在谈论扩展吗?缩放和分区
两者都是不同的东西。但是Cassandra支持水平缩放而不是垂直缩放是很好的选择。不,我说的是切分,即分区。基本上,我想知道在Cassandra中是否也对任何列进行了分区,或者对于一个特定的表,所有列都保持在一个节点中,并且只对行进行分区,并使用分区键标识节点?您是在谈论缩放吗?缩放和分区都是不同的事情。但是Cassandra支持水平缩放而不是垂直缩放是很好的选择。不,我说的是切分,即分区。基本上,我想知道在Cassandra中是否也对任何列进行了分区,或者对于特定的表,所有列都保留在一个节点中,只对行进行分区,并使用分区键标识节点?谢谢@Aaron的澄清。这描述了column store和column-family-store之间的良好区别。感谢@Aaron的澄清。这说明了列存储和列族存储之间的良好区别。