Cassandra如何将列数据存储在磁盘上?

时间:2020-02-29 10:15:38

标签: cassandra

说我按以下顺序在卡桑德拉中插入三行

ID,firstname, lastname, websitename 1:fname1, lname1, site1 2:fname2, lname2, site2 3:fname3, lname3, site3

列存储将列存储在一起,如下所示:

1:fname1,2:fname2,3:fname3 1:lname1,2:lname2,3:lname3 1:site1,2:site2,3:site3

这是否意味着当我插入第一行,即1:fname1, lname1, site1时,它将为所有三列将每一列放在单独的磁盘块中,以便 在firstname列中必须在某些查询中读取。所有相关的列数据都在单个块上?

因为Cassandra必须将数据存储在3个块中,而不是将其存储在3个块中以确保将列数据组合在一起,这不会使写入变慢吗?

3 个答案:

答案 0 :(得分:1)

Cassandra不是经典的列存储。它将所有插入/更新的数据存储在一起,首先按分区键组织,然后按群集列/主键在分区内。在不同的时间点更新数据时,数据可能位于不同的SSTables中,但是压缩过程最终将尝试将它们合并在一起。

如果您有兴趣,可以对数据文件使用const,并查看数据的存储方式。还有一个very good blog post from The Last Pickle about storage engine in the Cassandra 3.0(与以前的版本不同)。

答案 1 :(得分:1)

Cassandra不是面向列的数据库,而是分区行存储,这意味着示例中的数据将按以下方式存储: >

 "YourTable" : {
   row1 : { "ID":1, "firstname":"fname1", "lastname":"lname1", "websitename":"site1", "timestamp":1582988571},
   row2 : { "ID":2, "firstname":"fname2", "lastname":"lname2", "websitename":"site2", "timestamp":1582989563}
   row3 : { "ID":3, "firstname":"fname3", "lastname":"lname3", "websitename":"site3", "timestamp":1582989572}
   ...
 }

根据主键(分区键,可以包含一个或多个聚类键)对数据进行分组和搜索。

要考虑的一些事情:

  • Cassandra是仅用于追加的存储,这意味着当您尝试更新或删除记录时,它将在内部创建具有新值和不同时间戳的新记录。对于删除操作,它将添加一个称为“墓碑”的元数据,用于标识将要删除的记录
  • 在集群中添加或删除节点将触发令牌分配的重新排列,这意味着可以定位或维护记录的实例或服务器可能会发生变化

答案 2 :(得分:0)

Cassandra基本上是一个列族数据库或行分区数据库,并且具有列信息,而不是基于列/基于列/列的数据库。在插入/获取时,我们需要提及partition(aka行键,aka主键)列信息。我们可以在任何时间添加任何列。

像Cassandra这样的列族存储非常有用,如果您具有高吞吐量写入并且希望能够线性地水平扩展。

术语“列族”来自原始存储引擎,它是键/值存储,其中值是列/值元组的“族”。每个键可以具有的列数没有硬性限制。

相关问题