基礎普及之什麼是分佈式SQL


本文向您介紹分佈式SQL的基本概念,其對應的數據庫架構,以及對於業務應用的各種優勢。

【51CTO.com快譯】在過去的近40年中,SQL已經成為了關係型數據庫(又稱為RDBMS)的通用語言。這也就是為什麼關係型數據庫經常被簡單稱為SQL數據庫的原因。從架構而言,以Oracle、PostgreSQL和MySQL為首的傳統SQL數據庫,是單體式(monolithic)的。也就是說,它們無法在多個實例之間自動地分配數據和查詢。而NewSQL數據庫的出現使得SQL具有了可擴展性和高性能。當然,此類數據庫仍然具有與生俱來的侷限性。

2015年,Docker容器和Kubernetes編排的出現,讓我們能夠以靈活、可組合的基礎架構方式,來創建各種基於微服務的應用。其中,內置的可擴容性、靈活性、以及地理分佈特性,是此類雲原生架構的核心特點。這也就是人們常說的“分佈式SQL”--這一新型的數據庫。在應用方面,此類分佈式SQL數據庫的一個顯著特徵是:無論其中有多少個節點,整個數據庫集群對於應用程序而言,都被其視為一個邏輯的SQL數據庫。

數據庫的架構

分佈式SQL數據庫通常具有如下三層體系結構。

基礎普及之什麼是分佈式SQL

1. SQL API

顧名思義,分佈式SQL數據庫仍然必須提供SQL API服務,以便應用程序可以對關係型數據進行建模,並執行涉及到各種關係信息的查詢操作。它保留了SQL數據庫典型的數據建模結構,包括:索引、外鍵約束、JOIN查詢、以及多行ACID事務(譯者注:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability))。

2.分佈式查詢執行

由於分佈式SQL的查詢能夠被自動地分配到目標群集的多個節點上,因此,此舉有效地避免了單個節點成為查詢處理中的瓶頸問題。具體的查詢流程為:目標群集中的任一節點都可以接受傳入的某個查詢。通過在網絡中的各節點之間傳輸數據、協同工作,該節點能夠以最小化處理等待時間的方式,僅分擔查詢請求中的一部分任務。而由其他節點協助完成剩餘的部分。最後,該接受請求的原始節點,將彙總所有的查詢結果,併發回給客戶端應用程序。

3.分佈式數據存儲

那些包含有索引信息的數據會被自動分佈(也稱為分片,sharded)到群集的多個節點處。此舉確保了單個節點都不會成為高性能和高可用性的瓶頸。此外,數據庫集群能夠支持高一致性的複製、以及多行(也稱為分佈式)ACID事務,進而保留了單個邏輯數據庫的基本概念。

高度一致性的複製

在數據庫的管理概念中,所謂支持強大的SQL API層,其本質上就是要求處於底層的存儲層,能夠在跨數據庫的群集節點上建立強一致性的複製。這就意味著:對於數據庫的寫入操作,將會在多個節點上被同步提交,以保證出現故障時的數據可用性。而讀取操作則是基於最後一次被提交的寫入數據,或是出錯之前的數據。該屬性通常被稱為線性一致性(Linearizability,http://www.bailis.org/blog/linearizability-versus-serializability/)。根據著名的CAP原則(https://towardsdatascience.com/cap-theorem-and-distributed-database-management-systems-5c2be977950e,譯者注:一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)),分佈式SQL數據庫具有一致性和分區容錯性。

分佈式的ACID事務

為了能夠支持分佈式的ACID事務,分佈式數據庫的存儲層需要在多個節點的多個數據行中進行事務性的協調任務。此處,它們正好用到了兩階段提交(2 Phase Commit,2PC)協議。參照ACID中I(隔離性)的要求,為了能夠對併發式的數據訪問實現嚴格的隔離,分佈式SQL數據庫將可序列化性(Serializability,http://www.bailis.org/blog/linearizability-versus-serializability/)作為最嚴格的隔離級別,並且通過快照(Snapshot)之類的其他方式來支持較弱的隔離級別。

業務應用的優勢

分佈式SQL的四個關鍵優勢,如下圖所示。

1.讓SQL和事務類的開發更具敏捷性

如今,由於SQL仍然是一種輕鬆實現建模關係和多行操作的數據建模語言,因此為了滿足應用開發人員持續對於SQL數據庫的操作習慣與需求,即便是Amazon DynamoDB、MongoDB和FaunaDB之類的NoSQL數據庫,也開始具備了事務性的操作能力。例如:SQL通過顯式(使用BEGIN和END TRANSACTION的語法)和隱式(使用外鍵和JOIN查詢之類的二級索引),來允許多行事務,這比傳統的鍵-值(key-value)型NoSQL要方便得多。

此外,開發人員往往喜歡通過一次性輕鬆地使用SQL,來對數據(和存儲)進行建模。而在業務需求發生變化時,他們只需修改JOIN,便可反映到查詢之中。

2.具有本地故障轉移與修復的超強彈性

在分佈式SQL數據庫中,我們使用基於分片(per-shard)的分佈式共識複製(consensus replication)等技術,來確保每個分片(而不是每個實例)在出現故障時,仍可保持高可用性。

如此,基礎架構一旦出現故障,它始終只會影響到目標數據的某個子集(也就是那些被leader分割開的碎片),而不會影響到整個集群。並且,由於剩餘的分片副本能夠在幾秒鐘之內自動地選出新的leader,因此,集群會在出現故障時表現出一定的自我修復能力。

此外,這些發生在後臺群集配置上的更改對於應用程序來說是完全透明的,它們可以照常運行,而不會出現任何中斷或是性能的驟降。

3.具有按需進行水平寫入的可擴展性

《如何在分佈式SQL數據庫中進行數據分片》一文(https://dzone.com/articles/how-data-sharding-works-in-a-distributed-sql-datab),說明了開發人員通常是如何在分佈式SQL數據庫中實現自動化數據分片的。無論有新節點的加入,還是現有節點的刪除,分片都將會在所有可用節點之間保持自動的平衡狀態。

目前,那些需要處理事務的應用程序都具有可擴展能力的微服務。它們在不需要新增基礎架構的基礎上,完全可以直接依賴於內存中的緩存(無需從數據庫中讀取請求,而保留對於寫入請求的處理)或NoSQL數據庫(雖然能夠擴展寫入操作,但是無法保證ACID)。

4.針對地域分佈式數據的低延遲性

正如《構建具有低延遲的雲原生、以及地域分佈式SQL應用的9種技術》一文(https://dzone.com/articles/9-techniques-to-build-cloud-native-geo-distributed)所強調的那樣:分佈式SQL數據庫可以提供多種技術,來構建地域分佈式的應用程序。這些技術不僅有助於對於區域性故障實現自動化容災,而且還能夠在一定程度上通過讓數據更接近來自本區域的最終用戶,以實現更低的數據延遲性。

原文標題:What Is Distributed SQL? ,作者:Sid Choudhury


分享到:


相關文章: