[Cassandra教程](十一) 深入NoSQL的数据删除

0. 引言

NoSQL 在设计理念上面就与传统的RDBMS就不一样,因此删除数据的处理方式非常不一样。然而,虽然NoSQL的选择很多,但是在数据删除的处理方式上,各家的处理方法又有很多共通的地方。

本文将带着大家以Cassandra为例,深入了解NoSQL是如何 来删除数据的。

原文链接:http://www.flyml.net/2016/09/18/cassandra-tutorial-dive-deep-into-data-deletion-in-nosql/

1. Cassandra 删除数据原理

在Cassandra之中,当我们通过API删除一条数据的时候,实际上并不是马上将数据从存储介质之中删除,而是给其设置一个墓碑(tombstone), 并在一段时间之后自动删除。对于更新数据也是类似的操作,差别只是最后是否再写入一条数据而已。

在查询的时候,如果碰到有Tombstone的记录就会自动忽略~

上面提到的“Cassandra的自动删除”机制,其实就是Cassandra 的Periodic Compaction

原文链接:http://www.flyml.net/2016/09/18/cassandra-tutorial-dive-deep-into-data-deletion-in-nosql/

2. Compaction(压缩、夯实)

Compaction对Cassandra的正常运行非常关键, 其主要作用:

(1)合并、整理SSTable使得读达到最终一致性

(2)回收被废弃数据占用的空间并提高Read效率(因为没有无效的数据了)

问题: SSTable 是什么?

SSTable并不是Cassandra倒腾出来的概念,包括Compaction也是。 这个根据我的理解,应该是从Google BigTable 引用出来的概念。可以参考:
http://www.blogjava.net/DLevin/archive/2015/09/25/427481.html

工作过程:

(1) 将SSTable之中Partition Key 相同的记录合并起来

(2)保留Timestamp 最新的数据

(3)删除标记了tombstone的数据

(4)将整理之后的数据写到一个新的SSTable之中,并删除老的SSTable

 

 

吐槽:上面的图是从官方爬过来的,个人认为这幅图上面的颜色与数字缺乏图例,让我很不理解。。。只不过对比第一个圈跟最后一个圈,还是能说明compaction的目的

Compaction 里面还有很多其他需要学习的东西,比如策略以及哪种测试适合什么样的情况。 还有其他的关于Compaction 更详细的描述,请参考:How is data maintained?

原文链接:http://www.flyml.net/2016/09/18/cassandra-tutorial-dive-deep-into-data-deletion-in-nosql/

3. 使用CQL来删除数据

Cql 本身与SQL很类似,在这里将挑选一些相比普通SQL比较有趣的东西介绍给大家

  • 删除一个列
    • 注意:Cassandra这种列式数据库的列跟RDBMS的列的概念是不一样的。这里的删除一个列,可以理解为将RDBMS的一个单元格设置为null
    • 参考代码:

       
  • 使用Timestamp来删除
    • 就像之前我们提到Cassandra的一个列之中,还包含了时间戳(Timestamp)
    • 我们也可以按照时间戳来删除一条数据。
    • 参考代码:

       
  • 删除Collection 之中的一个值
    • 之前我们也提到:Cassandra数据类型支持List / Set / Map
    • 同样,我们也支持从这3种类型删除其中一个值。
    • 参考下面的代码:

    •  
    • 关于CQL之中如何处理list / set / map ,可以参考下面url:

 

原文链接:http://www.flyml.net/2016/09/18/cassandra-tutorial-dive-deep-into-data-deletion-in-nosql/

4. 使用TTL来删除数据

TTL : Time to live. 即设置数据的生存时间。 当数据的生存时间超过这个数值的时候,就会被自动删除。如果在这个期间,数据被更新并且重新设置TTL,其生存时间也会相应的被更新。

问题: 如果在这个期间数据被更新,但是TTL没被更新, 其生存时间是否更新?

答:TTL跟Timestamp一样,也属于Column之中的一个属性。 更新其他字段的值并不会影响TTL,除非明确更新TTL字段。

原文链接:http://www.flyml.net/2016/09/18/cassandra-tutorial-dive-deep-into-data-deletion-in-nosql/

5. 后记

Cassandra用到的几种策略,笔者并不知道是否原创,只不过在很多其他的NoSQL之中也有类似的机制。比如:

  • Redis 经常使用TTL来自动删除过期缓存
  • MongoDB / HBase也使用了墓碑标志的机制

因此,深入了解Cassandra是如何删除数据的,也非常有助于理解其他的NoSQL的数据删除机制。并且我们也看到了在NoSQL设计理念之下的Cassandra在数据删除方面与传统RDBMS是非常非常的不同

原文链接:http://www.flyml.net/2016/09/18/cassandra-tutorial-dive-deep-into-data-deletion-in-nosql/

本文为原创文章,转载请注明出处:http://www.flyml.net

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注