因為我有定期備份資料的習慣,會把 Google、Facebook、Evernote、相簿等等資料都定期備份到 Google Cloud Storage 上面,每次用瀏覽器上傳都會很煩惱上傳速度慢的問題,而且如果網路斷線還要重新傳送那 10 GB 的大檔案,後來研究了官方文件,找到一些關於上傳大檔案到 Google Cloud Storage 時很好用的小技巧分享給大家。
包含:
- 如何讓 GCP Storage 幫你驗證檔案的 MD5 Checksum
- 如何啟動續傳功能,斷線沒關係可以繼續傳送
- 如何透過平行化傳輸把上傳速率榨到極限
不過如果你要傳送超級大的資料,例如 10TB 之類的話,用網路傳輸可能還比實體傳輸慢,這時候建議你直接選用 Cloud Storage 提供的 Offline Media Import / Export 方案囉,就是一個跟 AWS S3 卡車類似的傢伙,但比較沒有那麼鋪張。
首先,不管你要做任何事情,先把 gsutil 安裝好,這是專屬 Google Cloud Storage 的 Command Line 工具,有很多神奇的小功能隱藏在裡面,是瀏覽器上傳完全無法比擬的神器!
安裝可以參考這篇官方文件的說明:Install the latest Cloud Tools version
完成安裝後,可以在 Terminal 裡面輸入以下語法確認是否安裝、設定成功:
gsutil ls gs://{Your Bucket Name}
透過 gsutil 上傳檔案並支援續傳
當你使用 gsutil 上傳超過 8MB 的檔案時,無需任何參數,預設就支援續傳功能囉! 如果上傳到一半網路斷線,這時候只要重新執行一樣的指令,他就會處理續傳囉。
gsutil cp -r src_url dest_url
如果要上傳資料夾,請加上 -r 參數
範例:
gsutil cp ~/Documents/facebook.zip gs://backup-bucket/2016-10-10 gsutil cp ~/Documents/*.zip gs://backup-bucket/2016-10-10 gsutil cp -r ~/Documents/ gs://backup-bucket/2016-10-10
此外,如果把 cp 的兩個路徑參數倒過來,就會變成下載哦
參考 Google Cloud Storage Offical Docs – gsutil cp
平行化榨乾上傳速度
首先,如果你要上傳很多檔案,注意不是一個大檔案哦,你可以在 gsutil 後面加上 -m 參數,gsutil 會用多個執行緒來上傳檔案,在多個小檔案的情況下會有很大的幫助
注意,是加在 gsutil 後面,不是 cp 後面哦!
gsutil -m cp Downloads/fb.zip gs://backup/2016-10-10
但如果你是一個大檔案要上傳,則可以使用 parallel_composite_upload_threshold 來把檔案切割上傳,例如 10GB 的檔案,使用以下語法上傳,則會分成十個檔案上傳,對於上傳速度在某種程度上也有幫助。
gsutil -o GSUtil:parallel_composite_upload_threshold=1000M cp ~/Downloads/all_accesslog gs://backup/
檔案完整性驗證
透過 MD5 可以幫你驗證你上傳到 GCP Storage 的檔案是否完整,在本機先計算好 Checksum,並且讓伺服器在收到檔案後也計算一次 Checksum,如果兩相比對一模一樣,代表檔案完整,可以避免你以為有備份,結果因為網路不穩定導致檔案少了一些內容無法還原的慘劇。
可以透過該指令來計算檔案的 Checksum (encode by base64),注意若是透過 parallel_composite_upload_threshold 上傳檔案,只能使用 CRC32C Checksum。
gsutil hash ~/Downloads/apache.log
計算完成後,在上傳檔案時可以透過如下語法附加你的 Checksum 到 header 一併上傳,待上傳完成後 GCP Storage 就會自動計算 Checksum 是否相符合。
gsutil -h Content-MD5:kClkmpnshA9eVrNlwIv82w== cp fb.zip gs://backup/