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