Neondb-窮人的Aurora,你看明白了嗎?
這篇文章本來(lái)是昨天要發(fā)的,因?yàn)樯习嗦飞嫌兴迹缘焦竞笈R時(shí)寫了一篇發(fā)出了。這兩天經(jīng)常有朋友問(wèn)我,兒子高考怎么不回家陪陪。十分感謝這些熱心的朋友,說(shuō)實(shí)在的,兒子高考還真沒(méi)啥可陪的,上周日返校后今天考完才離開(kāi)學(xué)校。不過(guò)今天怎么都得在化學(xué)考試結(jié)束前趕到校門口去接一下,所以今天上午我就回深圳了。
AWS Aurora的出現(xiàn)讓人眼前一亮,這種云原生生態(tài)的數(shù)據(jù)庫(kù)產(chǎn)品大大簡(jiǎn)化了用戶數(shù)據(jù)庫(kù)使用門檻,只不過(guò)Aurora沒(méi)有線下版本,因此也很難進(jìn)入尋常百姓家了。前陣子我一個(gè)客戶也和我討論了Serverless Database的問(wèn)題,他們企業(yè)中存在數(shù)百個(gè)規(guī)模不大,重要性也不高的系統(tǒng),數(shù)據(jù)庫(kù)系統(tǒng)的建設(shè)與運(yùn)維管理一直占用了大量的企業(yè)IT資源,能不能想個(gè)辦法,用Serverless Database來(lái)替代現(xiàn)在的云上的大量的小型MYSQL RDS實(shí)例。最好是計(jì)算可以放到k8s里,數(shù)據(jù)可以持久化到S3的。
正好前幾天群里有個(gè)朋友提到Neon Database這個(gè)開(kāi)源數(shù)據(jù)庫(kù),我就簡(jiǎn)單地研究了一下。
從Neon的官網(wǎng)上我們可以看到Neon是一個(gè)serverless的開(kāi)源數(shù)據(jù)庫(kù),可以作為AWS Aurora Postgres的替代。它對(duì)PG進(jìn)行了存算分離改造,將PG的存儲(chǔ)層改造為一個(gè)分布式的集群。
經(jīng)過(guò)對(duì)PG的架構(gòu)進(jìn)行重構(gòu)后,Neon的計(jì)算單元是部署在k8s pods中的postgresql兼容SQL引擎,應(yīng)用可以通過(guò)PG客戶端或者PG兼容的JDBC/ODBC引擎連接計(jì)算單元來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。Neon可以為每個(gè)租戶創(chuàng)建一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)實(shí)例,其SQL引擎跑在K8S pods里,當(dāng)有會(huì)話訪問(wèn)數(shù)據(jù)庫(kù)實(shí)例的時(shí)候,容器被激活,向外提供服務(wù)。當(dāng)一段時(shí)間內(nèi)沒(méi)有會(huì)話訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,POD會(huì)被清理,從而回收資源。Neon目前支持PG 14/PG15,與原生態(tài)的PG保持極高的兼容性,支持大量的PG插件。
Safekeeper集群:負(fù)責(zé)數(shù)據(jù)庫(kù)的持久化。PostgreSQL將預(yù)寫日志(WAL)流式傳輸?shù)絊afekeepers,Safekeepers持久地存儲(chǔ)WAL,直到它被Pageserver處理并上傳到云存儲(chǔ)。同時(shí)WAL也可以在對(duì)象存儲(chǔ)中持久化保存。如果Safekeeper可以把數(shù)據(jù)存儲(chǔ)在高性能SSD上,那么數(shù)據(jù)修改可以快速落盤,實(shí)現(xiàn)較大并發(fā)的數(shù)據(jù)寫入。
Pageserver:負(fù)責(zé)處理讀取請(qǐng)求。為此, Pageserver將傳入的 WAL 流處理為自定義存儲(chǔ)格式,使所有page版本都易于訪問(wèn)。Pageserver還將數(shù)據(jù)上傳到云對(duì)象存儲(chǔ),并按需下載數(shù)據(jù)。同時(shí),Pageserver還承擔(dān)了一個(gè)緩沖層,存儲(chǔ)了經(jīng)常會(huì)被數(shù)據(jù)庫(kù)訪問(wèn)的較熱的PAGE。
Neon 使用 S3 等云對(duì)象存儲(chǔ)進(jìn)行長(zhǎng)期數(shù)據(jù)存儲(chǔ)。存儲(chǔ)的數(shù)據(jù)是靜態(tài)加密的。持久化的數(shù)據(jù)和不怎么訪問(wèn)的數(shù)據(jù)頁(yè)存儲(chǔ)在S3中,價(jià)格低廉,容量巨大,擴(kuò)展方便的對(duì)象存儲(chǔ)為持久化數(shù)據(jù)提供了有效的存儲(chǔ)。
在這個(gè)架構(gòu)中,Safekeepers可以被認(rèn)為是一個(gè)超可靠的寫入緩沖區(qū),它保存最新的數(shù)據(jù),直到它被處理并上傳到云存儲(chǔ)。Safekeepers通過(guò)Paxos協(xié)議以確??煽啃?。Pageserver還用作云存儲(chǔ)的讀緩存,提供對(duì)數(shù)據(jù)頁(yè)面的快速隨機(jī)訪問(wèn)。在這個(gè)架構(gòu)中,已經(jīng)消除了bgwriter,因?yàn)槲锢鞵AGE已經(jīng)不需要寫入,而是完全通過(guò)WAL異步回放。
目前Neon已經(jīng)開(kāi)放了公有云服務(wù),并且提供免費(fèi)試用,于是我在新加坡的Neon公有云免費(fèi)申請(qǐng)了一個(gè)數(shù)據(jù)庫(kù)。申請(qǐng)完畢后,就可以通過(guò)本地的psql客戶端連上去使用了。
我在上面創(chuàng)建了一個(gè)測(cè)試PG表連接的DEMO。然后測(cè)試一下幾個(gè)表連接的語(yǔ)句。
EXPLAIN ANALYZE SELECT count(*) FROM join1 j1 INNER JOIN join2 j2 ON j1.id = j2.id WHERE J1.ID>1 AND J1.ID<10;
128毫秒執(zhí)行時(shí)間,性能一般,不過(guò)還不算壞。
Neon 允許以與分支代碼相同的方式即時(shí)對(duì)數(shù)據(jù)進(jìn)行分支??梢钥焖偾医?jīng)濟(jì)高效地對(duì)數(shù)據(jù)進(jìn)行分支,用于開(kāi)發(fā)、測(cè)試和各種其他目的,從而提高開(kāi)發(fā)人員的工作效率并優(yōu)化持續(xù)集成和交付 (CI/CD) 管道。分支數(shù)據(jù)可以方便地通過(guò)云存儲(chǔ)的復(fù)制克隆來(lái)實(shí)現(xiàn)。可以從當(dāng)前或過(guò)去的狀態(tài)創(chuàng)建分支。例如,您可以創(chuàng)建一個(gè)分支,其中包含截至當(dāng)前時(shí)間點(diǎn)或更早時(shí)間點(diǎn)的所有數(shù)據(jù)。
分支與其原始數(shù)據(jù)隔離,因此您可以自由地使用它,修改它,或者在不再需要它時(shí)刪除它。對(duì)分支的更改是獨(dú)立的。分支及其父分支共享相同的歷史記錄,但在分支創(chuàng)建時(shí)會(huì)有所不同。對(duì)分支的寫入將另存為增量。創(chuàng)建分支不會(huì)增加父分支上的負(fù)載或以任何方式影響它,這意味著您可以隨時(shí)創(chuàng)建分支,而不會(huì)影響生產(chǎn)系統(tǒng)的性能。每個(gè) Neon 項(xiàng)目都是使用一個(gè)名為 的主分支創(chuàng)建的。您創(chuàng)建的第一個(gè)分支是從項(xiàng)目的主分支分支。后續(xù)分支可以從主分支或以前創(chuàng)建的分支上進(jìn)行。
我可以在管控臺(tái)上快速創(chuàng)建一個(gè)分支。如果創(chuàng)建一個(gè)branch僅僅為了備份,可以不創(chuàng)建compute endpoint,否則需要?jiǎng)?chuàng)建一個(gè)compute endpoint。我創(chuàng)建了一個(gè)分支,就可以用它來(lái)做一些其他的應(yīng)用了,比如用于測(cè)試或者研發(fā),亦或是交給審計(jì)部門去使用。每個(gè)compute endpoint都有一個(gè)獨(dú)立的pod來(lái)承載,可以作為一個(gè)獨(dú)立數(shù)據(jù)庫(kù)使用,系統(tǒng)會(huì)生成一個(gè)訪問(wèn)連接串。
Neon總體來(lái)說(shuō)看上去不錯(cuò),后續(xù)我們團(tuán)隊(duì)會(huì)進(jìn)行本地化部署和驗(yàn)證。不過(guò)Neon的歷史還比較短,功能也還比較簡(jiǎn)單,可靠性也欲待驗(yàn)證。
目前Neon對(duì)備份和災(zāi)備的支持還比較簡(jiǎn)單,數(shù)據(jù)的安全完全依靠云平臺(tái)和對(duì)象存儲(chǔ)來(lái)保障。這決定了Neon還很難承載關(guān)鍵性的大型應(yīng)用,不過(guò)企業(yè)中的一些小型數(shù)據(jù)庫(kù)應(yīng)用使用還是足夠的,其最大的好處是方便。
Neon是以Apache V2開(kāi)源的,我們目前可以到GITHUB上去下載,項(xiàng)目名稱為NervanaSystems/neon。整個(gè)項(xiàng)目是用Rust開(kāi)發(fā)的,其易讀性不錯(cuò),作為數(shù)據(jù)庫(kù)產(chǎn)品,性能應(yīng)該也沒(méi)問(wèn)題。Neon使用Postgresql作為嵌入項(xiàng)目,目前Neon支持PG14/PG15兩個(gè)版本,有興趣的朋友可以去試試。Neon的出現(xiàn),將會(huì)大大豐富PG數(shù)據(jù)庫(kù)生態(tài),以此為基礎(chǔ)開(kāi)發(fā)一個(gè)云原生數(shù)據(jù)庫(kù)產(chǎn)品也是可行的。