您可以使用 Storage 移轉服務,在 Cloud Storage bucket 之間移轉大量資料,無論這些 bucket 位於同一個 Google Cloud 專案,還是不同專案。
在許多情況下,儲存空間遷移都很有用。可用於合併不同專案的資料、將資料移至備份位置,或變更資料位置。
使用 Storage 移轉服務的時機
Google Cloud 提供多種選項,可在 Cloud Storage 值區之間轉移資料。建議遵循下列準則:
轉移容量小於 1 TB:使用
gcloud
。如需操作說明,請參閱「移動及重新命名值區」。移轉超過 1 TB 的資料:請使用 Storage 移轉服務。Storage 移轉服務是受管理移轉選項,可提供開箱即用的安全性、可靠性和效能。因此不必最佳化及維護指令碼,也不必處理重試。
本指南將探討使用 Storage 移轉服務在 Cloud Storage bucket 之間轉移資料的最佳做法。
定義轉移策略
轉移策略取決於情況的複雜程度。請務必在計畫中納入下列考量。
選擇 bucket 名稱
如要將資料移至不同位置的儲存空間值區,請選擇下列其中一種方法:
- 新的 bucket 名稱。更新應用程式,指向名稱不同的儲存空間 bucket。
- 保留 bucket 名稱。更換儲存空間值區,保留目前名稱,這樣就不必更新應用程式。
無論是哪種情況,您都應規劃停機時間,並適時通知使用者即將停機。請參閱下列說明,瞭解哪種選擇最適合您。
新值區名稱
使用新的值區名稱時,您需要更新所有使用目前值區的程式碼和服務。具體做法取決於應用程式的建構和部署方式。
對於某些設定,這種方法可能停機時間較短,但需要更多工作才能確保順利轉換。其中包含下列步驟:
- 將資料複製到新的儲存空間 bucket。
- 開始休息。
- 更新應用程式,使其指向新的值區。
- 確認所有項目皆依照預期運作,而且所有相關系統和帳戶都能存取 bucket。
- 刪除原始 bucket。
- 結束休息時間。
保留 bucket 名稱
如果您不想變更程式碼來指向新的 bucket 名稱,請使用這個方法。其中包含下列步驟:
- 將資料複製到暫存儲存空間值區。
- 開始休息。
- 刪除原始 bucket。
- 建立與原始 bucket 同名的新 bucket。
- 將資料從臨時 bucket 複製到新 bucket。
- 刪除臨時 bucket。
- 確認所有項目皆依照預期運作,而且所有相關系統和帳戶都能存取 bucket。
- 結束休息時間。
盡量減少停機時間
在移轉期間,Storage 移轉服務不會鎖定來源或目的地 bucket 的讀取或寫入作業。
如果您選擇手動鎖定對儲存空間的讀取/寫入作業,可以分兩階段 (播種和同步) 轉移資料,盡量縮短停機時間。
種子轉移:執行大量轉移作業,不必鎖定來源的讀取/寫入作業。
同步轉移:第一次執行完成後,鎖定來源 bucket 的讀取/寫入作業,然後執行另一次轉移。Storage 移轉服務預設會執行增量移轉,因此第二次移轉只會移轉在種子移轉期間變更的資料。
提升傳輸速度
估算移轉作業所需時間時,請考量可能的瓶頸。舉例來說,如果來源有數十億個小型檔案,傳輸速度就會受到 QPS 限制。如果物件很大,頻寬可能會成為瓶頸。
頻寬限制是在區域層級設定,並平均分配給所有專案。如果頻寬充足,Storage 移轉服務每項移轉工作每秒可完成約 1000 項工作。在這種情況下,您可以將工作拆分成多個小型移轉工作,例如使用納入和排除前置字串來移轉特定檔案,藉此加快移轉速度。
如果位置、儲存空間類別和加密金鑰相同,Storage 移轉服務不會建立位元組的新副本,而是建立指向來源 Blob 的新中繼資料項目。因此,大型語料庫的相同位置和類別副本會非常快速地完成,且只受 QPS 限制。
刪除作業也屬於僅限中繼資料的作業。對於這類轉移作業,將轉移作業分割成多個小型工作,以平行處理的方式進行,可以提高速度。
保留中繼資料
使用 Storage 移轉服務在 Cloud Storage bucket 之間轉移資料時,系統會保留下列物件中繼資料:
- 使用者建立的自訂中繼資料。
- Cloud Storage 固定鍵中繼資料欄位,例如 Cache-Control、Content-Disposition、Content-Type 和 Custom-Time。
- 物件大小。
- 產生序號會保留為自訂中繼資料欄位,並使用
x-goog-reserved-source-generation
金鑰,您稍後可以編輯或移除。
使用 API 轉移時,可選擇保留下列中繼資料欄位:
- 存取控制清單 (ACL) (
acl
) - 儲存空間類別 (
storageClass
) - CMEK (
kmsKey
) - 暫時性保留 (
temporaryHold
) - 物件建立時間 (
customTime
)
詳情請參閱 TransferSpec
API 參考資料。
系統不會保留下列中繼資料欄位:
- 上次更新時間 (
updated
) etag
componentCount
如果保留,物件建立時間會儲存為自訂欄位,
customTime
。物件的 updated
時間會在轉移時重設,因此物件在儲存空間級別中經過的時間也會重設。也就是說,物件轉移至 Coldline Storage 後,必須在目的地再次存在 90 天,才能避免產生提前刪除費用。
您可以使用 customTime
套用以 createTime
為準的生命週期政策。現有的 customTime
值會遭到覆寫。
如要進一步瞭解哪些資料會保留,哪些不會,請參閱「中繼資料保留」。
處理版本化物件
如要轉移所有版本的儲存空間物件,而不只是最新版本,您必須使用 gcloud
CLI 或 REST API 轉移資料,並搭配 Storage Transfer Service 的資訊清單功能。
如要轉移所有物件版本:
列出 bucket 物件,並複製到 JSON 檔案:
gcloud storage ls --all-versions --recursive --json [SOURCE_BUCKET] > object-listing.json
這個指令通常每秒會列出約 1,000 個物件。
將 JSON 檔案分割為兩個 CSV 檔案,一個檔案包含非目前版本,另一個檔案包含使用中版本:
jq -r '.[] | select( .type=="cloud_object" and (.metadata | has("timeDeleted") | not)) | [.metadata.name, .metadata.generation] | @csv' object-listing.json > live-object-manifest.csv jq -r '.[] | select( .type=="cloud_object" and (.metadata | has("timeDeleted"))) | [.metadata.name, .metadata.generation] | @csv' object-listing.json > non-current-object-manifest.csv
在目的地值區啟用物件版本管理。
請先傳送非目前版本,方法是將
non-current-object-manifest.csv
資訊清單檔案做為transferManifest
欄位的值。接著,以相同方式轉移使用中的版本,並指定
live-object-manifest.csv
做為資訊清單檔案。
設定轉移選項
設定轉移時,您可以選擇以下選項:
記錄:Cloud Logging 提供個別物件的詳細記錄,方便您驗證移轉狀態,並執行額外的資料完整性檢查。
篩選:您可以使用「納入」和「排除」前置字串,限制 Storage 移轉服務可處理的物件。這個選項可用於將轉移作業分割成多個轉移工作,以便平行執行。詳情請參閱「提升傳輸速度」。
移轉選項: 您可以設定移轉作業,覆寫目標值區中的現有項目;刪除目標中不存在於移轉集中的物件;或從來源刪除已移轉的物件。
轉移資料
定義轉移策略後,即可執行轉移作業。
建立新的 bucket
開始移轉前,請先建立儲存空間值區。 如需選擇適當值區位置的協助,請參閱location_considerations。
建立新值區時,您可能需要複製部分值區中繼資料。如要顯示來源 bucket 的中繼資料,以便將相同設定套用至新 bucket,請參閱「取得 bucket 中繼資料」。
將物件複製到新 bucket
您可以使用Google Cloud 控制台、gcloud
CLI、REST API 或用戶端程式庫,將來源 bucket 中的物件複製到新 bucket。選擇哪種方法取決於轉移策略。
下列操作說明適用於將物件從一個值區轉移至另一個值區的基本用途,請視需要修改。
請勿在轉移作業名稱中加入個人識別資訊 (PII) 或安全性資料等私密資訊。資源名稱可能會傳播至其他 Google Cloud 資源的名稱,並可能向專案外部的 Google 內部系統公開。
Google Cloud 控制台
請使用Google Cloud console 中的 Cloud Storage 移轉服務:
在 Google Cloud 控制台中開啟「移轉」頁面。
- 按一下 [Create transfer job] (建立移轉工作)。
按照逐步操作說明,在完成每個步驟時按一下「下一步」:
開始使用:將 Google Cloud Storage 同時做為來源類型和目的地類型。
選擇來源:直接輸入所需值區的名稱,或按一下「瀏覽」,找出並選取所需值區。
選擇目的地:直接輸入所需值區的名稱,或按一下「瀏覽」,找出並選取所需值區。
選擇設定:選取「轉移檔案後,請從來源刪除檔案」選項。
排程選項:您可以忽略此部分。
逐步完成操作後,請按一下[Create](建立)。
如此將物件從舊值區複製到新值區的流程即會開始。這個流程可能需要一些時間;不過在按一下「建立」後,您就可以離開 Google Cloud 主控台。
如要查看移轉進度,請按照下列步驟操作:
在 Google Cloud 控制台中開啟「移轉」頁面。
如要瞭解如何透過 Google Cloud 控制台取得有關儲存空間移轉服務作業失敗的詳細錯誤資訊,請參閱「疑難排解」。
轉移作業完成後,如果您在設定期間選取了「轉移作業完成後刪除來源物件」核取方塊,就不需要執行任何動作,系統會自動刪除舊值區中的物件。不過,您可能也想刪除舊的 bucket,但必須另行操作。
gcloud CLI
安裝 gcloud CLI
如果尚未安裝,請安裝 gcloud 指令列工具。
接著,請呼叫 gcloud init
初始化工具,並指定專案 ID 和使用者帳戶。詳情請參閱「初始化 Cloud SDK」。
gcloud init
將服務帳戶新增至目標資料夾
建立移轉作業前,請務必將 Storage 移轉服務的服務帳戶新增至目的地 bucket。如要這麼做,請使用 gcloud storage buckets add-iam-policy-binding
:
gcloud storage buckets add-iam-policy-binding gs://bucket_name \ --member=serviceAccount:project-12345678@storage-transfer-service.iam.gserviceaccount.com \ --role=roles/storage.admin
如需使用 Google Cloud 控制台或 API 的操作說明,請參閱 Cloud Storage 說明文件中的「使用 IAM 權限」。
建立轉移工作
如要建立新的移轉工作,請使用 gcloud transfer jobs create
指令。
建立新工作會啟動指定的轉移作業,除非指定排程或 --do-not-run
。
gcloud transfer jobs create SOURCE DESTINATION
其中:
SOURCE 是這項轉移作業的資料來源,格式為
gs://BUCKET_NAME
。DESTINATION 是新值區,格式為
gs://BUCKET_NAME
。
其他選項包括:
工作資訊:您可以指定
--name
和--description
。時間表:指定
--schedule-starts
、--schedule-repeats-every
和--schedule-repeats-until
,或--do-not-run
。物件條件:使用條件判斷要轉移哪些物件。包括
--include-prefixes
和--exclude-prefixes
,以及--include-modified-[before | after]-[absolute | relative]
中的時間條件。移轉選項:指定是否要覆寫目的地檔案 (
--overwrite-when=different
或always
),以及是否要在移轉期間或之後刪除特定檔案 (--delete-from=destination-if-unique
或source-after-transfer
);指定要保留哪些中繼資料值 (--preserve-metadata
);並視需要為移轉的物件設定儲存空間類別 (--custom-storage-class
)。通知:使用
--notification-pubsub-topic
、--notification-event-types
和--notification-payload-format
設定轉移作業的 Pub/Sub 通知。
如要查看所有選項,請執行 gcloud transfer jobs create --help
。
舉例來說,如要轉移前置字串為 folder1
的所有物件,請按照下列步驟操作:
gcloud transfer jobs create gs://old-bucket gs://new-bucket \
--include-prefixes="folder1/"
REST
在此範例中,可瞭解到如何在不同的 Cloud Storage 值區之間移動檔案。例如,您可以將資料移到其他位置的值區。
使用 transferJobs create 的要求:
POST https://storagetransfer.googleapis.com/v1/transferJobs { "description": "YOUR DESCRIPTION", "status": "ENABLED", "projectId": "PROJECT_ID", "schedule": { "scheduleStartDate": { "day": 1, "month": 1, "year": 2025 }, "startTimeOfDay": { "hours": 1, "minutes": 1 }, "scheduleEndDate": { "day": 1, "month": 1, "year": 2025 } }, "transferSpec": { "gcsDataSource": { "bucketName": "GCS_SOURCE_NAME" }, "gcsDataSink": { "bucketName": "GCS_SINK_NAME" }, "transferOptions": { "deleteObjectsFromSourceAfterTransfer": true } } }
回應:
200 OK { "transferJob": [ { "creationTime": "2015-01-01T01:01:00.000000000Z", "description": "YOUR DESCRIPTION", "name": "transferJobs/JOB_ID", "status": "ENABLED", "lastModificationTime": "2015-01-01T01:01:00.000000000Z", "projectId": "PROJECT_ID", "schedule": { "scheduleStartDate": { "day": 1, "month": 1, "year": 2015 }, "startTimeOfDay": { "hours": 1, "minutes": 1 } }, "transferSpec": { "gcsDataSource": { "bucketName": "GCS_SOURCE_NAME", }, "gcsDataSink": { "bucketName": "GCS_NEARLINE_SINK_NAME" }, "objectConditions": { "minTimeElapsedSinceLastModification": "2592000.000s" }, "transferOptions": { "deleteObjectsFromSourceAfterTransfer": true } } } ] }
用戶端程式庫
在此範例中,可瞭解到如何在不同的 Cloud Storage 值區之間移動檔案。例如,您可以將資料複製到其他位置的值區。
如要進一步瞭解 Storage 移轉服務用戶端程式庫,請參閱開始使用 Storage 移轉服務用戶端程式庫。
Java
想查看舊版範例嗎?請參閱 Storage 移轉服務遷移指南。
Python
想查看舊版範例嗎?請參閱 Storage 移轉服務遷移指南。
驗證複製的物件
移轉作業完成後,建議您執行額外的資料完整性檢查。
驗證物件是否已正確複製,方法是檢查物件的中繼資料,例如總和檢查碼和大小。
確認複製的物件版本正確無誤。 Storage 移轉服務提供現成可用的選項,用於驗證物件是否為副本。如果已啟用記錄,請查看記錄,確認所有物件 (包括相應的中繼資料欄位) 是否都已成功複製。
開始使用目標值區
遷移完成並經過驗證後,請更新所有現有應用程式或工作負載,確保使用目標值區名稱。請檢查 Cloud 稽核記錄中的資料存取記錄,確認作業是否正確修改及讀取物件。
刪除原始 bucket
一切運作正常後,請刪除原始 bucket。
Storage 移轉服務提供在物件移轉後刪除物件的選項,方法是在作業設定中指定 deleteObjectsFromSourceAfterTransfer: true
,或在 Google Cloud 控制台中選取該選項。
排定刪除物件
如要排定稍後刪除物件,請一併使用排定轉移工作和 deleteObjectsUniqueInSink = true
選項。
請設定轉移工作,將空值區轉移至含有物件的值區。這會導致 Storage 移轉服務列出物件並開始刪除。由於刪除作業只會處理中繼資料,因此轉移作業只會受到 QPS 限制。如要加快程序,請將轉移作業分成多個工作,每個工作處理一組不同的前置字元。
或者, Google Cloud 提供 代管的 Cron 工作排程器。詳情請參閱使用 Cloud Scheduler 安排 Google Cloud STS 轉移工作。