[翻译]关于Cassandra中的删除和墓碑(三)

保存墓碑(原文Tombstones to the rescue 墓碑营救?)

在Cassandra语境中,墓碑是一种特殊的数据和普通数据一样存储,一个删除操作,就是写入一个墓碑。当Cassandra读取数据的时候,它会合并这些内存里或者磁盘上写入的数据行。然后使用一种最新写入胜出(LWW)算法选择出正确的数据,不管它是个标准写入的数据,还是一个墓碑。

举例:

我们看下接下来的例子,背景是Cassandra 3.7集群,有3个节点(通过ccm创建的,译者注:ccm是个脚本程序可以快速的删除创建一个小Cassandra集群,github地址是:https://github.com/pcmanus/ccm)

CREATE KEYSPACE tlp_lab WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘datacenter1’ : 3};
CREATE TABLE tlp_lab.tombstones (fruit text, date text, crates set<int>, PRIMARY KEY (fruit, date));

插入一些数据,每天创建一些水果(译者注:表里的字段的含义),如下:
INSERT INTO tlp_lab.tombstones (fruit, date, crates) VALUES (‘apple’, ‘20160616’, {1,2,3,4,5});
INSERT INTO tlp_lab.tombstones (fruit, date, crates) VALUES (‘apple’, ‘20160617’, {1,2,3});
INSERT INTO tlp_lab.tombstones (fruit, date, crates) VALUES (‘pickles’, ‘20160616’, {6,7,8}) USING TTL 2592000;

下面就是我们存储的数据:

alain$ echo “SELECT * FROM tlp_lab.tombstones LIMIT 100;” | cqlsh

fruit   | date     | crates
———+———-+—————–
apple   | 20160616 | {1, 2, 3, 4, 5}
apple   | 20160617 |       {1, 2, 3}
pickles | 20160616 |       {6, 7, 8}

现在我们需要手动刷新数据(即写入一个磁盘文件,同时释放内存),在内存里的墓碑,更确切讲是在memtable(译者注:数据在磁盘上的文件叫sstable,在内存里的数据结构叫memtable)里的墓碑,会覆盖已经在内存里的数据,这和磁盘上的sstable还不一样.(译者注:磁盘里写入以后,文件就不能改变了,内存里如果你刚刚写入,然后再去删除,删除插入的墓碑可能会优化,覆盖之前的数据,最后合并后写入磁盘。这里执行一下刷新到磁盘,可以更方便你理解墓碑原理)。

刷新的操作:
nodetool -p 7100 flush

我们会在磁盘上看到:
alain$ ll /Users/alain/.ccm/Cassa-3.7/node1/data/tlp_lab/tombstones-c379952033d311e6aa4261d6a7221ccb/
total 72
drwxr-xr-x  11 alain  staff   374 Jun 16 20:53 .
drwxr-xr-x   3 alain  staff   102 Jun 16 20:25 ..
drwxr-xr-x   2 alain  staff    68 Jun 16 17:05 backups
-rw-r–r–   1 alain  staff    43 Jun 16 20:53 mb-5-big-CompressionInfo.db
-rw-r–r–   1 alain  staff   127 Jun 16 20:53 mb-5-big-Data.db
-rw-r–r–   1 alain  staff    10 Jun 16 20:53 mb-5-big-Digest.crc32
-rw-r–r–   1 alain  staff    16 Jun 16 20:53 mb-5-big-Filter.db
-rw-r–r–   1 alain  staff    20 Jun 16 20:53 mb-5-big-Index.db
-rw-r–r–   1 alain  staff  4740 Jun 16 20:53 mb-5-big-Statistics.db
-rw-r–r–   1 alain  staff    61 Jun 16 20:53 mb-5-big-Summary.db
-rw-r–r–   1 alain  staff    92 Jun 16 20:53 mb-5-big-TOC.txt

为了得到可以方便阅读的格式,我们需要用SSTabledump工具对这个sstable文件进行个转换:

alain$ SSTabledump /Users/alain/.ccm/Cassa-3.7/node1/data/tlp_lab/tombstones-c379952033d311e6aa4261d6a7221ccb/mb-5-big-Data.db
[
  {
    “partition” : {
      “key” : [ “apple” ],
      “position” : 0
    },
    “rows” : [
      {
        “type” : “row”,
        “position” : 19,
        “clustering” : [ “20160616” ],
        “liveness_info” : { “tstamp” : “2016-06-16T18:52:41.900451Z” },
        “cells” : [
          { “name” : “crates”, “deletion_info” : { “marked_deleted” : “2016-06-16T18:52:41.900450Z”, “local_delete_time” : “2016-06-16T18:52:41Z” } },
          { “name” : “crates”, “path” : [ “1” ], “value” : “” },
          { “name” : “crates”, “path” : [ “2” ], “value” : “” },
          { “name” : “crates”, “path” : [ “3” ], “value” : “” },
          { “name” : “crates”, “path” : [ “4” ], “value” : “” },
          { “name” : “crates”, “path” : [ “5” ], “value” : “” }
        ]
      },
      {
        “type” : “row”,
        “position” : 66,
        “clustering” : [ “20160617” ],
        “liveness_info” : { “tstamp” : “2016-06-16T18:52:41.902093Z” },
        “cells” : [
          { “name” : “crates”, “deletion_info” : { “marked_deleted” : “2016-06-16T18:52:41.902092Z”, “local_delete_time” : “2016-06-16T18:52:41Z” } },
          { “name” : “crates”, “path” : [ “1” ], “value” : “” },
          { “name” : “crates”, “path” : [ “2” ], “value” : “” },
          { “name” : “crates”, “path” : [ “3” ], “value” : “” }
        ]
      }
    ]
  },
  {
    “partition” : {
      “key” : [ “pickles” ],
      “position” : 104
    },
    “rows” : [
      {
        “type” : “row”,
        “position” : 125,
        “clustering” : [ “20160616” ],
        “liveness_info” : { “tstamp” : “2016-06-16T18:52:41.903751Z”, “ttl” : 2592000, “expires_at” : “2016-07-16T18:52:41Z”, “expired” : false },
        “cells” : [
          { “name” : “crates”, “deletion_info” : { “marked_deleted” : “2016-06-16T18:52:41.903750Z”, “local_delete_time” : “2016-06-16T18:52:41Z” } },
          { “name” : “crates”, “path” : [ “6” ], “value” : “” },
          { “name” : “crates”, “path” : [ “7” ], “value” : “” },
          { “name” : “crates”, “path” : [ “8” ], “value” : “” }
        ]
      }
    ]
  }
]

现在两个分区键数据 (3 行, 其中两行有共同的分区主键) 已经存到磁盘上了。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *