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