【问题标题】:How Cassandra manage insertion, update and Deletion of column and Column data. internallyCassandra 如何管理列和列数据的插入、更新和删除。内部
【发布时间】:2014-08-06 00:07:49
【问题描述】:

实际上,我对一些关于 cassandra 的概念感到困惑。

  1. 更新 Cassandra 行实际上是什么意思?这是否意味着在列的值中添加更多列或更新。还是两者兼有。?
  2. 当我们向一行添加更多列时。 sstable 中的前一行是否无效,并且新行条目与新添加的行一起插入到 SSTABLE 中。?
  3. 由于 SSTable 是不可变的,因此列数据中的每次新更新或列数据的添加或列数据的删除都会导致前一行无效并插入一个包含所有前一列+新列的新行?

请帮忙..

【问题讨论】:

  • 这是 3 个广泛的问题。请提出具体问题。

标签: cassandra cql3


【解决方案1】:

更新 Cassandra 行实际上是什么意思?是不是意味着添加 更多列或列值的更新。还是两者兼而有之?

在 cassandra 中,更新一行和插入一行是相同的操作,bot 会导致将数据添加到 memtable(内存中的 sstable),后者会刷新到磁盘并成为 sstable(还有一条日志行被写入如果启用了持久写入,则提交日志)。如果您插入已经存在的列(顺便说一句,在 cassandra 术语中,列与单元格相同,并且行称为分区,如果您进一步阅读,您可能会发现这很有用),例如:

INSERT INTO db.tbl (id, value) VALUES ('text_id1', 'some text as a value');
INSERT INTO db.tbl (id, value) VALUES ('text_id1', 'some text as a value');

您最终会得到 1 个分区,因为第一个分区被第二个插入覆盖。这意味着插入具有重复键的分区会导致前一个被覆盖(并且覆盖基于插入时的时间戳,最后写入获胜)。

当我们向行(分区)添加更多列(单元格)时。是个 sstable 中的前一行无效,新行条目为 用新添加的行插入到 SSTABLE 中。?

对于 cql,前面的列将只包含一个 null 值。不会发生失效,您可以随意更改模式。如果您删除一列,其数据将在下一次压缩期间被删除,目的是回收磁盘空间。

由于 SSTable 是不可变的,因此列数据中的每次新更新或 添加列或删除列数据将导致 使前一行无效并插入一个包含所有 上一列+新列?

某种情况下,sstables 会在必要时合并到更大的 sstables 中,如何完成取决于正在使用的压缩策略。有两种口味,尺寸分层和平整压实。涵盖它们的工作原理是一个完全独立的问题,比我聪明的人已经回答了have a read here

【讨论】:

  • 很好的解释。谢谢
【解决方案2】:

此处介绍了更新: http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_write_update_c.html

正如您所注意到的,SSTable 是不可变的,因此您可能想知道当以后的写入取代 SSTable 中已有的数据时会发生什么。存储引擎从所有可能包含请求行数据的表中读取数据(由每个表的布隆过滤器确定)。了解读取路径可能会为您澄清这一点: http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_about_reads_c.html 具体来说: http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_about_read_path_c.html

【讨论】:

  • 感谢您的链接。这真的很有帮助。 @Adam 当我阅读第一个链接时,我脑海中浮现出一个问题。内存中的每个 SStable 是否都有由 Cassandra 为特定 SSTABLE 的持久分区维护的单独密钥缓存??
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多