分片并不意味著分布式
Sharding(分片)是一種將數(shù)據(jù)和負(fù)載分布到多個獨(dú)立的數(shù)據(jù)庫實例的技術(shù)。這種方法通過將原始數(shù)據(jù)集分割為分片來利用水平可擴(kuò)展性,然后將這些分片分布到多個數(shù)據(jù)庫實例中。
1*yg3PV8O2RO4YegyiYeiItA.png
但是,盡管"分布"一詞出現(xiàn)在分片的定義中,但分片數(shù)據(jù)庫并不是分布式數(shù)據(jù)庫。
分片解決方案
每個分片解決方案在其架構(gòu)中都有一個關(guān)鍵組件。該組件可以有各種名稱,包括協(xié)調(diào)器、路由器或?qū)а荩?/p>
1*kp39_8mQ0E9bIO0Lw3PGFw.png
協(xié)調(diào)器是唯一一個知道數(shù)據(jù)分布的組件。它將客戶端請求映射到特定的分片,然后轉(zhuǎn)發(fā)到相應(yīng)的數(shù)據(jù)庫實例。這就是為什么客戶端必須始終通過協(xié)調(diào)器路由其請求的原因。
例如,如果客戶端想要將新記錄插入到Car表中,請求首先會傳遞到協(xié)調(diào)器。協(xié)調(diào)器將記錄的主鍵映射到其中一個分片,然后將請求轉(zhuǎn)發(fā)到負(fù)責(zé)該分片的數(shù)據(jù)庫實例。
1*YNUB6y8WJnp0CCVAXSjQ0g.png
在上面的示意圖中,首先,協(xié)調(diào)器將鍵121映射到分片10,然后將記錄插入到存儲在擁有分片10的數(shù)據(jù)庫實例上的表car_10中。
然而,還有一個問題:為什么在分片解決方案中需要協(xié)調(diào)器呢?答案很直接。分片存儲在設(shè)計用于單服務(wù)器部署的數(shù)據(jù)庫實例上。
這些數(shù)據(jù)庫實例不相互通信,也不支持任何能促進(jìn)這種通信的協(xié)議。它們彼此不知道,存在于各自的隔離環(huán)境中,對于它們是一個更大系統(tǒng)的一部分這一事實毫不知情。
因此,在分片解決方案中,協(xié)調(diào)器是不可或缺的。如果您有興趣更深入地了解分片數(shù)據(jù)庫架構(gòu),請考慮探索用于PostgreSQL的CitusData或Azure CosmosDB,用于MySQL的Vitess,用于Oracle的Distributed Autonomous Database以及MongoDB Sharded Cluster。
分布式數(shù)據(jù)庫
與分片數(shù)據(jù)庫解決方案類似,分布式數(shù)據(jù)庫也使用類似的分片技術(shù)在數(shù)據(jù)庫節(jié)點(diǎn)群集中分發(fā)數(shù)據(jù)和負(fù)載。但是,與分片解決方案不同,分布式數(shù)據(jù)庫不依賴于協(xié)調(diào)器組件。
分布式數(shù)據(jù)庫建立在共享無關(guān)架構(gòu)上,沒有像協(xié)調(diào)器這樣的單一組件負(fù)擔(dān)著做出許多決策:
1*deOgcXccWs9lKUSgLPNOww.png
集群中的所有節(jié)點(diǎn)都知道對方,因此也知道數(shù)據(jù)的分布。通過直接通信,每個節(jié)點(diǎn)可以將客戶端請求路由到適當(dāng)?shù)姆制姓?。此外,它們可以?zhí)行和協(xié)調(diào)多節(jié)點(diǎn)事務(wù)。當(dāng)擴(kuò)展到更多節(jié)點(diǎn)時,集群會自動重新平衡和分割分片。節(jié)點(diǎn)保持?jǐn)?shù)據(jù)的冗余副本(基于配置的復(fù)制因子),即使某些節(jié)點(diǎn)失敗,也可以繼續(xù)操作而無需停機(jī)。
所有這些對于客戶端來說是透明的,客戶端只需與任何節(jié)點(diǎn)建立連接,然后允許該節(jié)點(diǎn)管理分布式方面。
例如,客戶端可能連接到node1并插入具有id121的新的Car記錄。如果node1是記錄分片的所有者,則它將在本地存儲記錄,并使用共識算法將更改復(fù)制到其他節(jié)點(diǎn)的子集。如果不是,node1將記錄轉(zhuǎn)發(fā)到分片的所有者,可能是node4。
1*weEdq2BxIpf6GiLjipns5Q.png
如果您有興趣探索真正分布式數(shù)據(jù)庫的架構(gòu),請考慮研究Google Spanner,YugabyteDB,CockroachDB,Apache Cassandra或Apache Ignite。
在數(shù)據(jù)庫領(lǐng)域,分片和分布經(jīng)常被混為一談,但它們有著不同的目的。
雖然分片涉及將數(shù)據(jù)分割到多個獨(dú)立的實例中,但這并不意味著系統(tǒng)本質(zhì)上是分布式的。分片解決方案中協(xié)調(diào)器的存在,該協(xié)調(diào)器指導(dǎo)客戶端請求到適當(dāng)?shù)姆制?,突顯了這一區(qū)別。
另一方面,建立在共享無關(guān)架構(gòu)上的分布式數(shù)據(jù)庫缺乏這種集中式協(xié)調(diào)器。這些系統(tǒng)中的節(jié)點(diǎn)都知道對方,管理數(shù)據(jù)分布,并無縫處理客戶端請求。
這兩種架構(gòu)都有其優(yōu)點(diǎn),了解它們的細(xì)微差別對于進(jìn)行數(shù)據(jù)庫設(shè)計和選擇至關(guān)重要。