騰訊雲對象存儲 COS 高可用解決方案,都在這裡了!
- 2019 年 12 月 6 日
- 筆記
原文發佈於微信公眾號:騰訊雲存儲(關注有驚喜)
前言
上一篇內容我們說到了 COS 是什麼「要對象存儲做什麼,我有女朋友就夠了!」的文章。本文將著重介紹如何儘可能的提高騰訊雲對象存儲 COS 的可用性。
COS 提供了基於 HTTP/HTTPS 的上傳介面,對於 UGC 的場景,客戶端直傳 COS 的用法十分普遍。由於 COS 的存儲桶是分布在具體的某個地域,比如某個客戶的存儲桶位於上海園區,但是其客戶遍布全國各地乃至全球海外,偏遠地區以及跨國的訪問及其不穩定,如何在錯綜複雜的網路環境下提高客戶端上傳文件的成功率成為讓客戶頭疼的問題,下面我們將帶著這個問題一步步去尋求答案。

一. 客戶端斷點續傳
客戶端的上傳內容一般分為圖片類的小文件以及影片類的大文件,騰訊雲對象存儲 COS 提供了簡單上傳以及分塊上傳這兩種介面來上傳不同大小的文件。
- 對於小於1MB的圖片類小文件,直接使用簡單上傳介面即可。
- 對於大於1MB的影片類大文件,使用分塊上傳介面把大文件切分為多個小的分塊來上傳(每個分塊大小為1MB – 5GB,最後一個分塊可以小於1MB)。
我們知道,在網路傳輸中分塊越小,那麼傳輸成功率越高,也方便對小的分塊進行快速重試。
分塊上傳文件,分為以下3個步驟:
1. 初始化一個分塊上傳,服務端返回一個用於分塊上傳的UploadId;
2. 並發上傳多個分塊文件;
3. 完成指定 UploadId 的分塊上傳,合成一個完整的文件;
掃描 COS 的訪問日誌,我們發現有不少用戶沒能以最優雅的方式使用分塊上傳介面。分塊上傳方式上傳一個大文件時(分塊數最多10000個),在其中某一個分塊上傳失敗之後,就立馬放棄掉這個文件,重新發起一個新的上傳任務,這樣浪費了大量的時間來進行重試,使得上傳的效率低下。
COS 後端會永久保存一個未完成上傳的 UploadId(可以主動使用碎片清理介面來清理未完成的分塊上傳),如果我們可以記錄下步驟1中的 UploadId,列出已經上傳的分塊,重新從斷點處進行續傳則可以大大提高上傳介面的可用性。
COS 提供了多種語言的 SDK 封裝好了對應的斷點續傳介面,在對應的 COS SDK 中找到高級上傳介面即可使用斷點續傳功能。
二. 跨地域複製
COS最新推出的跨地域複製功能,可以在不同存儲區域的存儲桶中自動、非同步地複製增量對象。利用此特性可以做到跨區域級別的容災、就近訪問提高可用性。隨著公司越來越多的業務出海,如何提高跨國訪問的可用性成為業務的痛點,使用跨地域複製功能可以極大提升業務的可用性。
1、跨地域複製架構

開啟跨地域複製的兩個存儲桶必須提前打開版本控制功能,並且位於 COS 的不同區域,COS 現在已經支援雙向以及一對多的同步配置。客戶對文件產生的所有增量操作,包括刪除文件操作(開啟多版本的情況下刪除文件操作實際上是創建一個 0 位元組的特殊 delete marker 文件)都會經由源桶通知 costrsf 模組,任務入 CMQ 隊列成功之後則返回成功,後續由 costrsf 模組非同步的同步文件到目的存儲桶,所有的元資訊以及訪問控制資訊 ACL 都會原封不動的同步到目的端,需要注意的是,目的端文件的版本號會和源文件的版本號也保持一致。源文件會維持一個 x-cos-replication-status 欄位來保存跨地域複製任務的狀態,客戶可以通過 HEAD Object 介面來查詢文件的複製狀態。
這裡大家可能會有一個疑問,為什麼跨地域複製必須提前打開版本控制功能。
我們設想一個非常常見的場景,如果源桶同時上傳了多個路徑相同的文件或者目的桶也在上傳同名文件,由於跨地域複製的任務是非同步進行的,無法保證文件寫入的最終一致性。由於源文件和目的文件的版本號是保持一致的,而且版本號是根據時間戳生成的,那麼在索引側就是有序的,最終可以保證多個版本的文件都能按照正確的時序投遞到目的存儲桶。
2、在COS控制台上設置跨地域複製
控制台支援一對一以及一對多的跨地域複製設置。
進入控制台在左側導航欄單擊【存儲桶列表】,然後選擇單擊需要配置跨地域複製的源存儲桶,進入存儲桶詳情介面。

單擊左側的【高級配置】,進入存儲桶的高級配置頁,向下找到【跨地域複製】管理項,單擊【新增規則】進入跨地域複製規則配置狀態。

3、在SCF控制台上設置跨地域複製回調

公司的遊戲業務需要將遊戲安裝包分發到海外的存儲桶,使用跨地域複製功能,可以就近上傳到廣州的存儲桶,保證上傳的成功率和速度,然後自動複製到海外的存儲桶中。如何通知到業務方安裝包已經成功同步到海外存儲桶,首先想到的方案是通過查詢介面,不停的輪詢源文件x-cos-replication-status 狀態,當 x-cos-replication-status=Complete 時,則可以認為文件同步成功。
更為優雅的方式則是當跨地域複製完成時,由 COS 發出回調消息到 SCF 觸發特定的業務邏輯來通知到業務方。
三. 全球加速
1、全球加速原理

騰訊雲對象存儲 COS 全球加速功能利用全局鏈路的自動測速功能,智慧路由解析用戶請求,選擇最優網路訪問鏈路,實現請求的就近接入。
利用全球分布的雲機房,幫助全球各地用戶快速訪問最近的接入層,提升業務訪問成功率和穩定性。
使用全球加速功能就近接入之後,客戶端到接入層的"加速"實際上是,由穩定快速的內網專線網路傳輸鏈路,來代替外網不穩定的跨國或跨地域的訪問鏈路。
2、使用方式及加速效果

利用博瑞第三方測評工具,我們將 COS 的存儲桶設置在了上海園區,使用COS的普通上傳域名以及加速上傳域名,在全球各個撥測點進行1MB大小文件的上傳測試,從上圖我們可以明顯的看到亞洲、歐洲、美洲的上傳效果得到了顯著的提升。對於中國本土的上傳提升效果,我們將使用加速效果已經得到某個客戶認可的某款 APP 的實測數據來進行展示。

上圖是某客戶 UGC APP 取樣了中國西北地區的普通域名和加速域名上傳介面的成功率數據,我們可以清晰的看到新疆、西藏、內蒙古等地的上傳成功率都維持在99%之上,西北地區的上傳成功率平均提高了2%~3%。客戶回饋,APP 端上的整體成功率由97%提升到了99.5%,顯著的加速效果,讓我們得到了客戶的認可。
目前 COS 全球加速功能暫時處於產品公測期,如果您需要使用,可提交內測申請。相比於跨地域複製,用戶不需要支付跨地域存儲桶的存儲費用,也不需要維護額外的邏輯去通知業務方複製任務的成功。只需要在 SDK 中按照以下方式改變 endpoint 即可:
# appid 已在配置中移除,請在參數 Bucket 中帶上 appid。Bucket 由 BucketName-APPID 組成 # 1. 設置用戶配置, 包括 secretId,secretKey 以及 Region secret_id = 'COS_SECRETID' # 替換為用戶的 secretId secret_key = 'COS_SECRETKEY' # 替換為用戶的 secretKey region = 'ap-beijing' # 替換為用戶的 Region endpoint = 'cos.accelerate.myqcloud.com' # 替換為加速域名的 endpoint config = CosConfig(Region=region, Endpoint=endpoint, SecretId=secret_id, SecretKey=secret_key) # 2. 獲取客戶端對象 client = CosS3Client(config)
四. 總結
COS 提供了多種擴展功能來提高用戶的可用性,如果上傳點比較固定或者希望同時具備異地容災以及就近訪問的功能,可以選擇跨地域複製功能,如果不希望支付額外的存儲費用來提高 UGC 場景下的上傳成功率,那麼可以選擇 COS 全球加速。

更多好禮請點擊領取COS限時1元禮包!