物件刪除
概觀
此頁面總結了 DELETE
操作如何根據包含物件的儲存貯體組態影響物件。
以下任何因素的組合都可能影響 DELETE
操作的運作方式
權限
MinIO 使用 基於原則的存取控制 系統進行存取管理。使用者或服務帳戶必須提供正確的原則動作和條件,才能允許對儲存貯體和物件進行 DELETE
操作。
未版本化的物件
在未啟用版本控制的儲存貯體中對物件執行 DELETE
操作時,操作非常簡單。在驗證使用者或服務帳戶有權執行 DELETE
操作後,MinIO 會永久移除物件。
請求刪除動作的使用者或服務帳戶必須具有儲存貯體和物件的 s3:DeleteObject
動作權限。
已版本化的物件
當物件被版本化時,DELETE
操作的運作方式不同。
使用者或服務帳戶必須具有儲存貯體和物件的 s3:DeleteObjectVersion
動作權限。
對目前版本執行刪除操作
對未指定版本 UUID 的已版本化物件執行 DELETE
操作,會導致建立一個 DeleteMarker
作為物件的 head
。
在此情境中,MinIO 實際上不會從磁碟中移除物件或其任何版本。物件的所有現有版本仍然可以透過指定版本的 UUID 來存取。當 DeleteMarker
是物件的 head 時,MinIO 不會為未指定版本 ID 的 GET
請求提供物件。相反地,MinIO 會傳回類似 404
的回應。
您可以使用 mc ls --versions
找到物件版本的 UUID。
若要從硬碟中移除物件的目前版本,請先找出該版本的 UUID,然後使用 mc rm --version-id=UUID ...
刪除目前版本。在這種情況下,緊接在前的一個物件版本會成為目前版本,並用於針對未指定 UUID 的物件發出的 GET
請求。
警告
在 DELETE 操作中指定 version-id
是不可逆的。MinIO 會將指定的版本從硬碟中移除,且無法還原。
對先前版本的刪除操作
若要刪除物件的先前版本,請指定該版本的 UUID。您可以使用 mc ls --versions
取得版本 UUID。當 DELETE
請求指定了 version-id
且使用者具有刪除物件版本的正確權限時,MinIO 會從硬碟中永久移除指定的版本。
警告
在 DELETE 操作中指定 version-id
是不可逆的。MinIO 會將指定的版本從硬碟中移除,且無法還原。
刪除所有版本
使用 mc rm --versions
刪除物件的所有版本。此操作不可逆。
生命週期管理到期
您可以定義一個或多個生命週期管理到期規則,以便在達到特定版本數量或經過特定時間後使物件到期。當現有的版本多於規則指定的版本數量,或版本早於指定的時間時,MinIO 會從硬碟中永久移除物件版本。
這些規則依賴掃描器來處理儲存貯體的規則。掃描器作為一個較低優先順序的持續程序運行,其中 READ
和 WRITE
操作具有較高的優先權。因此,符合到期要求的物件版本可能不會立即從 MinIO 中移除。
請參閱掃描器頁面,了解有關掃描器如何運作以及組態選項的更多詳細資訊。
DeleteMarkers
是它們自己的物件。生命週期規則可以移除只剩下它們物件的 DeleteMarkers
。
在 MinIO 版本中變更:RELEASE.2024-05-01T01-11-10Z
透過 JSON
,生命週期規則可以在指定的日期數後移除已刪除物件的所有版本。
保留的物件
MinIO 會保護受鎖定規則約束的物件,使其不被覆寫或刪除。這些規則要求物件必須保留到規則到期或移除為止。
對鎖定物件執行未指定版本的 DELETE
操作會為該物件建立一個 DeleteMarker。但是,物件版本本身會依據鎖定的要求保留。
指定物件版本的 DELETE
操作受保留規則的約束。MinIO 會保護受鎖定約束的物件版本,使其不被覆寫或刪除,直到鎖定到期或移除為止。
已複寫的物件
複寫會將物件從一個位置複製到另一個位置。MinIO 支援在儲存貯體層級或叢集(「站點」)層級進行複寫。
刪除操作是否會複寫可能取決於複寫的類型以及複寫的組態方式。
站點複寫
對於啟用多站點複寫的叢集,MinIO 會將任何叢集上執行的所有 delete
操作複寫到同儕群組中的其他每個叢集。
任何單一同儕上的刪除行為都遵循與任何 MinIO 部署相同的程序。
儲存貯體複寫
透過儲存貯體複寫,MinIO 支援在來源儲存貯體和已組態的遠端儲存貯體之間複寫刪除操作。MinIO 會同步刪除特定的物件版本以及新的 刪除標記。刪除操作複寫使用與所有其他複寫操作相同的複寫程序。
MinIO 要求明確啟用版本化刪除和刪除標記複寫。使用 mc replicate add --replicate
欄位,指定 delete
和 delete-marker
或兩者,以分別啟用版本化刪除和刪除標記複寫。若要啟用兩者,請使用逗號分隔符號指定兩個字串:delete,delete-marker
。
對於刪除標記複寫,MinIO 會在刪除操作建立刪除標記後開始複寫程序。MinIO 使用 X-Minio-Replication-DeleteMarker-Status
中繼資料欄位來追蹤刪除標記複寫狀態。在主動-主動複寫組態中,如果兩個叢集同時為物件建立刪除標記,或者如果一個或兩個叢集在複寫事件同步之前已關閉,則 MinIO 可能會產生重複的刪除標記。
對於複寫特定物件版本的刪除,MinIO 會將物件版本標記為 PENDING
,直到複寫完成。遠端目標刪除該物件版本後,MinIO 會刪除來源上的物件版本。雖然此程序可確保近乎同步的版本刪除,但可能會導致在初始刪除操作後,清單操作傳回物件版本。MinIO 使用 X-Minio-Replication-Delete-Status
來追蹤刪除版本複寫狀態。
MinIO 僅複寫明確的用戶端驅動刪除操作。MinIO 不會複寫生命週期管理到期規則刪除的物件。對於主動-主動組態,請在所有複寫儲存貯體上設定相同的到期規則,以確保物件到期的應用一致。
MinIO 會修剪來源和遠端儲存貯體上的空白物件前綴
如果刪除操作移除儲存貯體前綴中的最後一個物件,MinIO 會以遞迴方式移除前綴的每個空白部分,直到儲存貯體根目錄。MinIO 僅將遞迴移除應用於隱含地作為物件寫入操作一部分建立的前綴。MinIO 不會以遞迴方式移除使用明確的目錄建立命令(例如 mc mb
)建立的前綴。
如果複寫規則啟用複寫刪除操作,則複寫程序也會在目標 MinIO 叢集上應用隱含的前綴修剪行為。
例如,考慮具有以下物件前綴的儲存貯體 photos
photos/2021/january/myphoto.jpg
//2021/january/
根據物件名稱隱含建立photos/2021/february/myotherphoto.jpg
//2021/february/
根據物件名稱隱含建立photos/NYE21/NewYears.jpg
//NYE21/
在儲存貯體中明確建立
photos/NYE21
是唯一使用 mc mb
明確建立的前綴。所有其他前綴都作為寫入該前綴位置的物件的一部分隱含地建立。
一個命令移除
myphoto.jpg
。MinIO 會自動修剪空白的/january/
前綴。然後,一個命令移除
myotherphoto.jpg
。MinIO 會自動修剪/february/
前綴和現在為空白的/2021
前綴。一個命令移除
NewYears.jpg
物件。MinIO 會保留/NYE21/
前綴,因為它是明確建立的。