OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?
OIL將存儲空間抽象化,并與分布式緩存系統(tǒng)VCache配合,降低了Facebook視頻延遲的同時,并減少了存儲與計算開銷。感謝趙化強、李東明完成本文技術(shù)審校。
文 / Roberto J Peon, Rishit Shroff
譯 / John
技術(shù)審校 / 趙化強、李東明
原文?:?https://code.fb.com/video-engineering/oil-vcache/
多年以來,開發(fā)者在編程時所秉持的基本思路是“open()ed”一個文件并“write()n”,隨后在本地文件系統(tǒng)“read()”。但在分布式系統(tǒng)中,這些操作涉及分布在不同網(wǎng)絡(luò)多個位置的主機上的多個進程。這些主機中的每一個 (或網(wǎng)絡(luò)本身 )都可能獨立且意外地出現(xiàn)宕機。存儲系統(tǒng)應(yīng)該如何應(yīng)對此類故障,防患于未然?我們創(chuàng)建了一種輸出輸入語言——OIL,其原理是對異構(gòu)存儲系統(tǒng)中的文件進行統(tǒng)一的命名空間管理和抽象化。我們相信OIL代表了對通用存儲抽象化的新理解。OIL + VCache將這種抽象化過程與我們的分布式虛擬內(nèi)存系統(tǒng)VCache相結(jié)合,可以顯著的提升效率和性能。
?
大型公司通常使用許多不同的存儲系統(tǒng),并希望以此能夠輕松訪問和共享文件。但隨著時間的推移,企業(yè)需要定期將數(shù)據(jù)遷移到不同的存儲系統(tǒng)中。OIL使企業(yè)能夠“配置”異構(gòu)存儲系統(tǒng),而不用重新編碼,這大大減少數(shù)據(jù)遷移的成本。與此同時,OIL還擴展了POSIX API以更好地察覺不同分布式系統(tǒng)之間的細微差別。通過提供易于使用的抽象化過程捕獲這些所需的關(guān)鍵數(shù)據(jù),OIL可以為編寫應(yīng)用程序的開發(fā)者以及維護存儲系統(tǒng)的運維人員提供更多便利。
開發(fā)OIL
?
想象一下,你的一個應(yīng)用正在寫入數(shù)據(jù)到三臺主機中,只有一臺主機寫入成功。那么I / O系統(tǒng)應(yīng)該向用戶返回“成功”——還是應(yīng)該等待三臺主機都“成功”、“失敗”或“超時”才返回?這個問題的正確答案取決于應(yīng)用場景的特殊性及其所需權(quán)衡的指標。例如,與家人進行視頻會議時,其需要權(quán)衡的指標與執(zhí)行在線購物交易有很大不同。特別是視頻會議應(yīng)用程序可能會通過舍棄部分一致性和數(shù)據(jù)丟失以換取低抖動和低延遲,而購物應(yīng)用程序則恰恰相反。
通過組合的方式,每個應(yīng)用可以共享存儲系統(tǒng),并且可以進行各自的優(yōu)化。為實現(xiàn)此目的,會存儲并理解一張有向無環(huán)圖(DAG),此無環(huán)圖可以表示任意文件的I/O流程。開發(fā)人員可根據(jù)每個文件甚至每個I/O的不同屬性編寫不同的DAG,并隨著時間的推移與需求的變化更改這些屬性,繼而根據(jù)文件的使用情況(無論是經(jīng)常訪問還是很少訪問數(shù)據(jù))無需更改其名稱即可匹配存儲屬性。這樣使得OIL虛擬文件系統(tǒng)與文件能夠一起移動并使它們保持原有的名稱,而不是將文件從一個存儲系統(tǒng)移動到另一個存儲系統(tǒng),繼而使其名稱出現(xiàn)變化。
?
除了通過DAG配置I/O外,OIL還對熟悉的read()API進行了優(yōu)化。對于大多數(shù)系統(tǒng),當所請求的數(shù)據(jù)超出當前文件結(jié)尾的字節(jié)時將產(chǎn)生越界錯誤。但是OIL的read()調(diào)用會阻塞,直到讀取到至少一個字節(jié)或發(fā)生超時 - 即使請求的字節(jié)超出最大寫入偏移量,也就是能夠讀取還未寫入的字節(jié)。(由于不再需要對新數(shù)據(jù)進行輪詢,因此其含義非常深刻。讀取文件中的一系列偏移量本質(zhì)上等價于訂閱該范圍的偏移量。)通過去掉低效的輪詢方案,我們現(xiàn)在可以創(chuàng)建高效的通信系統(tǒng)。
?
雖然這種功能很強大,但經(jīng)過一些實際的部署,我們意識到需要另一項調(diào)整。為了確保在已經(jīng)寫入完成的文件上的I / O不會產(chǎn)生出乎意料的延遲,OIL允許文件成為永久保持不變狀態(tài),這意味著文件的比特值永遠不會改變(盡管存儲的位置可能仍會改變)。它還確保OIL可以“read()”讀取超過文件結(jié)尾時,立即返回越界錯誤。
?
OIL+VCache
?
盡管OIL授權(quán)開發(fā)人員能夠跨異構(gòu)存儲系統(tǒng)編寫I / O,但我們意識到我們需要的不僅僅是OIL抽象化。正如虛擬內(nèi)存改進了現(xiàn)代操作系統(tǒng)一樣,分布式虛擬內(nèi)存可以為分布式系統(tǒng)的I / O提供實質(zhì)性的改進。
為了獲得這些性能優(yōu)勢,我們創(chuàng)建了一個名為VCache的分布式虛擬內(nèi)存系統(tǒng)。分布式內(nèi)存的概念并不新鮮,但VCache與其他系統(tǒng)之間的差別在于集成了OIL。OIL訪問VCache,VCache通過OIL訪問其他存儲。由于緩存(通常是多層)是實現(xiàn)最佳優(yōu)化的重要部分,因此使用VCache(或多層VCache)組合存儲可為開發(fā)者帶來可觀的益處。VCache存在于多個用戶定義的位置并在每個位置提供了在空間、速度和可靠性之間權(quán)衡的機會。VCache支持各種寫入模式,包括直寫(write-through)、繞寫(write-around)和不同類型的回寫(write-back)。這些模式允許應(yīng)用程序開發(fā)人員有效地借助緩沖,有效調(diào)用那些依賴存儲于虛擬內(nèi)存系統(tǒng)的數(shù)據(jù)。
?
OIL + VCache如何工作?
OIL的DAG由存儲模塊和競爭節(jié)點組成。存儲模塊(例如本地文件系統(tǒng)或高速緩存)表示DAG中的各個節(jié)點。每個節(jié)點可以具有其特定實現(xiàn)某向功能的獨立配置。除了向客戶端傳遞數(shù)據(jù)或從客戶端調(diào)用數(shù)據(jù)之外,DAG節(jié)點還可以向OIL框架傳遞其工作狀態(tài)為滿意(satisfied)或耗盡(exhausted)。除此之外,DAG節(jié)點可以將批量數(shù)據(jù)和地址空間變換附加到節(jié)點。轉(zhuǎn)換包含前向糾錯、壓縮、加密和數(shù)據(jù)分塊。節(jié)點之間的連線描述了傳輸數(shù)據(jù)時使用的屬性,例如要設(shè)置的服務(wù)質(zhì)量級別或使用的協(xié)議。
?
競爭節(jié)點是內(nèi)置虛擬節(jié)點,可以包含任意數(shù)量的子節(jié)點。它允許配置最大并發(fā)、num-until-satisfied、num-until-exhausted和交錯啟動延遲。此節(jié)點允許描述if-then-else-chain、for-loop或parallel-for-loop之中的任何組合的控制流。當num-until-satisfied子節(jié)點聲明“satisfied”狀態(tài)時,競爭節(jié)點本身對其父節(jié)點聲明“空閑”。當num-until-exhausted子句被執(zhí)行并聲明“耗盡”狀態(tài)時,競爭節(jié)點本身會向其父級聲明“耗盡”。由于節(jié)點可以在聲明“耗盡”之前可選地聲明“空閑”,明確發(fā)出信號并通知應(yīng)用可以繼續(xù)運行,以將用于特定I / O的所有工作完成的信令有效區(qū)分。
?
異步或委托寫入的一個棘手問題是緩存的故障域與執(zhí)行寫入操作的主機的故障域不同。使用OIL + VCache,開發(fā)者可以擁有本地緩存,這些緩存與寫入主機具有相同的運行結(jié)果,同時還使用遠程主機實現(xiàn)長期持久性和負載共享。使用這樣的層次結(jié)構(gòu),開發(fā)者可以選擇減少IOPS和存儲系統(tǒng)開銷,并且仍然放棄相對較少的期望屬性,例如運行結(jié)果共享和對字節(jié)的最低延遲訪問。
?
但是,當要寫入的數(shù)據(jù)總和超過本地主機內(nèi)存時,這種本地緩存將失敗。由于VCache使用OIL作為后備存儲,并且由于VCache可用于OIL,因此一個VCache實例可以使用另一個VCache實例作為其后備存儲。這意味著開發(fā)者可以擁有主機本地內(nèi)存與遠程內(nèi)存的所有優(yōu)勢。將這些與競爭節(jié)點放在一起,開發(fā)者可以控制復(fù)制、quorum以及共享或分離存儲與處理的運行結(jié)果。下面是一些例子,體現(xiàn)了這種抽象化的力量:
?
交錯啟動允許應(yīng)用程序在延遲時間和總系統(tǒng)工作時間之間進行權(quán)衡。
?
因為我們在討論文件系統(tǒng),所以元數(shù)據(jù)也應(yīng)當成為我們討論的話題之一。元數(shù)據(jù)通常由所有權(quán)、ACL、TTL等組成。OIL需要引用數(shù)據(jù)-DAG,用于描述如何、何時與何處進行I/O,因此通常也會在元數(shù)據(jù)中結(jié)束。元數(shù)據(jù)與分布式系統(tǒng)中的數(shù)據(jù)有許多相同的問題; 因此,“DAG抽象化可重用”是有一定意義的,這也是我們致力于實現(xiàn)的。
?
OIL允許定義兩種DAG - 一個用于元數(shù)據(jù),一個用于數(shù)據(jù)。這些DAG的執(zhí)行框架和結(jié)構(gòu)是相同的。唯一真正的區(qū)別是元數(shù)據(jù)DAG中的模塊給出了一項key->原子值接口而非數(shù)據(jù)-DAG的key->字節(jié)流接口,并且元數(shù)據(jù)-DAG在數(shù)據(jù)-DAG之前執(zhí)行。這種分離純粹是為了方便,因為開發(fā)者可以在單個DAG中表達這一點。通常使用元數(shù)據(jù)-DAG來描述互斥、鎖和其他序列化。描述如何以任意順序讀取和寫入任意字節(jié)是在data-DAG中完成的。這些DAG顯著不同之處在于數(shù)據(jù)DAG可以在文件的生命周期內(nèi)發(fā)生變化,
?
自投入生產(chǎn)以來,OIL + VCache已為實時視頻流系統(tǒng)帶來了顯著的功能增強,并提高了可靠性,不僅降低了視頻傳輸?shù)难舆t,還有效降低了存儲和其他需求的計算開銷。OIL在多個存儲系統(tǒng)中的靈活性為開發(fā)人員提供了更豐富的可組合性選項,允許他們添加不超出硬件算力的功能。我們希望OIL + VCache能夠激發(fā)整個行業(yè)的抽象化與API的進一步創(chuàng)新。
?
我們要感謝所有參與OIL + VCache項目的人。
LiveVideoStack? 招募
LiveVideoStack正在招募編輯/記者/運營,與全球頂尖多媒體技術(shù)專家和LiveVideoStack年輕的伙伴一起,推動多媒體技術(shù)生態(tài)發(fā)展。同時,也歡迎你利用業(yè)余時間、遠程參與內(nèi)容生產(chǎn)。了解崗位信息請在BOSS直聘上搜索“LiveVideoStack”,或通過微信“Tony_Bao_”與主編包研交流。
LiveVideoStackCon 2019北京 音視頻技術(shù)大會 初版日程現(xiàn)已上線,掃描圖中二維碼或點擊【閱讀原文】了解大會最新日程。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【大会】嵌入式玩直播,IoT做前处理
- 下一篇: 【大会】QoE也能驱动业务创新