【資料圖】
在設(shè)計(jì)大規(guī)模分布式系統(tǒng)時(shí),你可能會遇到兩個(gè)概念——分片(sharding)和一致性哈希(consistent hashing)。雖然我在網(wǎng)上找到了很多關(guān)于這些術(shù)語的解釋,但它們讓我感到有些困惑。我覺得分片和一致性哈希本質(zhì)上是在討論同一件事——將數(shù)據(jù)分布在一組服務(wù)器上。
我想—這兩個(gè)概念是不是相同的,還是有所不同?如果你也有類似的困惑,讓我們簡要地來解釋一下。
分片想象一下我們有一個(gè)數(shù)據(jù)庫,其中數(shù)據(jù)以行和列的形式存儲(就像關(guān)系型數(shù)據(jù)庫,盡管分片也適用于NoSQL數(shù)據(jù)庫)。當(dāng)我們的數(shù)據(jù)集變得非常龐大時(shí)(比如1百萬條記錄),對龐大數(shù)據(jù)集進(jìn)行任何類型的操作(讀取、更新、刪除、連接等)都會變得非常緩慢。而且隨著數(shù)據(jù)量的增長,由于服務(wù)器可能具有的物理空間(HDD/SSD)的限制,將所有數(shù)據(jù)存儲在一個(gè)數(shù)據(jù)庫服務(wù)器上幾乎是不可能的。為了解決這些問題,最合理的方法是將數(shù)據(jù)集劃分為較小的數(shù)據(jù)集。
想象一下,我們將整個(gè)數(shù)據(jù)集(100萬行)劃分為10個(gè)較小的子集(每個(gè)子集有10萬行)。這個(gè)將數(shù)據(jù)集水平(或沿著行)劃分的過程被稱為對數(shù)據(jù)集進(jìn)行分片。
除了提高性能外,分片數(shù)據(jù)集的另一個(gè)非常重要的好處是將這些數(shù)據(jù)分片存儲在較小且更便宜的數(shù)據(jù)庫服務(wù)器上,而不是將整個(gè)百萬行存儲在一個(gè)龐大且非常昂貴的數(shù)據(jù)庫服務(wù)器上。
一致性哈希一致性哈希是一種將龐大的數(shù)據(jù)集(例如100萬行)分割成多個(gè)較小的數(shù)據(jù)子集(存儲在一組數(shù)據(jù)庫服務(wù)器上)的技術(shù),以確保在集群中的服務(wù)器數(shù)量發(fā)生變化(即添加或刪除服務(wù)器)時(shí),數(shù)據(jù)的遷移量最小。在大規(guī)模分布式系統(tǒng)設(shè)計(jì)中,這非常重要,因?yàn)榉?wù)器故障在數(shù)據(jù)中心中相當(dāng)常見。
對于一致性哈希,我們選擇兩個(gè)值M和N,即哈希鍵空間(根據(jù)應(yīng)用程序需求選擇的M)和數(shù)據(jù)庫服務(wù)器數(shù)量(用N表示)。通常情況下,M >> N。
算法本身是一個(gè)簡單的三步過程。創(chuàng)建一個(gè)循環(huán)數(shù)字線(從0到M-1)。 對數(shù)據(jù)庫服務(wù)器ID進(jìn)行哈希運(yùn)算,對M取模,并在循環(huán)數(shù)字線上分配一個(gè)位置。 對每個(gè)數(shù)據(jù)行進(jìn)行哈希(基于其唯一鍵),對M取模,并在循環(huán)數(shù)字線上找到其位置。順時(shí)針方向移動,直到找到第一個(gè)數(shù)據(jù)庫服務(wù)器。將這些數(shù)據(jù)存儲在該服務(wù)器上。
好了..那么它們之間有什么真正的區(qū)別嗎? 盡管分片和一致性哈??雌饋矶伎梢詫⒕薮蟮臄?shù)據(jù)集分割成較小的數(shù)據(jù)集,但它們之間存在微妙的區(qū)別。分片是所有水平數(shù)據(jù)分區(qū)方案的統(tǒng)稱。從本質(zhì)上講,分片只是將數(shù)據(jù)集沿著行進(jìn)行劃分的一個(gè)花哨的名字。
如果你覺得水平分割(或分片)數(shù)據(jù)集可能有許多不同的方式,那么你是對的。在許多不同的分片數(shù)據(jù)集的方式/算法中,一致性哈希是最高效的算法之一。所以,這是一個(gè)相當(dāng)簡單但微妙的區(qū)別。分片是一個(gè)通用術(shù)語,而一致性哈希是一種特定類型的算法,用于實(shí)現(xiàn)數(shù)據(jù)分片。
標(biāo)簽: