依據AWS S3,沒有定義重新命名物件的操作。
本文有如下假定:
- 物件儲存服務基於檔案語義實現。
介面定義
依據前述,業界主流物件儲存服務比如AWS S3並未定義重新命名物件的操作,而國內的各家公有云物件儲存服務,提供了物件的重新命名操作。
國內的公有云物件儲存服務,相關操作的文件的連結(排名不分先後),如下:
- 華為雲OBS
- 火山引擎
以華為雲OBS的重新命名物件為例,介面定義如下:
POST /ObjectName?name=Name&rename HTTP/1.1
Host: bucketname.obs.region.myhuaweicloud.com
Authorization: authorization
Date: date
本介面的關鍵引數,如下:
- 物件名,指定物件名。
- 目標物件名,指定修改後的物件名。
- 操作名,引數名為
rename
,不需要指定引數值。
實現思路
重新命名物件的操作,採用Linux命令模擬時,可以有如下方式:
- 方案一,即先複製、再刪除原檔案。
cp A B rm -f A
- 方案二,移動檔案。
mv A B
不涉及檔案系統中inode
的變化,僅處理檔案系統中目錄的後設資料,因此基本不受檔案大小的影響。
ETag
參考AWS S3資料一致性,ETag
基於物件的資料,使用MD5
演算法計算得到。
由於修改名稱不涉及資料的變更,因此無需更新物件的ETag
。
多版本
按照AWS S3多版本中的說明,多版本特性的開關作用在桶級,包含如下狀態:
Buckets can be in one of three states:
- Unversioned (the default)
- Versioning-enabled
- Versioning-suspended
原物件關聯的所有版本,均需要關聯到最新的物件名。
分級
參考AWS S3 歸檔和AWS S3 分級中的說明,處於歸檔狀態的物件,需要先取回才能訪問。
顯而易見,此處為了維護物件語義,照顧物件儲存服務的實現,當物件處於歸檔狀態時,不允許更新物件。
WORM
參考AWS S3 Object Lock中的說明,開啟WORM後:
- 在保護期內的物件,不允許修改,不允許刪除。
- 在保護期外的物件,不允許修改,允許刪除。
因此從維護物件語義的角度講,在保護期內的物件、保護期外的物件,均不允許修改物件。
生命週期
參考AWS S3 Lifecycle,修改後設資料操作的物件可能符合生命週期規則,從而被恰好正在執行的後臺任務刪除掉。
此時有如下選擇:
- 生命週期的後臺任務具備更高的優先順序,提前中斷操作,正常刪除掉物件,物件儲存服務對客戶應用返回操作失敗。
- 生命週期的後臺任務優先順序相對較低,跳過當前物件,待下次執行時再決策是否刪除。
資料加密
依據SSE-C的說明,客戶應用在執行PUT/GET/Head/Copy操作時,均需要提供加密資料的金鑰。
即在發起請求時,提供如下頭部:
x-amz-copy-source-server-side-encryption-customer-algorithm
x-amz-copy-source-server-side-encryption-customer-key
x-amz-copy-source-server-side-encryption-customer-key-MD5
如前所述,本操作只涉及物件名的變更,不涉及後設資料和資料的變化,因此不涉及加密的處理。
事件通知
依據AWS S3 事件通知中的說明,物件儲存服務可以提供事件通知,目前支援的事件型別見文件,顯然不包括重新命名操作,可以擴充套件事件名,比如s3:ObjectUpdated:Put
。
併發一致性
依據AWS S3 data consistency model的說明,物件儲存服務提供read-after-write
的模型。
當多客戶端對相同物件併發的發起重新命名操作時,參照檔案語義,提供最終一致性。