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
- 参考代码:
123-- 其他行可以不包含firstname,lastname 这两个列DELETE firstname, lastname FROM cycling.cyclist_nameWHERE firstname = 'Alex';
- 使用Timestamp来删除
- 就像之前我们提到Cassandra的一个列之中,还包含了时间戳(Timestamp)
- 我们也可以按照时间戳来删除一条数据。
- 参考代码:
12345-- timestamp <= 1318452291034 的数据都会被删除DELETE firstname, lastnameFROM cycling.cyclist_nameUSING TIMESTAMP 1318452291034WHERE lastname = 'VOS';
- 删除Collection 之中的一个值
- 之前我们也提到:Cassandra数据类型支持List / Set / Map
- 同样,我们也支持从这3种类型删除其中一个值。
- 参考下面的代码:
-
12345678910111213-- 从Map之中根据Key删除DELETE sponsorship ['sponsor_name']FROM cycling.racesWHERE race_name = 'Criterium du Dauphine';-- 根据List下标进行删除DELETE categories[3] FROM cycling.cyclist_historyWHERE lastname = 'TIRALONGO';-- 直接从Set之中删除一个值UPDATE usersSET emails = emails - {'fb@friendsofmordor.org'}WHERE user_id = 'frodo';
- 关于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

文章评论