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