幾款分佈式數據庫的對比

過去十年見證了分佈式數據庫的崛起不僅通過本地集羣來實現負載均衡,並提供高可用性,還具有數據中心內的機架感知等屬性。專爲雲而設計的分佈式數據庫,可以跨越可用性區域,通過編排技術,支持公有云、私有云、混合雲部署。近年來,市面上出現了大量專爲分佈式數據庫部署而設計的新數據庫系統,以及在初始設計中添加了分佈式架構組件的其他數據庫系統。

DB-Engines.com 排名前 100 的數據庫

DB-Engines.com 是數據庫領域的權威排行榜,它保留了所有數據庫的流行指數,使用一種算法進行加權,監測諸如網站上的提及次數和谷歌的搜索趨勢,Stack Overflow 上的討論或推特中的評論,工作職位要求的技術技能,以及在 LinkedIn 個人資料中提到這些技術的數量。

▲截至 2022 年 5 月,DB-Engines.com 上排名前 100 的數據庫

雖然 DB-Engines 收集了數百個不同的數據庫(截至 2022 年 5 月共有 394 個)。但是本文我們縮小範圍,只觀察前 100 名數據庫。在很大程度上,反映了市場現狀。

關係型數據庫管理系統(RDBMS),傳統的 SQL 系統,仍然是最大的類別,佔列表的 47%。

另外,列表中有 25% 是 NoSQL 系統,涵蓋了許多不同類型的數據庫,像 MongoDB 文檔數據庫、Redis 鍵值系統、ScyllaDB 寬列數據庫,以及 Neo4j 圖數據庫。

還有 11% 的數據庫被列爲多模型數據庫,包括在同一系統中支持 SQL 和 NoSQL 的混合數據庫,如微軟的 Cosmos DB 或 ArangoDB,或者支持多種 NoSQL 數據模型的數據庫,如 DynamoDB,它將自己列爲 NoSQL 鍵值系統和文檔存儲。

最後,還有一些是由各種特殊用途的數據庫組成,從搜索引擎到時間序列數據庫,以及其他不容易歸入簡單的 “SQL 與 NoSQL” 區域的數據庫。

但是所有這些數據庫都是分佈式數據庫嗎?這個詞到底是什麼意思?

分佈式數據庫的定義

2016 年 12 月 14 日,ISO/IEC 發佈了最新版本的數據庫語言 SQL 標準(ISO/IEC9075:2016)。隨着時間的推移,如何構建與 SQL 兼容的分佈式 RDBMS 系統一直在發展。分佈式 SQL,如 PostgreSQL 或 CockroachDB NewSQL 系統。相反,沒有 ANSI 或 ISO 或 IETF 或 W3C 定義什麼是 NoSQL 數據庫。每種數據庫都使用自己的專有查詢語言,比如用於寬列 NoSQL 數據庫的 Cassandra 查詢語言(CQL),用於圖形數據庫的 Gremlin/Tinkerpop 查詢方法。

然而,它們並沒有定義數據如何在這些數據庫中分佈,查詢語言也不能解決架構問題。因此,無論是 SQL 還是 NoSQL,對於什麼是分佈式數據庫,並沒有標準、協議或共識。

因此,我花了一些時間來寫下我自己的定義。坦率地說,這更像是一個門外漢的實用主義觀點,而不是計算機科學教授的見解。

簡而言之,你必須決定你如何定義集羣,以及如何跨集羣分配數據。接下來,你必須確定集羣中每個節點的角色。每個節點都是對等的,還是有些節點處於更優越的領導地位,而其他節點則是跟隨者。

然後,基於這些角色,你如何處理故障轉移?最後,你必須在此基礎上,弄清楚你如何儘可能均勻和容易地複製和分片數據。而這並不試圖做到詳盡無遺,你可以添加自己的特定條件。

簡短的清單:感興趣的系統

考慮到這些,我在前 100 名數據庫中,找到五個示例,看看它們在測量屬性時是如何比較的。其中有兩個 SQL 系統和三個 NoSQL 系統。

Postgres 和 CockroachDB 代表最好的分佈式 SQL。CockroachDB 被稱爲 NewSQL,專爲分佈式數據庫而設計。

MongoDB、Redis 和 ScyllaDB 是分佈式 NoSQL,分別是文檔數據庫,鍵值存儲,寬列數據庫(也被稱爲鍵值數據庫)。

在大多數情況下,適用於 ScyllaDB 的也同樣適用於 Apache Cassandra 和其他與 Cassandra 兼容的系統。

假定你擁有專業的經驗,而且對 SQL 與 NoSQL 的區別相對了解。基本上,如果需要一個表 JOIN,堅持使用 SQL 和 RDBMS。如果你可以將數據反規範化,那麼 NoSQL 可能是一個很好的選擇。我們不打算討論作爲數據結構或查詢語言,兩者哪個 “更好”。而是討論作爲一個分佈式數據庫,哪個更好。

多數據中心集羣

我們的選項在集羣方面是如何比較的?現在,它們都能夠進行集羣,甚至是多數據中心操作。但是在 PostgreSQL、MongoDB 和 Redis 中,它們最初設計於單數據中心本地集羣,在多數據中心設計之前就已經成爲一種架構要求。

Postgres 首次發佈於 1986 年,完全早於雲計算的概念。後來,它允許在其設計上,納入這些技術和能力。

作爲 NewSQL 革命的一部分,CockroachDB 從一開始就考慮到了全球分佈。MongoDB 是在公有云誕生之初發布的,最開始設計時考慮到了單數據中心集羣,但現在已經增加了對許多不同拓撲結構的支持。通過 MongoDB Atlas,可以輕鬆部署到多個地區。

Redis,由於其低延遲的設計,通常被部署在單個數據中心,但它具有允許多數據中心部署的企業特性。ScyllaDB,像 Cassandra 一樣,從一開始就考慮到了多數據中心的部署。

集羣管理

如何進行復制和分片,取決於數據庫架構的分層或同質化程度。

例如,在 MongoDB 中,有一個主服務器,其餘的是主服務器的副本。副本是隻讀的,你只能對這個數據庫的主副本進行寫操作,不能直接更新。相反,你寫到主數據庫,它就會更新副本。所以,節點是異質的,而不是同質的。

這有助於在讀取繁重的工作負載中分配流量,但在混合或寫入工作負載中,對你沒有一點好處,主服務器可能會成爲一個瓶頸。

同樣,如果主服務器發生故障會怎樣?你將不得不完全停止寫操作,直到集羣選出一個新的主服務器,並將寫操作分流到它上面。

相反,如果 ScyllaDB 或 Cassandra,或任何其他無 active-active 的系統,客戶可以從任何節點讀取或寫入。沒有單一的故障點,節點的同質化程度要高得多。

而且每個節點都可以更新集羣中的任何數據副本。因此,如果你有三個節點,每個節點都會根據其他兩個節點的任何寫入進行更新。

active-active 在計算方面本身就比較困難,但是一旦解決了服務器保持彼此同步的問題,就會得到一個可以更好地平衡混合或寫入大量工作負載的系統,因爲每個節點都可以提供讀取或寫入服務。

那麼,我們的各種例子在主複本或 active-active 對等方面是如何疊加的?CockroachDB 和 ScyllaDB,以及 Cassandra 一開始就考慮了 active-active 的主動式設計。在 Postgres 中,有一些可選的方法可以做到這一點,但它不是內置的。

此外,MongoDB 沒有正式支持 active-active,但是已經有一些人在嘗試如何做到這一點了。

對於 Redis 來說,active-active 模型在 Redis 企業中可以通過無衝突複製數據類型(CRDTs)實現。Postgres、MongoDB 和 Redis 都默認使用主副本數據分佈模型。

複製

分佈式系統設計也會影響如何跨部署到不同機架或數據中心之間分配數據。例如,給定一個主副本系統,只具有主的數據中心可以爲任何寫入工作負載服務,其他數據中心只能作爲只讀副本。

在一個支持多數據中心集羣的點對點系統中,整個集羣中的每個節點都可以接受讀或寫操作。

通過 ScyllaDB,你可以決定每個站點有相同或甚至不同的複製因素。這裏我展示了在一個數據中心的三個副本,在另一個數據中心有兩個副本的可能性。

操作可以有不同級別的一致性。你可能在三個節點的數據中心進行本地數據的讀或寫,需要更新任一數據中心的節點才能成功執行操作。可調整的一致性,結合多數據中心的拓撲感知,爲工作負載提供更多的靈活性。

拓撲感知

本地集羣是分佈式數據庫開始的方式,允許多個系統共享負載。如果想讓數據庫在多個節點上進行分片,或者通過確保相同的數據在多個節點上可用來實現高可用性,那麼這一點非常重要。

如果所有節點都安裝在同一個機架上,一旦這個機架發生故障,就會很棘手。因此,添加拓撲感知,以便你可以感知同一數據中心內的機架。確保將數據分散在數據中心的多個機架上,從而最大限度地減少電源或連接丟失到一個或另一個機架的中斷。

有些數據庫做的很好,允許在不同的數據中心運行數據庫的多個副本,並使用某種跨集羣更新機制。每個數據庫都是自主運行的,它們的同步機制可以是單向的,一個數據中心更新一個下游的副本,也可以是雙向的或多向的。

這種地理分佈可以通過允許更靠近用戶的連接,來減少延遲。跨可用性區域或地區的數據庫,還可以確保單個數據中心災難不會導致數據庫的部分或全部丟失。

去年我們的一個客戶就發生了這種情況,但由於他們部署在三個不同的數據中心,所以數據損失爲零。

跨集羣更新最初是在批量級別上實現的。確保你的數據中心每天至少有一次同步。這並沒有持續多久,後面人們開始確保更活躍的事務級更新。

如果你在運行強一致性數據庫,就會受到基於光速的實時傳播延遲的限制。因此,實現最終一致性是爲了允許每個操作更新使用多數據中心,同時考慮到在短期內,要使所有數據中心的數據保持一致可能需要時間。

那麼,在拓撲感知方面,它是如何疊加的?

所以,CockroachDB 和 ScyllaDB 也是內置的。

從 2015 年開始,拓撲感知也成爲 MongoDB 的一部分,他們在這方面有着多年的經驗。

Postgres 和 Redis 最初被設計爲單數據中心解決方案,因此處理多數據中心的延遲對兩者來說並非易事。現在,你可以添加拓撲感知,就像添加 active-active 系統功能一樣,但它並不是開箱即用的。

讓我們回顧一下所討論的內容,分別查看這些數據庫的屬性。

▶︎ PostgreSQL

PostgreSQL 是世界上最流行的的開源數據庫之一,它以可靠性和穩定性而著稱, 在處理複雜 SQL 方面也表現出了絕對的優勢。然而,Postgres 仍在研究其跨集羣和多數據中心的集羣。

由於 SQL 基於強一致性事務模式,所以它不能很好地跨地域跨集羣。在所有相關的數據中心之間,每個查詢都將由於長時間的延遲而暫停。

此外,Postgres 依靠的是主副本模型。集羣中的一個節點是領導者,而其他節點是副本。雖然有負載平衡器或 active-active 插件,但這些也超出了基本的服務範圍。

最後,Postgres 的分片在大多數情況下仍然是手動的,儘管他們在開發自動分片方面取得了進展,但這也超出了基本產品的範圍。

▶︎ CockroachDB

CockroachDB 聲稱自己是 “NewSQL”,一個專爲分發而設計的 SQL 數據庫。它可以水平擴展,在磁盤、機器、機架,甚至數據中心故障時都能生存下來,做到延遲最小,無需手動干預。

值得一提的是,CockroachDB 使用 Postgres 線協議,並大量借鑑了 Postgres 開創的許多概念,而且並不侷限於 Postgres 的架構。

多數據中心集羣和點對點的拓撲結構從一開始就被內置。自動分片和數據複製也是如此。它還內置了數據中心感知功能,而且還可以添加機架感知功能。

對 CockroachDB 來說,它要求所有的事務都有很強的一致性,你可以把它看作是一個優點或缺點。既沒有最終一致性的靈活性,也沒有可調的一致性。這將降低吞吐量,並在任何跨數據中心部署中要求較高的基線延遲。

▶︎ MongoDB

MongoDB 是 NoSQL 領域的領導者。隨着它的發展,大量的分佈式數據庫功能被添加。現如今,MongoDB 能夠支持多數據中心集羣。在大多數情況下,它仍然遵循主副本模式,也有辦法使其成爲對等的 active-active。

▶︎ Redis

接下來是 Redis,一個旨在作爲內存緩存或數據存儲的鍵值存儲。Redis 的數據全部在內存裏,如果突然宕機,數據就會全部丟失,因此必須有一種機制來保證 Redis 的數據不會因爲故障而丟失,這種機制就是 Redis 的持久化機制。

雖然持久化保存數據,但如果數據集不適合放在 RAM 中,它就會遭受巨大的性能損失。

正因爲如此,它在設計時考慮到了本地集羣。如果你無法承受 5 毫秒的等待時間來從 SSD 上獲取數據,您可能更無法等待 145 毫秒來完成從舊金山到倫敦的網絡往返時間。然而,有一些企業特性允許多數據中心的 Redis 集羣。

Redis 在大多數情況下是以主副本模式運行的。這適用於大量讀取的緩存服務器。但這意味着,主節點是數據需要首先寫入的地方,然後將這些數據分散到副本,以幫助平衡其緩存負載。

有一個企業功能,允許對等的 active-active 集羣。Redis 可以自動分片和複製數據,但它的拓撲感知僅限於作爲企業功能的機架感知。

▶︎ ScyllaDB

ScyllaDB 是按照 Apache Cassandra 中的分佈式數據庫模型設計的。因此,它默認是多數據中心集羣。它可以自動分片,並且每個操作都有可調整的一致性,如果你想要更強的一致性,它甚至還支持輕量級事務來提供寫入的線性化。

就拓撲感知而言,ScyllaDB 支持機架感知和數據中心意識,甚至支持標記感知和分片感知,不僅知道數據存儲在哪個節點上,甚至可以知道與該數據關聯的 CPU。

結論

雖然對於什麼是分佈式數據庫,還沒有一個行業標準,但是我們可以看到,許多領先的 SQL 和 NoSQL 數據庫,都在某種程度上支持一組核心功能或屬性。其中有些功能是內置的,有些被認爲是增值包或第三方選項。

在本文分析的五個典型分佈式數據庫系統中,CockroachDB 爲 SQL 數據庫提供了最全面的功能和特性,ScyllaDB 爲 NoSQL 系統提供了最全面的功能。

該分析應被視爲某個時間段的調查。鑑於下一個技術週期的需求,每一個數據庫系統都在不斷髮展,這個行業並沒有停滯不前。

對用戶來說,分佈式數據庫每年都在進步,變得更加靈活、性能更強、更具彈性和可擴展性。

原文鏈接

https://dzone.com/articles/comparing-distributed-databases

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/cOJ8o9d5Jb5jY4dsnHqszQ