如何刪除數據?
刪除數據的過程旨在提高性能,並與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語句立即刪除。