墓碑是卡桑德拉阵列中的一个问题吗?
Are tombstones an inssue in cassandra array?
我正在尝试调查使用 cassandra 数组对性能的影响。
根据我的实验,cassandra 在插入或不增量更新数组(非冻结)时生成墓碑。
然而,根据 cqlsh 跟踪输出,墓碑未被读取,因此它们不应该对性能产生任何影响......?
CREATE TABLE tomb_test (id text PRIMARY KEY, events list<text>);
insert into tomb_test (id, events) values ('1', ['A', 'B']);
bin$ nodetool flush
-- you can see there is "marked_deleted" tombstone for events array
sstabledump node1/data0/spark/test-ef990510057b11e98254712032ed3bea/mc-1-big-Data.db
[
{
"partition" : {
"key" : [ "1" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 62,
"liveness_info" : { "tstamp" : "2018-12-24T14:04:07.188625Z" },
"cells" : [
{ "name" : "events", "deletion_info" : { "marked_deleted" : "2018-12-24T14:04:07.188624Z", "local_delete_time" : "2018-12-24T14:04:07Z" } },
{ "name" : "events", "path" : [ "c7481be0-0784-11e9-8254-712032ed3bea" ], "value" : "A" },
{ "name" : "events", "path" : [ "c7481be1-0784-11e9-8254-712032ed3bea" ], "value" : "B" }
]
}
]
}
]
cqlsh:spark> tracing on
cqlsh:spark> select * from tomb_test ;
-- however when reading from tomb_test, no tombstones are scanned
Read 1 live rows and 0 tombstone cells [ReadStage-3] | 2018-12-24 15:07:02.445000 | 127.0.0.1 | 8357 | 127.0.0.1
PS:table创建冻结列表类型时,不创建墓碑
CREATE TABLE tomb_test (id text PRIMARY KEY, events frozen<list<text>>);
卡桑德拉版本:3.11.3
由于您设置了列表的值(而不是附加到它),因此插入需要删除该列表的所有先前单元格,因为每个条目都是一个单元格并且写入不执行任何读取。这个删除是范围墓碑,删除整行单元格,而不是单个单元格墓碑。这会隐藏事件列表中的所有先前数据。
注意:对于冻结集合,整个集合在单个单元格中序列化,因此它会被覆盖,无需删除。
Read 1 live rows and 0 tombstone cells
有点误导,它实际上确实读取了范围墓碑,但没有单元格墓碑。我认为范围墓碑已添加到 CASSANDRA-8527 中,但在许多当前版本的 cassandra 上它们不会。
我正在尝试调查使用 cassandra 数组对性能的影响。 根据我的实验,cassandra 在插入或不增量更新数组(非冻结)时生成墓碑。 然而,根据 cqlsh 跟踪输出,墓碑未被读取,因此它们不应该对性能产生任何影响......?
CREATE TABLE tomb_test (id text PRIMARY KEY, events list<text>);
insert into tomb_test (id, events) values ('1', ['A', 'B']);
bin$ nodetool flush
-- you can see there is "marked_deleted" tombstone for events array
sstabledump node1/data0/spark/test-ef990510057b11e98254712032ed3bea/mc-1-big-Data.db
[
{
"partition" : {
"key" : [ "1" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 62,
"liveness_info" : { "tstamp" : "2018-12-24T14:04:07.188625Z" },
"cells" : [
{ "name" : "events", "deletion_info" : { "marked_deleted" : "2018-12-24T14:04:07.188624Z", "local_delete_time" : "2018-12-24T14:04:07Z" } },
{ "name" : "events", "path" : [ "c7481be0-0784-11e9-8254-712032ed3bea" ], "value" : "A" },
{ "name" : "events", "path" : [ "c7481be1-0784-11e9-8254-712032ed3bea" ], "value" : "B" }
]
}
]
}
]
cqlsh:spark> tracing on
cqlsh:spark> select * from tomb_test ;
-- however when reading from tomb_test, no tombstones are scanned
Read 1 live rows and 0 tombstone cells [ReadStage-3] | 2018-12-24 15:07:02.445000 | 127.0.0.1 | 8357 | 127.0.0.1
PS:table创建冻结列表类型时,不创建墓碑
CREATE TABLE tomb_test (id text PRIMARY KEY, events frozen<list<text>>);
卡桑德拉版本:3.11.3
由于您设置了列表的值(而不是附加到它),因此插入需要删除该列表的所有先前单元格,因为每个条目都是一个单元格并且写入不执行任何读取。这个删除是范围墓碑,删除整行单元格,而不是单个单元格墓碑。这会隐藏事件列表中的所有先前数据。
注意:对于冻结集合,整个集合在单个单元格中序列化,因此它会被覆盖,无需删除。
Read 1 live rows and 0 tombstone cells
有点误导,它实际上确实读取了范围墓碑,但没有单元格墓碑。我认为范围墓碑已添加到 CASSANDRA-8527 中,但在许多当前版本的 cassandra 上它们不会。