天天看點

如何使用表格存儲實作網盤檔案的極速秒傳

目前不少雲備份、網盤等産品都提供了秒傳的功能,一方面能夠顯著的提高了使用者的使用體驗,另外一方面由于避免了不必要的檔案傳輸,又有效的降低了存儲成本與帶寬成本。

而實作檔案的"秒傳",隻需要通過用戶端從檔案中擷取一個特征值,比如常用的 md5 值,然後在伺服器上儲存所有檔案的特征值進行比較,如果有重複的,就無需再上傳資料,隻需要複制一份檔案的存儲路徑即可。進一步考慮到檔案的分享、儲存以及後期的清理,我們将檔案的特征值與目前引用計數存儲在中繼資料 db 中。

"秒傳"機制看起來容易,但是在實作細節上也有不少問題需要處理。

同一個檔案同時由多個使用者上傳,如果沒有鎖保護,會出現先更新的值被後更新的值覆寫掉的情況,計數會低于實際引用的使用者數量,導緻檔案可能被提前删除。

如何使用表格存儲實作網盤檔案的極速秒傳

在删除時, __使用異步删除能夠明顯的提高響應延時,并且,異步删除能夠更友善的控制實際删除的時間__,在使用者誤删除或者删除之後的重新上傳的情況(雲相冊的删除和重新同步)下都能夠獲得更好的使用者體驗。

但是使用異步删除後,在啟動删除前有可能有使用者重新上傳該檔案,由于檔案名一緻,則有可能會覆寫目前的檔案,此時啟動删除動作,會将該重新上傳的檔案删除掉,導緻使用者上傳成功,但檔案被删除。

盡管可以在删除時再次檢查引用計數是否為0,仍然有可能有使用者在檢查之後和實際删除啟動之間上傳新的檔案,依然避免不了上述的一緻性問題。

如何使用表格存儲實作網盤檔案的極速秒傳

将檔案的md5資訊與引用計數作為中繼資料存放在db中,由于檔案的個數數以億計,活躍使用者數也數以千萬計,為了提供真正的秒傳秒複制,中繼資料的讀寫性能和并發能力都極為重要。

在百萬級并發、億級資料量的情況下,讀寫性能需要保證在毫秒級。

在檔案上傳時,先讀取到目前的該檔案的引用計數:

若大于 0,則對引用計數進行加1操作,傳回給使用者 __上傳成功__,達到秒傳或者秒拷貝的效果,流程見下圖。

若為 0,說明檔案 将要被删除__,見下文 __檔案删除 處理部分。

若為 -1,說明檔案 正在被删除__,為了保證一緻性,等待檔案删除完之後才能上傳,詳見下文 __檔案删除 處理部分。

如何使用表格存儲實作網盤檔案的極速秒傳

在檔案上傳時,由于為了提高系統的響應時間或者應對誤删除的再次上傳(尤其是相冊同步),一般采用異步删除,由于檔案存儲系統無鎖機制,需要對跨系統的 檔案存儲系統 + 中繼資料db 進行一緻性保證,處理邏輯如下:

如何使用表格存儲實作網盤檔案的極速秒傳

用戶端邏輯

若該行不存在或者引用計數大于0,參考上文中 檔案上傳 處理邏輯。

若引用計數為 -1,進行等待直到引用計數count為 0,由于 oss object 删除延時很低,該等待時間可控。

若引用計數為 0, __先進行引用計數加1__,成功後通知使用者上傳成功。

若引用計數大于 0, 參考上文中 檔案上傳 處理邏輯。

删除任務邏輯

當删除任務被激活時,先進行删除标志位檢查,需要檢查引用計數為 0,確定可以正常删除。

将引用計數置為 -1,此時禁止使用者上傳,如果條件檢查失敗(set count to -1 if count=0),說明此時有使用者上傳該檔案,删除任務廢棄。

如果引用計數 count 置為 -1 成功,進行檔案删除,删除之後 count 置為 0,允許使用者新上傳。此時也可以将該條中繼資料記錄直接删除。

删除工作完成。

1.毫秒級的性能

為了保證整個鍊路的時延,中繼資料的讀寫都必須在單個毫秒。傳統的關系型資料庫在千萬級以上規模的查詢效率會顯著下降。

tablestore的機制能夠保證單行查詢的延時可預期,隻與查詢的結果集大小相關,與基礎資料量無關。高性能執行個體的單行随機查詢在tb級資料量與pb級資料量均為單個毫秒。

2.高并發

網際網路應用中,并發峰值會與活躍使用者數有線性關系,千萬級活躍使用者數的應用需要保證 百萬級 的并發以應對通路峰值。一般的 db 會受到單機能力的上限。

tablestore為nosql分布式資料庫服務,提供彈性資源,能夠支援0到百萬的通路tps。

3.能夠簡化開發及運維工作

為了保證性能和提高并發能力,使用一般的 db 需要搭建叢集,在業務上也要進行分庫分表的操作,這會大大增加開發和運維的難度。

上述方案中調用的單行寫 putrow、單行讀 getrow 及單行更新 updaterow都 簡單易用。為提高效率,tablestore也提供批量讀寫 batchwriterow 及 batchgetrow 接口。tablestore 服務端會根據資料量及通路情況對資料進行自動分裂,而md5天然具有很好的離散型,能夠充分打散到多台伺服器上,進而提供最大 n * 單機服務能力 的通路并發,該過程對使用者完全透明。

4.成本

tablestore會根據實際使用進行計費,不會産生資源閑置。以每天1000w新增檔案為例,使用高性能執行個體日費用為60元左右,使用預留讀寫模式或者是容量型執行個體更可以控制到10元以内。 10億 條單條記錄 100b 的高性能資料存儲日費用為 2.5元 左右,而容量型執行個體每天不到1元錢。

正因為高并發、低延時、彈性資源等特點,表格存儲非常适合網際網路資訊的中繼資料存儲,更多這方面的應用實踐還希望能多多和大家一起交流!