基礎(chǔ)普及之什么是分布式SQL
譯文【51CTO.com快譯】在過去的近40年中,SQL已經(jīng)成為了關(guān)系型數(shù)據(jù)庫(又稱為RDBMS)的通用語言。這也就是為什么關(guān)系型數(shù)據(jù)庫經(jīng)常被簡單稱為SQL數(shù)據(jù)庫的原因。從架構(gòu)而言,以O(shè)racle、PostgreSQL和MySQL為首的傳統(tǒng)SQL數(shù)據(jù)庫,是單體式(monolithic)的。也就是說,它們無法在多個實例之間自動地分配數(shù)據(jù)和查詢。而NewSQL數(shù)據(jù)庫的出現(xiàn)使得SQL具有了可擴展性和高性能。當(dāng)然,此類數(shù)據(jù)庫仍然具有與生俱來的局限性。
2015年,Docker容器和Kubernetes編排的出現(xiàn),讓我們能夠以靈活、可組合的基礎(chǔ)架構(gòu)方式,來創(chuàng)建各種基于微服務(wù)的應(yīng)用。其中,內(nèi)置的可擴容性、靈活性、以及地理分布特性,是此類云原生架構(gòu)的核心特點。這也就是人們常說的“分布式SQL”--這一新型的數(shù)據(jù)庫。在應(yīng)用方面,此類分布式SQL數(shù)據(jù)庫的一個顯著特征是:無論其中有多少個節(jié)點,整個數(shù)據(jù)庫集群對于應(yīng)用程序而言,都被其視為一個邏輯的SQL數(shù)據(jù)庫。
數(shù)據(jù)庫的架構(gòu)
分布式SQL數(shù)據(jù)庫通常具有如下三層體系結(jié)構(gòu)。
1. SQL API
顧名思義,分布式SQL數(shù)據(jù)庫仍然必須提供SQL API服務(wù),以便應(yīng)用程序可以對關(guān)系型數(shù)據(jù)進行建模,并執(zhí)行涉及到各種關(guān)系信息的查詢操作。它保留了SQL數(shù)據(jù)庫典型的數(shù)據(jù)建模結(jié)構(gòu),包括:索引、外鍵約束、JOIN查詢、以及多行ACID事務(wù)(譯者注:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability))。
2.分布式查詢執(zhí)行
由于分布式SQL的查詢能夠被自動地分配到目標(biāo)群集的多個節(jié)點上,因此,此舉有效地避免了單個節(jié)點成為查詢處理中的瓶頸問題。具體的查詢流程為:目標(biāo)群集中的任一節(jié)點都可以接受傳入的某個查詢。通過在網(wǎng)絡(luò)中的各節(jié)點之間傳輸數(shù)據(jù)、協(xié)同工作,該節(jié)點能夠以最小化處理等待時間的方式,僅分擔(dān)查詢請求中的一部分任務(wù)。而由其他節(jié)點協(xié)助完成剩余的部分。最后,該接受請求的原始節(jié)點,將匯總所有的查詢結(jié)果,并發(fā)回給客戶端應(yīng)用程序。
3.分布式數(shù)據(jù)存儲
那些包含有索引信息的數(shù)據(jù)會被自動分布(也稱為分片,sharded)到群集的多個節(jié)點處。此舉確保了單個節(jié)點都不會成為高性能和高可用性的瓶頸。此外,數(shù)據(jù)庫集群能夠支持高一致性的復(fù)制、以及多行(也稱為分布式)ACID事務(wù),進而保留了單個邏輯數(shù)據(jù)庫的基本概念。
高度一致性的復(fù)制
在數(shù)據(jù)庫的管理概念中,所謂支持強大的SQL API層,其本質(zhì)上就是要求處于底層的存儲層,能夠在跨數(shù)據(jù)庫的群集節(jié)點上建立強一致性的復(fù)制。這就意味著:對于數(shù)據(jù)庫的寫入操作,將會在多個節(jié)點上被同步提交,以保證出現(xiàn)故障時的數(shù)據(jù)可用性。而讀取操作則是基于最后一次被提交的寫入數(shù)據(jù),或是出錯之前的數(shù)據(jù)。該屬性通常被稱為線性一致性(Linearizability,http://www.bailis.org/blog/linearizability-versus-serializability/)。根據(jù)著名的CAP原則(https://towardsdatascience.com/cap-theorem-and-distributed-database-management-systems-5c2be977950e,譯者注:一致性(Consistency)、可用性(Availability)、分區(qū)容錯性(Partition tolerance)),分布式SQL數(shù)據(jù)庫具有一致性和分區(qū)容錯性。
分布式的ACID事務(wù)
為了能夠支持分布式的ACID事務(wù),分布式數(shù)據(jù)庫的存儲層需要在多個節(jié)點的多個數(shù)據(jù)行中進行事務(wù)性的協(xié)調(diào)任務(wù)。此處,它們正好用到了兩階段提交(2 Phase Commit,2PC)協(xié)議。參照ACID中I(隔離性)的要求,為了能夠?qū)Σl(fā)式的數(shù)據(jù)訪問實現(xiàn)嚴格的隔離,分布式SQL數(shù)據(jù)庫將可序列化性(Serializability,http://www.bailis.org/blog/linearizability-versus-serializability/)作為最嚴格的隔離級別,并且通過快照(Snapshot)之類的其他方式來支持較弱的隔離級別。
業(yè)務(wù)應(yīng)用的優(yōu)勢
分布式SQL的四個關(guān)鍵優(yōu)勢,如下圖所示。
1.讓SQL和事務(wù)類的開發(fā)更具敏捷性
如今,由于SQL仍然是一種輕松實現(xiàn)建模關(guān)系和多行操作的數(shù)據(jù)建模語言,因此為了滿足應(yīng)用開發(fā)人員持續(xù)對于SQL數(shù)據(jù)庫的操作習(xí)慣與需求,即便是Amazon DynamoDB、MongoDB和FaunaDB之類的NoSQL數(shù)據(jù)庫,也開始具備了事務(wù)性的操作能力。例如:SQL通過顯式(使用BEGIN和END TRANSACTION的語法)和隱式(使用外鍵和JOIN查詢之類的二級索引),來允許多行事務(wù),這比傳統(tǒng)的鍵-值(key-value)型NoSQL要方便得多。
此外,開發(fā)人員往往喜歡通過一次性輕松地使用SQL,來對數(shù)據(jù)(和存儲)進行建模。而在業(yè)務(wù)需求發(fā)生變化時,他們只需修改JOIN,便可反映到查詢之中。
2.具有本地故障轉(zhuǎn)移與修復(fù)的超強彈性
在分布式SQL數(shù)據(jù)庫中,我們使用基于分片(per-shard)的分布式共識復(fù)制(consensus replication)等技術(shù),來確保每個分片(而不是每個實例)在出現(xiàn)故障時,仍可保持高可用性。
如此,基礎(chǔ)架構(gòu)一旦出現(xiàn)故障,它始終只會影響到目標(biāo)數(shù)據(jù)的某個子集(也就是那些被leader分割開的碎片),而不會影響到整個集群。并且,由于剩余的分片副本能夠在幾秒鐘之內(nèi)自動地選出新的leader,因此,集群會在出現(xiàn)故障時表現(xiàn)出一定的自我修復(fù)能力。
此外,這些發(fā)生在后臺群集配置上的更改對于應(yīng)用程序來說是完全透明的,它們可以照常運行,而不會出現(xiàn)任何中斷或是性能的驟降。
3.具有按需進行水平寫入的可擴展性
《如何在分布式SQL數(shù)據(jù)庫中進行數(shù)據(jù)分片》一文(https://dzone.com/articles/how-data-sharding-works-in-a-distributed-sql-datab),說明了開發(fā)人員通常是如何在分布式SQL數(shù)據(jù)庫中實現(xiàn)自動化數(shù)據(jù)分片的。無論有新節(jié)點的加入,還是現(xiàn)有節(jié)點的刪除,分片都將會在所有可用節(jié)點之間保持自動的平衡狀態(tài)。
目前,那些需要處理事務(wù)的應(yīng)用程序都具有可擴展能力的微服務(wù)。它們在不需要新增基礎(chǔ)架構(gòu)的基礎(chǔ)上,完全可以直接依賴于內(nèi)存中的緩存(無需從數(shù)據(jù)庫中讀取請求,而保留對于寫入請求的處理)或NoSQL數(shù)據(jù)庫(雖然能夠擴展寫入操作,但是無法保證ACID)。
4.針對地域分布式數(shù)據(jù)的低延遲性
正如《構(gòu)建具有低延遲的云原生、以及地域分布式SQL應(yīng)用的9種技術(shù)》一文(https://dzone.com/articles/9-techniques-to-build-cloud-native-geo-distributed)所強調(diào)的那樣:分布式SQL數(shù)據(jù)庫可以提供多種技術(shù),來構(gòu)建地域分布式的應(yīng)用程序。這些技術(shù)不僅有助于對于區(qū)域性故障實現(xiàn)自動化容災(zāi),而且還能夠在一定程度上通過讓數(shù)據(jù)更接近來自本區(qū)域的最終用戶,以實現(xiàn)更低的數(shù)據(jù)延遲性。
原文標(biāo)題:What Is Distributed SQL? ,作者:Sid Choudhury
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】