(網(wǎng)經(jīng)社訊)引言:Fluid 是云原生基金會 CNCF 下的云原生數(shù)據(jù)編排和加速項(xiàng)目,由南京大學(xué)、阿里云及 Alluxio 社區(qū)聯(lián)合發(fā)起并開源。本文主要介紹 Fluid 在作業(yè)幫檢索服務(wù)下計(jì)算存儲分離架構(gòu)中的應(yīng)用實(shí)踐,基于 Fluid 的計(jì)算存儲分離架構(gòu),作業(yè)幫顯著夠顯著降低了大規(guī)模檢索系統(tǒng)類服務(wù)的復(fù)雜度,成功實(shí)現(xiàn)分鐘級百 T 級別的數(shù)據(jù)分發(fā)、原子性的數(shù)據(jù)版本管理和數(shù)據(jù)更新,并使檢索服務(wù)能夠像正常無狀態(tài)服務(wù)一樣,輕松通過 K8s HPA 實(shí)現(xiàn)橫向擴(kuò)展,為服務(wù)帶來更高的穩(wěn)定性和可用性。
大規(guī)模檢索系統(tǒng)一直都是各個公司平臺業(yè)務(wù)的底層基石,往往是以千臺裸金屬服務(wù)器級別的超大規(guī)模集群的方式運(yùn)行,數(shù)據(jù)量巨大,對于性能、吞吐、穩(wěn)定性要求極為苛刻,故障容忍度很低。
除了運(yùn)行層面外,超大規(guī)模集群和海量數(shù)據(jù)場景下的數(shù)據(jù)迭代和服務(wù)治理也往往是一個巨大的挑戰(zhàn):增量和全量的數(shù)據(jù)分發(fā)效率,短期和長期的熱點(diǎn)數(shù)據(jù)追蹤等都是需要深入研究的問題。
本文將介紹作業(yè)幫內(nèi)部設(shè)計(jì)實(shí)現(xiàn)的基于 fluid 計(jì)算存儲分離架構(gòu),能夠顯著降低大規(guī)模檢索系統(tǒng)類服務(wù)的復(fù)雜度,使得大規(guī)模檢索系統(tǒng)可以像正常在線業(yè)務(wù)一樣平滑管理。
01
大規(guī)模檢索系統(tǒng)所面臨的問題
Aliware
作業(yè)幫的眾多學(xué)習(xí)資料智能分析和搜索功能中都依賴于大規(guī)模數(shù)據(jù)檢索系統(tǒng),我們的集群規(guī)模在千臺以上,總數(shù)據(jù)量在百 TB 級別以上,整個系統(tǒng)由若干分片組成,每個分片由若干服務(wù)器加載相同的數(shù)據(jù)集,運(yùn)行層面上我們要求性能達(dá)到 P99 1.Xms,吞吐量高峰百 GB 級,穩(wěn)定性要求 99.999%以上。
以往環(huán)境中為了提高數(shù)據(jù)讀取效率和穩(wěn)定性,更多
1、數(shù)據(jù)集合
由于實(shí)際運(yùn)行中,每個分片的每個節(jié)點(diǎn)都需要復(fù)制下來本分片所有數(shù)據(jù),由此帶來了同步數(shù)據(jù)下發(fā)困難的問題。實(shí)際運(yùn)行中如果要同步數(shù)據(jù)到單服務(wù)器節(jié)點(diǎn),需要使用分級下發(fā),先下發(fā)一級(十級)由一級分發(fā)給二級(百級)再分發(fā)給三級(千級),這個分發(fā)周期長且需要層層校驗(yàn)來保證數(shù)據(jù)準(zhǔn)確性。
2、業(yè)務(wù)資源彈性擴(kuò)縮較弱:
原先的系統(tǒng)架構(gòu)采用的是計(jì)算和存儲緊耦合,數(shù)據(jù)存儲和算力資源緊密捆綁,資源靈活擴(kuò)展能力不高,擴(kuò)容往往需要以小時為單位進(jìn)行,缺乏應(yīng)對突發(fā)峰值流量擴(kuò)容能力。
3、單分片數(shù)據(jù)擴(kuò)展性不足:
單分片數(shù)據(jù)上限受分片集群內(nèi)的單機(jī)存儲上限限制。如果達(dá)到存儲上限,往往需要拆分?jǐn)?shù)據(jù)集,而這種拆分不是由業(yè)務(wù)需求驅(qū)動的。
而數(shù)據(jù)迭代和擴(kuò)展性的問題又不得不帶來了成本壓力和自動化流程上的薄弱。
通過對檢索系統(tǒng)運(yùn)行和數(shù)據(jù)更新流程的分析,當(dāng)前面臨的關(guān)鍵問題是由于計(jì)算和存儲的耦合所帶來的,因此我們考慮如何去解耦計(jì)算和存儲,只有引入計(jì)算存儲分離的架構(gòu)才能夠從根本上解決復(fù)雜度的問題。
計(jì)算存儲分離最主要的就是將每個節(jié)點(diǎn)存儲本分片全量數(shù)據(jù)的方式拆分開,將分片內(nèi)的數(shù)據(jù)存儲在邏輯上的遠(yuǎn)程機(jī)器上 但是計(jì)算存儲分離又帶來了其他的問題,比如穩(wěn)定性問題,大數(shù)據(jù)量下的讀取方式和讀取速度,對業(yè)務(wù)的入侵程度等等問題,雖然存在這些問題,但是這些問題都是可解決以及易解決的 基于此我們確認(rèn)計(jì)算存儲分離一定是該場景下的良方,可以從根本上解決系統(tǒng)復(fù)雜度的問題。
02
計(jì)算存儲分離架構(gòu)解決復(fù)雜度問題
Aliware
為了解決上述計(jì)算存儲分離所需要考慮的問題,新的計(jì)算存儲分離架構(gòu)必須能達(dá)到以下目標(biāo):
1、讀取的穩(wěn)定性,計(jì)算存儲分離終究是通過各種組件配合替換掉了原始文件讀取,數(shù)據(jù)加載方式可以替換,但是數(shù)據(jù)讀取的穩(wěn)定性依然需要和原始保持同等水平。
2、每個分片千節(jié)點(diǎn)同時數(shù)據(jù)更新場景下,需要最大限度
3、支持通過 POSIX 接口讀取數(shù)據(jù),POSIX 是最具備對各種業(yè)務(wù)場景的適應(yīng)性的方式,這樣無需侵入業(yè)務(wù)場景下,屏蔽了下游變動對上游的影響。
4、數(shù)據(jù)迭代的流程的可控性,對于在線業(yè)務(wù)來說,數(shù)據(jù)的迭代理應(yīng)被視為和服務(wù)迭代等同的 cd 流程,那么數(shù)據(jù)迭代的可控性就
5、數(shù)據(jù)集合的可伸縮性,新的架構(gòu)需要是一套可復(fù)制,易擴(kuò)展的模式,這樣才能面對數(shù)據(jù)集合的伸縮、集群規(guī)模的伸縮具備良好的應(yīng)對能力。
為了達(dá)成上述目標(biāo),我們最終選用了 Fluid 開源項(xiàng)目作為整個新架構(gòu)的關(guān)鍵紐帶。
03
組件介紹
Aliware
Fluid 是一個開源的 Kubernetes 原生的分布式數(shù)據(jù)集編排和加速引擎,由南京大學(xué)、阿里云及 Alluxio 社區(qū)開源,主要服務(wù)于云原生場景下的數(shù)據(jù)密集型應(yīng)用,例如大數(shù)據(jù)應(yīng)用、AI 應(yīng)用等。
通過 Kubernetes 服務(wù)提供的數(shù)據(jù)層抽象,可以讓數(shù)據(jù)像流體一樣在諸如 HDFS、OSS、Ceph 等存儲源和 Kubernetes 上層云原生應(yīng)用計(jì)算之間靈活高效地移動、復(fù)制、驅(qū)逐、轉(zhuǎn)換和管理。
而具體數(shù)據(jù)操作對用戶透明,用戶不必再擔(dān)心訪問遠(yuǎn)端數(shù)據(jù)的效率、管理數(shù)據(jù)源的便捷性,以及如何幫助 Kuberntes 做出運(yùn)維調(diào)度決策等問題。用戶只需以最自然的 Kubernetes 原生數(shù)據(jù)卷方式直接訪問抽象出來的數(shù)據(jù),剩余任務(wù)和底層細(xì)節(jié)全部交給 Fluid 處理。
Fluid 項(xiàng)目當(dāng)前主要關(guān)注數(shù)據(jù)集編排和應(yīng)用編排這兩個重要場景。數(shù)據(jù)集編排可以將指定數(shù)據(jù)集的數(shù)據(jù)緩存到指定特性的 Kubernetes 節(jié)點(diǎn),而應(yīng)用編排將指定該應(yīng)用調(diào)度到可以或已經(jīng)存儲了指定數(shù)據(jù)集的節(jié)點(diǎn)上。這兩者還可以組合形成協(xié)同編排場景,即協(xié)同考慮數(shù)據(jù)集和應(yīng)用需求進(jìn)行節(jié)點(diǎn)資源調(diào)度。
1、檢索服務(wù)已經(jīng)完成容器化改造,天然適合 Fluid。
2、Fluid 作為數(shù)據(jù)編排系統(tǒng),使得上層無需知道具體的數(shù)據(jù)分布就可以直接使用,同時基于數(shù)據(jù)的感知調(diào)度能力,可以實(shí)現(xiàn)業(yè)務(wù)的就近調(diào)度,加速數(shù)據(jù)訪問性能。
3、Fluid 實(shí)現(xiàn)了 pvc 接口,使得業(yè)務(wù) pod 可以無感知的掛載進(jìn)入 pod 內(nèi)部,讓 pod 內(nèi)可以像使用本地磁盤一樣無感知 Fluid 提供元數(shù)據(jù)和數(shù)據(jù)分布式分層緩存,以及高效文件檢索功能。
4、Fluid+jindoruntime 內(nèi)置了多種緩存模式(回源模式,全緩存模式),不同的緩存策略(針對小文件場景的優(yōu)化等)和存儲方式(磁盤,內(nèi)存),對于不同的場景具備良好的適應(yīng)性,無需太多修改即可滿足多種業(yè)務(wù)場景。
落地實(shí)踐
1、緩存節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)的分離: 雖然使用 fuse 和 worker 結(jié)合部署可以獲得更好的數(shù)據(jù)本地性能,但是在在線場景下,我們最終選用了緩存和計(jì)算節(jié)點(diǎn)分離的方案,原因是通過延長一定的啟動時間換來更優(yōu)的彈性是值得的,以及我們并不希望業(yè)務(wù)節(jié)點(diǎn)穩(wěn)定性問題和緩存節(jié)點(diǎn)的穩(wěn)定性問題糾纏在一起。
2、Fluid 支持 dataset 的可調(diào)度性,換言之就是緩存節(jié)點(diǎn)的可調(diào)度性,我們通過指定 dataset 的 nodeAffinity 來進(jìn)行數(shù)據(jù)集緩存節(jié)點(diǎn)的調(diào)度,從而保證緩存節(jié)點(diǎn)可高效,彈性化
01在線場景的高要求
對于在線業(yè)務(wù)場景,鑒于系統(tǒng)對于數(shù)據(jù)的訪問速度、完整性和一致性有較高的要求,因此不能出現(xiàn)數(shù)據(jù)的部分更新、非預(yù)期的回源請求等; 所以對數(shù)據(jù)緩存和更新策略的選擇就會很關(guān)鍵。
02合適的數(shù)據(jù)緩存策略
基于以上需求,我們選擇使用 Fluid 的全緩存模式。在全緩存模式下,所有請求只會走緩存,而不
03結(jié)合權(quán)限流的更新流程
在線業(yè)務(wù)的數(shù)據(jù)更新也是屬于 cd 的一種,同樣也需要更新流程來管控,通過結(jié)合了權(quán)限流程的 dataload 模式,使得線上數(shù)據(jù)發(fā)版更安全和標(biāo)準(zhǔn)化。
04數(shù)據(jù)更新的原子性
由于模型是由許多文件組成,只有所有的文件全部緩存起來之后,才是一份可以被使用的完整的模型;所以在全緩存無回源的前提下,就需要保證 dataload 過程的原子性, 在數(shù)據(jù)加載的過程中過,新版本數(shù)據(jù)不能被訪問到,只有在數(shù)據(jù)加載完成之后,才可以讀取到新版本數(shù)據(jù)。
以上方案和策略配合我們自動化的建庫和數(shù)據(jù)版本管理功能,大大提高了整體系統(tǒng)的安全性和穩(wěn)定性,同時使得整個過程的流轉(zhuǎn)更加智能和自動化。
04
總結(jié)
Aliware
基于 Fluid 的計(jì)算存儲分離架構(gòu),我們成功地實(shí)現(xiàn)了:
1、分鐘級百 T 級別的數(shù)據(jù)分發(fā)。
2、數(shù)據(jù)版本管理和數(shù)據(jù)更新的原子性,使得數(shù)據(jù)分發(fā)和更新成為一種可管控,更智能的自動化流程。
3、檢索服務(wù)能夠像正常無狀態(tài)服務(wù)一樣,從而能夠輕松通過 k8s HPA 實(shí)現(xiàn)橫向擴(kuò)展,更快捷的擴(kuò)縮帶來了更高的穩(wěn)定性和可用性。
05
展望
Aliware
計(jì)算和存儲分離的模式使得以往我們認(rèn)為非常特殊的服務(wù)可以被無狀態(tài)化,可以像正常服務(wù)一樣被納入 devops 體系中,而基于 Fluid 的數(shù)據(jù)編排和加速系統(tǒng),則是實(shí)踐計(jì)算和存儲分離的一個切口,除了用于檢索系統(tǒng)外,我們也在探索基于 Fluid 的 OCR 系統(tǒng)模型訓(xùn)練和分發(fā)的模式。
在未來工作方面,我們計(jì)劃繼續(xù)基于 Fluid 優(yōu)化上層作業(yè)的調(diào)度策略和執(zhí)行模式,并進(jìn)一步擴(kuò)展模型訓(xùn)練和分發(fā),提高整體訓(xùn)練速度和資源的利用率,另一方面也幫助社區(qū)不斷演進(jìn)其可觀測性和高可用等,幫助到更多的開發(fā)者。
作者介紹
董曉聰:作業(yè)幫基礎(chǔ)架構(gòu)負(fù)責(zé)人,主要負(fù)責(zé)架構(gòu)研發(fā)、運(yùn)維、DBA、安全等工作。曾在百度、滴滴等公司負(fù)責(zé)架構(gòu)和技術(shù)管理工作,擅長業(yè)務(wù)中臺、技術(shù)中臺、研發(fā)中臺的搭建和迭代。
張浩然:2019 年加入作業(yè)幫,作業(yè)幫基礎(chǔ)架構(gòu)-高級架構(gòu)師,在作業(yè)幫期間,推動了作業(yè)幫云原生架構(gòu)演進(jìn)、負(fù)責(zé)多云 K8s 集群建設(shè)、K8s 組件研發(fā)、Linux 內(nèi)核優(yōu)化調(diào)優(yōu)、底層服務(wù)容器化相關(guān)工作。