如何删除数据?
删除数据的过程旨在提高性能,并与Apache Cassandra™(DDAC)数据库的DataStax Distribution内置属性(用于数据分发和容错)一起使用。
数据库将删除视为插入或向上插入。在DELETE命令中添加到分区的数据是一个删除标记,称为逻辑删除。逻辑删除通过写路径,并被写入一个或多个节点上的SSTables中。逻辑删除的一个关键区别是由gc_grace_seconds设置的内置有效期,称为宽限期。在其有效期结束时,该墓碑将作为常规压实过程的一部分被删除。
用生存时间(TTL)值标记记录(行或列)表示在指定时间结束时,数据库用逻辑删除标记该记录,并像处理其他逻辑删除的记录一样处理该记录。
分布式系统中的删除
在多节点集群中,Cassandra 数据库可以在两个或多个节点上存储相同数据的副本。这有助于防止数据丢失,但会使删除过程复杂化。如果节点收到对其本地存储的数据的删除,则该节点会将指定的记录标记为删除,然后尝试将逻辑删除传递给包含该记录副本的其他节点。如果此时一个副本节点无响应,则它不会立即收到该逻辑删除,因此它仍包含记录的预删除版本。如果逻辑删除已在该节点恢复之前从集群的其余部分删除,则数据库会将恢复的节点上的记录视为新数据,并将其传播到集群的其余部分。这种已删除但持久的记录称为僵尸。
为了防止僵尸再次出现,数据库为每个墓碑提供了宽限期。宽限期的目的是使无响应的节点有时间恢复和正常处理逻辑删除。当多个副本答案是读取请求的一部分,并且这些响应不同时,则以最新的值为准。例如,如果一个节点具有逻辑删除,但另一个节点具有较新的更改,则最终结果将包括较新的更改。
如果一个节点具有逻辑删除,而另一个节点的记录只有较旧的值,则最终记录将具有逻辑删除。如果客户端在宽限期内将新更新写入逻辑删除,则数据库将覆盖逻辑删除。
当无响应的节点恢复时,Cassandra使用提示的切换来重播该节点关闭时丢失的数据库突变。Cassandra不会在宽限期内重播墓碑的变异。如果该节点直到宽限期结束后才恢复,则可能会错过删除操作。
逻辑删除的宽限期结束后,Cassandra会在压缩过程中删除该逻辑删除。
有关删除的更多信息
逻辑删除的宽限期由gc_grace_seconds属性设置。默认值为864,000秒(十天),并且每个表可以为此属性设置其自己的值。在单节点群集上,可以将该属性安全地设置为零。
- 逻辑删除的到期日期/时间是其创建的日期/时间加上gc_grace_seconds属性的值。
- 为了完全防止僵尸记录再次出现,请在节点恢复后在节点上运行nodetool repair,并在每个表上按gc_grace_seconds设置的每个间隔运行。
如果表中的所有记录在创建时都被赋予了TTL,被允许过期且未被手动删除,则无需定期对该表运行nodetool repair。欲了解更多信息,与TTL到期数据,请参见与TTL过期的数据。
Cassandra还支持批量数据插入和更新。此过程带来了在从集群的其余部分删除记录后重播记录插入的危险。Cassandra不会重播仍处于宽限期内的墓碑的批量突变。
Cassandra支持通过DROP KEYSPACE和DROP TABLE语句立即删除。