PayPal 最近開源了JunoDB,這是一個(gè)底層使用 RocksDB 存儲(chǔ)引擎的分布式鍵值存儲(chǔ)。JunoDB 是一個(gè)高度可用且非常注重安全的數(shù)據(jù)庫。在 PayPal,它每天處理 3500 億次請(qǐng)求。
JunoDB是用 Golang 編寫的,采用了基于代理的設(shè)計(jì),支持連接的線性橫向擴(kuò)展。它使用一致性哈希算法對(duì)數(shù)據(jù)進(jìn)行分區(qū),最大限度地減少了集群擴(kuò)展或收縮時(shí)的數(shù)據(jù)移動(dòng)。為了實(shí)現(xiàn)零停機(jī),JunoDB 使用了數(shù)據(jù)中心內(nèi)和跨數(shù)據(jù)中心復(fù)制,并通過基于仲裁的協(xié)議和兩階段提交確保數(shù)據(jù)一致性。PayPal 首席 MTS Yaping Shi寫道:
實(shí)際上,PayPal 的每一個(gè)核心后端服務(wù)都依賴于 JunoDB,從登錄到風(fēng)險(xiǎn)再到最終的交易處理。使用 JunoDB,應(yīng)用程序可以有效地存儲(chǔ)和緩存數(shù)據(jù),以便在關(guān)系數(shù)據(jù)庫和其他服務(wù)上快速訪問以及降低負(fù)載。

圖片來源:https://medium.com/paypal-tech/unlocking-the-power-of-junodb-paypals-key-value-store-goes-open-source-ee85f935bdc1
該數(shù)據(jù)庫主要包含三個(gè)組件:JunoDB 客戶端庫(有面向不同語言的版本)、JunoDB 客戶端代理(一個(gè)連接存儲(chǔ)服務(wù)器并負(fù)責(zé)分片的負(fù)載平衡器),以及 JunoDB 存儲(chǔ)(基于高性能嵌入式數(shù)據(jù)庫RockDB,同時(shí)提供了內(nèi)存和磁盤持久化存儲(chǔ))。
如果出現(xiàn)節(jié)點(diǎn)故障,那么它提供的自動(dòng)化即時(shí)故障轉(zhuǎn)移功能避免了集群領(lǐng)導(dǎo)的重新選舉或數(shù)據(jù)的重新分配。
對(duì)于這個(gè)新的 NoSQL 解決方案,其建議的應(yīng)用場(chǎng)景包括緩存、存儲(chǔ)用戶首選項(xiàng)、帳戶詳情和 API 響應(yīng)等信息、冪等性(確保操作冪等并消除任何重復(fù)處理)和延遲橋接(幫助解決由跨區(qū)域的分布式數(shù)據(jù)庫所造成的復(fù)制延遲)。Shi 介紹了該項(xiàng)目在 PayPal 內(nèi)部的演進(jìn)情況:
它最初是一個(gè)單線程的 C++程序,但后來,為了實(shí)現(xiàn)高并發(fā)和多核友好性,我們用 Golang 進(jìn)行了重寫。JunoDB 還從一個(gè)短 TTL(生存時(shí)間)的內(nèi)存數(shù)據(jù)存儲(chǔ)演變?yōu)橐粋(gè)支持長 TTL 的持久數(shù)據(jù)存儲(chǔ)。默認(rèn)情況下,它通過磁盤加密和 TLS 傳輸來提升數(shù)據(jù)的安全性。
Mercado Libre 高級(jí)軟件工程師 Nahim Felicito Gomez評(píng)論道:
使用 Golang 重寫 JunoDB,PayPal 充分利用了該語言的并發(fā)性和多核能力,那也是 Golang 成為構(gòu)建 JunoDB 客戶端庫的理想選擇的原因。
在Hacker News上,許多用戶討論了該項(xiàng)目及鍵值存儲(chǔ)的好處,并將 JunoDB 與FoundationDB等其他數(shù)據(jù)庫進(jìn)行了比較,而用戶 gregwebs 則質(zhì)疑公告中缺乏數(shù)據(jù):
如果能看到一些基準(zhǔn)測(cè)試,或者只是提供一些數(shù)據(jù),那就太好了。TiKV是 CNCF 捐贈(zèng)的項(xiàng)目,具有大致相同的架構(gòu),并已部署在超過 200 個(gè)節(jié)點(diǎn)的大型集群中。
JunoDB 是GitHub上的一個(gè)開源項(xiàng)目,遵循 Apache 2 許可。為了幫助開發(fā)人員有效地使用該數(shù)據(jù)庫,PayPal 發(fā)布了服務(wù)器設(shè)置和客戶端構(gòu)建視頻教程。該項(xiàng)目的路線圖上還包括 Golang 客戶端和 Kubernetes JunoDB 操作符。 |