Hologres揭秘:如何支持超高QPS在线服务(点查)场景
Hologres(中文名交互式分析)是阿里云自研的一站式實(shí)時(shí)數(shù)倉(cāng),這個(gè)云原生系統(tǒng)融合了實(shí)時(shí)服務(wù)和分析大數(shù)據(jù)的場(chǎng)景,全面兼容PostgreSQL協(xié)議并與大數(shù)據(jù)生態(tài)無(wú)縫打通,能用同一套數(shù)據(jù)架構(gòu)同時(shí)支持實(shí)時(shí)寫(xiě)入實(shí)時(shí)查詢以及實(shí)時(shí)離線聯(lián)邦分析。它的出現(xiàn)簡(jiǎn)化了業(yè)務(wù)的架構(gòu),為業(yè)務(wù)提供實(shí)時(shí)決策的能力,讓大數(shù)據(jù)發(fā)揮出更大的商業(yè)價(jià)值。從阿里集團(tuán)誕生到云上商業(yè)化,隨著業(yè)務(wù)的發(fā)展和技術(shù)的演進(jìn),Hologres也在持續(xù)不斷優(yōu)化核心技術(shù)競(jìng)爭(zhēng)力,為了讓大家更加了解Hologres,我們計(jì)劃持續(xù)推出Hologres底層技術(shù)原理揭秘系列,從高性能存儲(chǔ)引擎到高效率查詢引擎,高吞吐寫(xiě)入到高QPS查詢等,全方位解讀Hologres,請(qǐng)大家持續(xù)關(guān)注!
往期精彩內(nèi)容:
- 2020年VLDB的論文《Alibaba Hologres: A cloud-Native Service for Hybrid Serving/Analytical Processing》
- Hologres揭秘:首次公開(kāi)!阿里巴巴云原生實(shí)時(shí)數(shù)倉(cāng)核心技術(shù)揭秘
- Hologres揭秘:首次揭秘云原生Hologres存儲(chǔ)引擎
- Hologres揭秘:Hologres高效率分布式查詢引擎
- Hologres揭秘:高性能原生加速M(fèi)axCompute核心原理
- Hologres揭秘:優(yōu)化COPY,批量導(dǎo)入性能提升5倍+
本期我們將揭秘Hologres如何支持超高QPS點(diǎn)查。
傳統(tǒng)的 OLAP 系統(tǒng)在業(yè)務(wù)中往往扮演著比較靜態(tài)的角色,以通過(guò)分析海量的數(shù)據(jù)得到業(yè)務(wù)的洞察(比如說(shuō)預(yù)計(jì)算好的視圖、模型等),從這些海量數(shù)據(jù)分析到的結(jié)果再通過(guò)另外一個(gè)系統(tǒng)提供在線數(shù)據(jù)服務(wù)(比如HBase、Redis、MySQL等)。這里的服務(wù)(Serving)和分析(Analytical)是個(gè)割裂的過(guò)程。與此不同的是,實(shí)際的業(yè)務(wù)決策過(guò)程往往是一個(gè)持續(xù)優(yōu)化的在線過(guò)程。服務(wù)的過(guò)程會(huì)產(chǎn)生大量的新數(shù)據(jù),我們需要對(duì)這些新數(shù)據(jù)進(jìn)行復(fù)雜的分析。分析產(chǎn)生的洞察實(shí)時(shí)反饋到服務(wù),讓業(yè)務(wù)的決策更實(shí)時(shí),從而創(chuàng)造更大的商業(yè)價(jià)值。
Hologres定位是一站式實(shí)時(shí)數(shù)倉(cāng),融合分析能力(Analytical)與在線服務(wù)(Serving)為一體,減少數(shù)據(jù)的割裂和移動(dòng)。本文的內(nèi)容將會(huì)針對(duì)Hologres的服務(wù)能力(核心為點(diǎn)查能力),介紹Hologres到底具備哪些服務(wù)能力,以及背后的實(shí)現(xiàn)原理。
通常我們所說(shuō)的點(diǎn)查場(chǎng)景是指Key/Value查詢的場(chǎng)景,廣泛用于在線服務(wù)。由于點(diǎn)查場(chǎng)景的廣泛需求,市場(chǎng)上存在多種KV數(shù)據(jù)庫(kù)定位于支持高吞吐、低延時(shí)的點(diǎn)查場(chǎng)景,例如被大家廣而熟知的HBase,它通過(guò)自定義的一套API來(lái)提供點(diǎn)查的能力,在許多業(yè)務(wù)場(chǎng)景都能夠獲得較好的效果。但是HBase在實(shí)際使用中也會(huì)存在一定的缺點(diǎn),這也使得很多業(yè)務(wù)從HBase遷移至Hologres,主要有以下幾點(diǎn):
- 當(dāng)數(shù)據(jù)規(guī)模大到一定程度的時(shí)候,HBase在性能方面將會(huì)有所下降,無(wú)法滿足大規(guī)模的點(diǎn)查計(jì)算,同時(shí)在穩(wěn)定性上也變得不如人意,需要有經(jīng)驗(yàn)的運(yùn)維支持
- HBase提供的是自定義API,上手有一定的成本。Hologres直接通過(guò)SQL提供高吞吐、低延時(shí)的點(diǎn)查服務(wù)。相比于其它KV系統(tǒng)提供自定義API,SQL接口無(wú)疑更加的簡(jiǎn)單易用。
- HBase采用Schema Free設(shè)計(jì),沒(méi)有數(shù)據(jù)類(lèi)型,對(duì)于檢查數(shù)據(jù)質(zhì)量,修正數(shù)據(jù)質(zhì)量也帶來(lái)了復(fù)雜度,查錯(cuò)難,修正難。Hologres具備與Postgres兼容的幾乎所有主流數(shù)據(jù)類(lèi)型,可以通過(guò)Insert/Select/Update/Delete標(biāo)準(zhǔn)SQL語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行查看、更新。
- 在Hologres中的點(diǎn)查場(chǎng)景是指行存表基于主鍵(PK)的查詢。
點(diǎn)查場(chǎng)景技術(shù)實(shí)現(xiàn)難點(diǎn)
正常情況下,一條SQL語(yǔ)句的執(zhí)行,需要經(jīng)過(guò)SQL Parser進(jìn)行解析成AST(抽象語(yǔ)法樹(shù)),再由Query Optimizer處理生成Plan(可執(zhí)行計(jì)劃),最終通過(guò)執(zhí)行Plan拿到計(jì)算結(jié)果。而要想通過(guò)SQL做到高吞吐、低延時(shí)、穩(wěn)定的點(diǎn)查服務(wù),則必須要克服如下困難:
- 如何做低甚至避免SQL解析與優(yōu)化器的開(kāi)銷(xiāo)
- 如何在低消耗的情況下,做到高并發(fā)的交互
- 如何減少消息傳遞過(guò)程中的開(kāi)銷(xiāo)
- 如何感知后端的壓力、配合做到最好的吞吐與延遲
在克服上述3大類(lèi)困難后,整體的工作方式就可以非常的簡(jiǎn)潔:在接入層(FrontEnd)上直接通過(guò)Client SDK與后端存儲(chǔ)通信。
下面將會(huì)介紹Hologres是如何克服以上3大困難,從而實(shí)現(xiàn)高吞吐低延時(shí)的點(diǎn)查。
降低、避免SQL解析與優(yōu)化器的開(kāi)銷(xiāo)
Query Optimizer進(jìn)行Short Cut
由于點(diǎn)查的Query足夠簡(jiǎn)單,Hologres的Query Optimizer進(jìn)行了相應(yīng)的short cut,點(diǎn)查Query并不會(huì)進(jìn)入Opimizer的完整流程。Query進(jìn)入FrontEnd后它會(huì)交由Fixed Planner進(jìn)行處理,并由其生成對(duì)于的Fixed Plan(點(diǎn)查的物理Plan),Fixed Planner非常輕,無(wú)需經(jīng)過(guò)任何的等價(jià)變換、邏輯優(yōu)化、物理優(yōu)化等步驟,僅僅是基于AST樹(shù)進(jìn)行了一些簡(jiǎn)單的分析并構(gòu)建出對(duì)應(yīng)的Fixed Plan,從而盡量規(guī)避掉優(yōu)化器的開(kāi)銷(xiāo)。
Prepared Statement
盡管Query Optimizer對(duì)點(diǎn)查Query進(jìn)行了short cut,但是Query進(jìn)入到FrontEnd后的解析開(kāi)銷(xiāo)依然存在、Query Optimizer的開(kāi)銷(xiāo)也沒(méi)有完全避免。
Hologres兼容Postgres,Postgres的前、后端通信協(xié)議有extended協(xié)議與simple協(xié)議兩種:
- simple協(xié)議:是一次性交互的協(xié)議,Client每次會(huì)直接發(fā)送待執(zhí)行的SQL給Server,Server收到SQL后直接進(jìn)行解析、執(zhí)行,并將結(jié)果返回給Client。simple協(xié)議里Server無(wú)可避免的至少需要對(duì)收到的SQL進(jìn)行解析才能理解其語(yǔ)義。
- extended協(xié)議:Client與Server的交互分多階段完成,整體大致可以分成兩大階段。
- 第一階段:Client在Server端定義了一個(gè)帶名字的Statement,并且生成了該Statement所對(duì)應(yīng)的generic plan(不與特定的參數(shù)綁定的通用plan)。
- 第二階段:用戶通過(guò)發(fā)送具體的參數(shù)來(lái)執(zhí)行第一階段中定義的Statement。第二階段可以重復(fù)執(zhí)行多次,每次通過(guò)帶上第一階段中所定義的Statement名字,以及執(zhí)行所需要的參數(shù),使用第一階段生成的generic plan進(jìn)行執(zhí)行。由于第二階段可以通過(guò)Statement名字和附帶的參數(shù)來(lái)反復(fù)執(zhí)行第一個(gè)階段所準(zhǔn)備好的generic plan,因此第二個(gè)段在Frontend的開(kāi)銷(xiāo)幾乎等同于0。
為此Hologres基于Postgres的extended協(xié)議,支持了Prepared Statement,做到了點(diǎn)查Query在Frontend上的開(kāi)銷(xiāo)接近于0。
高性能的內(nèi)部通信
BHClient是Hologres實(shí)現(xiàn)的一套用于與后端存儲(chǔ)直接通信的高效Private Client SDK,主要有以下幾個(gè)優(yōu)勢(shì):
1)Reactor模型、全程無(wú)鎖的異步操作
BHClient工作方式類(lèi)似reactor模型,每個(gè)目標(biāo)shard對(duì)應(yīng)一個(gè)eventloop,以“死循環(huán)”的方式處理該shard上的請(qǐng)求。由于HOS對(duì)調(diào)度執(zhí)行單元的抽象,即使是shard很多的情況下,這種工作方式的基礎(chǔ)消耗也足夠低。
2)高效的數(shù)據(jù)交換協(xié)議binary row
通過(guò)自定義一套內(nèi)部的數(shù)據(jù)通信協(xié)議binary row來(lái)減少整個(gè)交互鏈路上的內(nèi)存的分配與拷貝。
3)反壓與湊批
BHClient可以感知后端的壓力,進(jìn)行自適應(yīng)的反壓與湊批,在不影響原有Latency的情況下提升系統(tǒng)吞吐。
穩(wěn)定可靠的后端存儲(chǔ)
1)LSM(Log Structured Merge Tree)
Hologres的行存表采取LSM進(jìn)行存儲(chǔ),相比于傳統(tǒng)的B+樹(shù),LSM能夠提供更高的寫(xiě)吞吐,因?yàn)樗粫?huì)出現(xiàn)任何的隨機(jī)寫(xiě),Append Only的操作保證了其只會(huì)順序的寫(xiě)盤(pán)。
- 一個(gè)行存tablet上會(huì)存在一個(gè)memtable,和多個(gè)immutable memtable。
- 數(shù)據(jù)更新都會(huì)寫(xiě)入到memtable中,當(dāng)memtable寫(xiě)滿后會(huì)轉(zhuǎn)變?yōu)閕mmtable memtable,immutable memtable會(huì)Flush成Key有序的SST(Sorted String Table)文件,SST文件一旦生成則不能修改,因此不會(huì)發(fā)生隨機(jī)寫(xiě)的操作。
- SST文件在文件系統(tǒng)里面按層組織,除了level 0上的SST文件間無(wú)序,且存在overlap外,其它level上的SST文件間有序,且無(wú)overlap。因此查詢的時(shí)候,對(duì)于level 0上的文件需要逐個(gè)遍歷,而其它level的文件可以二分查找。底層的SST文件通過(guò)Compaction成新的SST文件去到更高層,因此低層的數(shù)據(jù)要比高層的新,所以一旦在某層上找到了滿足條件的key則無(wú)需往更高層去查詢。
2)基于C++純異步的開(kāi)發(fā)
采用LSM對(duì)數(shù)據(jù)進(jìn)行組織存儲(chǔ)的系統(tǒng)并不僅僅只有Hologres,LSM在谷歌的"BigTable"論文中被提出后,很多的系統(tǒng)都對(duì)其進(jìn)行了借鑒采用,例如HBase。Hologres采用C++進(jìn)行開(kāi)發(fā),相較于Java,native語(yǔ)言使得我們能夠追求到更極致的性能。同時(shí)基于HOS(Hologres Operation System)提供的異步接口進(jìn)行純異步開(kāi)發(fā),HOS通過(guò)抽象ExecutionContext來(lái)自我管理CPU的調(diào)度執(zhí)行,能夠最大化的利用硬件資源、達(dá)到吞吐最大化。
3)IO優(yōu)化與豐富的Cache機(jī)制
Hologres實(shí)現(xiàn)了非常豐富的Cache機(jī)制row cache、block cache、iterator cache、meta cache等,來(lái)加速熱數(shù)據(jù)的查找、減少I(mǎi)O訪問(wèn)、避免新內(nèi)存分配。當(dāng)無(wú)可避免的需要發(fā)生IO時(shí),Hologres會(huì)對(duì)并發(fā)IO進(jìn)行合并、通過(guò)wait/notice機(jī)制確保只訪問(wèn)一次IO,減少I(mǎi)O處理量。通過(guò)生成文件級(jí)別的詞典及壓縮,減少文件物理存儲(chǔ)成本及IO訪問(wèn)。
總結(jié)
Hologres致力于一站式實(shí)時(shí)數(shù)倉(cāng),除了具備處理復(fù)雜OLAP分析場(chǎng)景的能力之外,還支持超高QPS在線點(diǎn)查服務(wù),通過(guò)使用標(biāo)準(zhǔn)的Postgres SDK接口,就能通過(guò)SQL獲得低延時(shí)、高吞吐的在線服務(wù)能力,簡(jiǎn)化學(xué)習(xí)成本,提升開(kāi)發(fā)效率。
作者:周思華(花名:思召),阿里巴巴技術(shù)專家,現(xiàn)從事交互式分析引擎Hologres研發(fā)工作。
后續(xù)我們將會(huì)陸續(xù)推出有關(guān)Hologres的技術(shù)底層原理揭秘系列,具體規(guī)劃如下,敬請(qǐng)持續(xù)關(guān)注!
- Hologres揭秘:首次公開(kāi)!阿里巴巴云原生實(shí)時(shí)數(shù)倉(cāng)核心技術(shù)揭秘
- Hologres揭秘:首次揭秘云原生Hologres存儲(chǔ)引擎
- Hologres揭秘:深度解析高效率分布式查詢引擎
- Hologres揭秘:高性能原生加速M(fèi)axCompute核心原理
- Hologres揭秘:優(yōu)化COPY,批量導(dǎo)入性能提升5倍+
- Hologres揭秘:如何支持超高QPS在線服務(wù)(點(diǎn)查)場(chǎng)景
- Hologres揭秘:如何支持高吞吐Upsert
- Hologres揭秘:如何支持高并發(fā)查詢
- Hologres揭秘:如何支持高可用架構(gòu)
- Hologres揭秘:如何支持資源隔離,支持多種負(fù)載
- Hologres揭秘:向量檢索引擎Proxima原理與使用實(shí)踐
- Hologres揭秘:讀懂執(zhí)行計(jì)劃,查詢性能翻十倍
- Hologres揭秘:分布式系統(tǒng)如何設(shè)計(jì)Shard與Table Group
- Hologres揭秘:如何支持更多Postgres生態(tài)擴(kuò)展包
- Hologres揭秘:高吞吐寫(xiě)入Hologres的N種姿勢(shì)
- ......
感謝您的閱讀,也歡迎使用體驗(yàn)Hologres,可以參考使用手冊(cè)。
原文鏈接:https://developer.aliyun.com/article/785647?
版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開(kāi)發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開(kāi)發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開(kāi)發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫(xiě)侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的Hologres揭秘:如何支持超高QPS在线服务(点查)场景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 活动延期通知 | 7.31 阿里云 Se
- 下一篇: 开放下载!《一站式大数据开发治理Data