自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分布式數(shù)據(jù)庫(kù):數(shù)據(jù)分片,如何存儲(chǔ)超大規(guī)模的數(shù)據(jù)?

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
今天先是詳細(xì)介紹了分片的原理,以及多種常用的分片技術(shù);而后分析了手動(dòng)分片與自動(dòng)分片的區(qū)別,要知道數(shù)據(jù)分片的未來(lái)是屬于自動(dòng)分片的。

隨著互聯(lián)網(wǎng)時(shí)代,特別是移動(dòng)互聯(lián)網(wǎng)的到來(lái),形形色色的企業(yè)都在將自己的系統(tǒng)平臺(tái)快速升級(jí)迭代,以此作為向互聯(lián)網(wǎng)轉(zhuǎn)型的一部分。

在此背景下,這類應(yīng)用平臺(tái)所依賴的數(shù)據(jù)庫(kù)系統(tǒng)就需要支持突然增加的巨量交易數(shù)據(jù),但是在這種情況下單體的數(shù)據(jù)庫(kù)往往會(huì)很快過(guò)載,而用于擴(kuò)展數(shù)據(jù)庫(kù)最常見的技術(shù)手段就是“數(shù)據(jù)分片”。

因此今天我將為你介紹什么是分片,以及如何將其用于擴(kuò)展數(shù)據(jù)庫(kù)。同時(shí),我還會(huì)回顧常見分片架構(gòu)的優(yōu)缺點(diǎn),以使用 TiDB 為例,和你探討如何在分布式數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分片。

數(shù)據(jù)分片概論

分片是將大數(shù)據(jù)表分解為較小的表(稱為分片)的過(guò)程,這些分片分布在多個(gè)數(shù)據(jù)庫(kù)集群節(jié)點(diǎn)上。分片本質(zhì)上可以被看作傳統(tǒng)數(shù)據(jù)庫(kù)中的分區(qū)表,是一種水平擴(kuò)展手段。每個(gè)分片上包含原有總數(shù)據(jù)集的一個(gè)子集,從而可以將總負(fù)載分散在各個(gè)分區(qū)之上。

數(shù)據(jù)分片的方式一般有兩種。

  1. 水平分片:在不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn)中存儲(chǔ)同一表的不同行。
  2. 垂直分片:在不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn)中存儲(chǔ)表不同的表列。

如下圖所示,水平和垂直這兩個(gè)概念來(lái)自原關(guān)系型數(shù)據(jù)庫(kù)表模式的可視化直觀視圖。

圖 1 可視化直觀視圖

分片理念其實(shí)來(lái)源于經(jīng)濟(jì)學(xué)的邊際收益理論:如果投資持續(xù)增加,但收益的增幅開始下降時(shí),被稱為邊際收益遞減狀態(tài)。而剛好要開始下降的那個(gè)點(diǎn)被稱為邊際平衡點(diǎn)。

該理論應(yīng)用在數(shù)據(jù)庫(kù)計(jì)算能力上往往被表述為:如果數(shù)據(jù)庫(kù)處理能力遇到瓶頸,最簡(jiǎn)單的方式是持續(xù)提高系統(tǒng)性能,如更換更強(qiáng)勁的 CPU、更大內(nèi)存等,這種模式被稱為垂直擴(kuò)展。當(dāng)持續(xù)增加資源以提升數(shù)據(jù)庫(kù)能力時(shí),垂直擴(kuò)展有其自身的限制,最終達(dá)到邊際平衡,收益開始遞減。

而此時(shí),對(duì)表進(jìn)行水平分片意味著可以引入更多的計(jì)算能力處理數(shù)據(jù)與交易。從而,將邊際遞減扭轉(zhuǎn)為邊際遞增狀態(tài)。同時(shí),通過(guò)持續(xù)地平衡所有節(jié)點(diǎn)上的處理負(fù)載和數(shù)據(jù)量,分片模式還可以獲得 1+1>2 的效果,即集群平均處理能力大于單節(jié)點(diǎn)處理能力。

這樣就使得規(guī)模較小、價(jià)格便宜的服務(wù)器組成的水平擴(kuò)展集群,可能比維護(hù)一臺(tái)大型商用數(shù)據(jù)庫(kù)服務(wù)器更具成本效益。這也是第一講中“去 IOE 運(yùn)動(dòng)”的核心技術(shù)背景。

除了解決擴(kuò)展難題,分片還可以緩解計(jì)劃外停機(jī),大大降低系統(tǒng) RTO(目標(biāo)恢復(fù)時(shí)間)。即使在計(jì)劃內(nèi)的停機(jī)期,如果沒(méi)有分片的加持,數(shù)據(jù)庫(kù)整體上還是處于不可訪問(wèn)狀態(tài)的,這就無(wú)法滿足業(yè)務(wù)上對(duì) SLO(目標(biāo)服務(wù)級(jí)別)的要求。

如果分片可以如我們所希望的那樣正常工作,它就可以確保系統(tǒng)的高可用。即使數(shù)據(jù)庫(kù)集群部分節(jié)點(diǎn)發(fā)生故障,只要其他節(jié)點(diǎn)在其中運(yùn)行,數(shù)據(jù)庫(kù)整體仍可對(duì)外提供服務(wù)。當(dāng)然,這還需要復(fù)制與一致性服務(wù)的保證,我們會(huì)在之后課時(shí)中進(jìn)一步探討。

總而言之,分片可以增加數(shù)據(jù)庫(kù)集群的總?cè)萘坎⒓涌焯幚硭俣?,同時(shí)可以使用比垂直擴(kuò)展更低的成本提供更高的可用性。

分片算法

分片算法一般指代水平分片所需要的算法。經(jīng)過(guò)多年的演化,其已經(jīng)在大型系統(tǒng)中得到了廣泛的實(shí)踐。下面我將介紹兩種最常見的水平分片算法,并簡(jiǎn)要介紹一些其他的分片算法優(yōu)化思路。

哈希分片

哈希分片,首先需要獲取分片鍵,然后根據(jù)特定的哈希算法計(jì)算它的哈希值,最后使用哈希值確定數(shù)據(jù)應(yīng)被放置在哪個(gè)分片中。數(shù)據(jù)庫(kù)一般對(duì)所有數(shù)據(jù)使用統(tǒng)一的哈希算法(例如 ketama),以促成哈希函數(shù)在服務(wù)器之間均勻地分配數(shù)據(jù),從而降低了數(shù)據(jù)不均衡所帶來(lái)的熱點(diǎn)風(fēng)險(xiǎn)。通過(guò)這種方法,數(shù)據(jù)不太可能放在同一分片上,從而使數(shù)據(jù)被隨機(jī)分散開。

這種算法非常適合隨機(jī)讀寫的場(chǎng)景,能夠很好地分散系統(tǒng)負(fù)載,但弊端是不利于范圍掃描查詢操作。下圖是這一算法的工作原理。

范圍分片

范圍分片根據(jù)數(shù)據(jù)值或鍵空間的范圍對(duì)數(shù)據(jù)進(jìn)行劃分,相鄰的分片鍵更有可能落入相同的分片上。每行數(shù)據(jù)不像哈希分片那樣需要進(jìn)行轉(zhuǎn)換,實(shí)際上它們只是簡(jiǎn)單地被分類到不同的分片上。下圖是范圍分片的工作原理。

范圍分片需要選擇合適的分片鍵,這些分片鍵需要盡量不包含重復(fù)數(shù)值,也就是其候選數(shù)值盡可能地離散。同時(shí)數(shù)據(jù)不要單調(diào)遞增或遞減,否則,數(shù)據(jù)不能很好地在集群中離散,從而造成熱點(diǎn)。

范圍分片非常適合進(jìn)行范圍查找,但是其隨機(jī)讀寫性能偏弱。

融合算法

這時(shí)我們應(yīng)該意識(shí)到,以上介紹的哈希和范圍的分片算法并不是非此即彼,二選一的。相反,我們可以靈活地組合它們。

例如,我們可以建立一個(gè)多級(jí)分片策略,該策略在最上層使用哈希算法,而在每個(gè)基于哈希的分片單元中,數(shù)據(jù)將按順序存儲(chǔ)。

這個(gè)算法相對(duì)比較簡(jiǎn)單且靈活,下面我們?cè)僬f(shuō)一個(gè)地理位置算法。

地理位置算法

該算法一般用于 NewSQL 數(shù)據(jù)庫(kù),提供全球范圍內(nèi)分布數(shù)據(jù)的能力。

在基于地理位置的分片算法中,數(shù)據(jù)被映射到特定的分片,而這些分片又被映射到特定區(qū)域以及這些區(qū)域中的節(jié)點(diǎn)。

然后在給定區(qū)域內(nèi),使用哈希或范圍分片對(duì)數(shù)據(jù)進(jìn)行分片。例如,在美國(guó)、中國(guó)和日本的 3 個(gè)區(qū)域中運(yùn)行的集群可以依靠 User 表的 Country_Code 列,將特定用戶(User)所在的數(shù)據(jù)行映射到符合位置就近規(guī)則的區(qū)域中。

那么以上就是幾種典型的分片算法,下面我們接著討論如何將分片算法應(yīng)用到實(shí)際的場(chǎng)景中。

手動(dòng)分片 vs 自動(dòng)分片

手動(dòng)分片,顧名思義,就是設(shè)置靜態(tài)規(guī)則來(lái)將數(shù)據(jù)根據(jù)分片算法分散到數(shù)據(jù)庫(kù)節(jié)點(diǎn)。這一般是由于用戶使用的數(shù)據(jù)庫(kù)不支持自動(dòng)的分片,如 MySQL、Oracle 等。這個(gè)問(wèn)題可以在應(yīng)用層面上做數(shù)據(jù)分片來(lái)解決,也可以使用簡(jiǎn)單的數(shù)據(jù)庫(kù)中間件或 Proxy 來(lái)設(shè)置靜態(tài)的分片規(guī)則來(lái)解決。

手動(dòng)分片的缺點(diǎn)是數(shù)據(jù)分布不均勻。數(shù)據(jù)分布不均可能導(dǎo)致數(shù)據(jù)庫(kù)負(fù)載極其不平衡,從而使其中一些節(jié)點(diǎn)過(guò)載,而另一些節(jié)點(diǎn)訪問(wèn)量較少。

因此,最好避免在部分節(jié)點(diǎn)上存儲(chǔ)過(guò)多數(shù)據(jù),否則會(huì)造成這些節(jié)點(diǎn)成為訪問(wèn)熱點(diǎn),進(jìn)而導(dǎo)致其運(yùn)行速度降低,甚至使服務(wù)器崩潰。此外,當(dāng)整體數(shù)據(jù)集過(guò)小時(shí),也會(huì)導(dǎo)致這個(gè)問(wèn)題,因?yàn)榧褐兄挥胁糠止?jié)點(diǎn)才有數(shù)據(jù)。

這在開發(fā)和測(cè)試環(huán)境中是可以接受的,但在生產(chǎn)環(huán)境中是不可以接受的。因?yàn)閿?shù)據(jù)分布不均,熱點(diǎn)以及將數(shù)據(jù)存儲(chǔ)在太少的分片上,都會(huì)導(dǎo)致數(shù)據(jù)庫(kù)集群內(nèi)的節(jié)點(diǎn)計(jì)算資源耗盡,造成系統(tǒng)不穩(wěn)定。

但如果精心設(shè)計(jì),且數(shù)據(jù)分布變化不大,采用手動(dòng)分片也是一個(gè)較為簡(jiǎn)單、維護(hù)成本低廉的方案。

而使用自動(dòng)分片意味著計(jì)算節(jié)點(diǎn)與分片算法可以相互配合,從而使數(shù)據(jù)庫(kù)進(jìn)行彈性伸縮。

使用基于范圍的分片很容易實(shí)現(xiàn)自動(dòng)分片:只需拆分或合并每個(gè)分片。

假設(shè)現(xiàn)在有一個(gè)范圍為 [1,100)的分片,我們想要將它分裂為兩個(gè)范圍,先選擇 50 作為切分點(diǎn);然后將該區(qū)域分為 [1,50)和 [50,100)之后,將兩個(gè)區(qū)域移動(dòng)到兩臺(tái)不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn)中,從而使系統(tǒng)負(fù)載達(dá)到平衡。

基于范圍的分片可能會(huì)帶來(lái)讀取和寫入熱點(diǎn),我們可以通過(guò)拆分和移動(dòng)分片消除這些熱點(diǎn)。

而使用基于哈希的分片的系統(tǒng)實(shí)現(xiàn)自動(dòng)分片代價(jià)很高昂。我們現(xiàn)在使用上面圖 1 中的例子來(lái)說(shuō)明。

當(dāng)前系統(tǒng)有 4 個(gè)節(jié)點(diǎn),然后添加一個(gè)新的數(shù)據(jù)庫(kù)節(jié)點(diǎn)。在哈希函數(shù)中,“ n”從 4 更改為 5,這會(huì)導(dǎo)致較大的系統(tǒng)抖動(dòng)。盡管你可以使用像 Ketama 這樣的一致性哈希算法來(lái)盡可能減少系統(tǒng)抖動(dòng),但數(shù)據(jù)遷移與再平衡操作還是必須要有的。

這是因?yàn)樵趹?yīng)用哈希函數(shù)后,數(shù)據(jù)是隨機(jī)分布的,并且調(diào)整散列算法肯定會(huì)更改大多數(shù)數(shù)據(jù)的分布情況。

自動(dòng)分片是分布式數(shù)據(jù)庫(kù)的主流功能,所有主要的分布式數(shù)據(jù)庫(kù),甚至數(shù)據(jù)庫(kù)中間件都在嘗試自動(dòng)分片。下面我將結(jié)合幾個(gè)案例來(lái)說(shuō)明。

分片算法案例

數(shù)據(jù)分片是數(shù)據(jù)庫(kù)中間件的核心功能,且該領(lǐng)域開源項(xiàng)目較多。我這里以 Apache ShardingShpere 的分片內(nèi)容為例,向你介紹分片算法的相關(guān)實(shí)踐案例。

分片鍵生成

ShardingShpere 首先提供了分布式的主鍵生成,這是生成分片鍵的關(guān)鍵。由于分布式數(shù)據(jù)庫(kù)內(nèi)一般由多個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)參與,因此基于數(shù)據(jù)庫(kù)實(shí)例的主鍵生成并不適合分布式場(chǎng)景。

常用的算法有 UUID 和 Snowfalke 兩種無(wú)狀態(tài)生成算法。

UUID 是最簡(jiǎn)單的方式,但是生成效率不高,且數(shù)據(jù)離散度一般。因此目前生產(chǎn)環(huán)境中會(huì)采用后一種算法。下圖就是用該算法生成的分片鍵的結(jié)構(gòu)。

圖 4 分片鍵結(jié)構(gòu)

其中有效部分有三個(gè)。

  1. 時(shí)間戳:算法類似 UNIX 時(shí)間的表示形式,它是從一個(gè)特定時(shí)間開始到當(dāng)前時(shí)間點(diǎn)之間的毫秒數(shù),本案例中該算法可以使用近 70 年。
  2. 工作節(jié)點(diǎn) ID:保證每個(gè)獨(dú)立工作的數(shù)據(jù)庫(kù)節(jié)點(diǎn)不會(huì)產(chǎn)生重復(fù)的數(shù)據(jù)。
  3. 訪問(wèn)序列:在同一個(gè)進(jìn)程、同一個(gè)毫秒內(nèi),保證產(chǎn)生的 ID 不重復(fù)。

靈活的分片算法

為了保證分片計(jì)算的靈活性,ShardingShpere 提供了標(biāo)準(zhǔn)分片算法和一些工具,幫助用戶實(shí)現(xiàn)個(gè)性化算法。

  1. PreciseShardingAlgorithm 配合哈希函數(shù)使用,可以實(shí)現(xiàn)哈希分片。RangeShardingAlogrithm 可以實(shí)現(xiàn)范圍分片。
  2. 使用 ComplexShardingStrategy 可以使用多個(gè)分片鍵來(lái)實(shí)現(xiàn)融合分片算法。
  3. 有的時(shí)候,數(shù)據(jù)表的分片模式不是完全一致。對(duì)于一些特別的分片模式,可以使用 HintShardingStrategy 在運(yùn)行態(tài)制定特殊的路由規(guī)則,而不必使用統(tǒng)一的分片配置。
  4. 如果用戶希望實(shí)現(xiàn)諸如地理位置算法等特殊的分片算法,可以自定義分片策略。使用 inline 表達(dá)式或 Java 代碼進(jìn)行編寫,前者基于配置不需要編譯,適合簡(jiǎn)單的個(gè)性化分片計(jì)算;后者可以實(shí)現(xiàn)更加復(fù)雜的計(jì)算,但需要編譯打包的過(guò)程。

用戶通過(guò)以上多種分片工具,可以靈活和統(tǒng)一地制定數(shù)據(jù)庫(kù)分片策略。

自動(dòng)分片

ShardingShpere 提供了 Sharding-Scale 來(lái)支持?jǐn)?shù)據(jù)庫(kù)節(jié)點(diǎn)彈性伸縮,該功能就是其對(duì)自動(dòng)分片的支持。下圖是自動(dòng)分片功能展示圖,可以看到經(jīng)過(guò) Sharding-Scale 的特性伸縮,原有的兩個(gè)數(shù)據(jù)庫(kù)擴(kuò)充為三個(gè)。

圖 5 自動(dòng)分片功能展示

自動(dòng)分片包含下圖所示的四個(gè)過(guò)程。

圖 6 自動(dòng)分片過(guò)程

從圖 6 中可以看到,通過(guò)該工作量,ShardingShpere 可以支持復(fù)雜的基于哈希的自動(dòng)分片。同時(shí)我們也應(yīng)該看到,沒(méi)有專業(yè)和自動(dòng)化的彈性擴(kuò)縮容工具,想要實(shí)現(xiàn)自動(dòng)化分片是非常困難的。

以上就是分片算法的實(shí)際案例,使用的是經(jīng)典的水平分片模式。而目前水平和垂直分片有進(jìn)一步合并的趨勢(shì),下面要介紹的 TiDB 正代表著這種融合趨勢(shì)。

垂直與水平分片融合案例

TiDB 就是一個(gè)垂直與水平分片融合的典型案例,同時(shí)該方案也是 HATP 融合方案。

其中水平擴(kuò)展依賴于底層的 TiKV,如下圖所示。

圖 7 TiKV

TiKV 使用范圍分片的模式,數(shù)據(jù)被分配到 Region 組里面。一個(gè)分組保持三個(gè)副本,這保證了高可用性(相關(guān)內(nèi)容會(huì)在“05 | 一致性與 CAP 模型:為什么需要分布式一致性?”中詳細(xì)介紹)。當(dāng) Region 變大后,會(huì)被拆分,新分裂的 Region 也會(huì)產(chǎn)生多個(gè)副本。

TiDB 的水平擴(kuò)展依賴于 TiFlash,如下圖所示。

圖 8 TiFlash

從圖 8 中可以看到 TiFlash 是 TiKV 的列擴(kuò)展插件,數(shù)據(jù)異步從 TiKV 里面復(fù)制到 TiFlash,而后進(jìn)行列轉(zhuǎn)換,其中要使用 MVCC 技術(shù)來(lái)保證數(shù)據(jù)的一致性。

上文所述的 Region 會(huì)增加一個(gè)新的異步副本,而后該副本進(jìn)行了數(shù)據(jù)切分,并以列模式組合到 TiFlash 中,從而達(dá)到了水平和垂直擴(kuò)展在同一個(gè)數(shù)據(jù)庫(kù)的融合。這是兩種數(shù)據(jù)庫(kù)引擎的融合。

以上的融合為 TiDB 帶來(lái)的益處主要體現(xiàn)在查詢層面,特別對(duì)特定列做聚合查詢的效率很高。TiDB 可以很智能地切換以上兩種分片引擎,從而達(dá)到最優(yōu)的查詢效率。

總結(jié)

今天先是詳細(xì)介紹了分片的原理,以及多種常用的分片技術(shù);而后分析了手動(dòng)分片與自動(dòng)分片的區(qū)別,要知道數(shù)據(jù)分片的未來(lái)是屬于自動(dòng)分片的。

最后,我通過(guò)兩個(gè)著名的開源項(xiàng)目介紹了分片技術(shù)是如何應(yīng)用到分布式數(shù)據(jù)庫(kù)中的。其中 TiDB 所展示的 HATP 融合兩個(gè)分片模式的技術(shù)路線,可以被看作是未來(lái)分片模式發(fā)展的趨勢(shì)。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2023-09-11 11:22:22

分布式數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)

2020-07-23 14:03:09

數(shù)據(jù)中心數(shù)據(jù)網(wǎng)絡(luò)

2023-12-05 07:30:40

KlustronBa數(shù)據(jù)庫(kù)

2021-12-20 15:44:28

ShardingSph分布式數(shù)據(jù)庫(kù)開源

2023-11-14 08:24:59

性能Scylla系統(tǒng)架構(gòu)

2023-07-28 07:56:45

分布式數(shù)據(jù)庫(kù)SQL

2023-07-31 08:27:55

分布式數(shù)據(jù)庫(kù)架構(gòu)

2023-08-22 13:16:00

分布式數(shù)據(jù)庫(kù)架構(gòu)數(shù)據(jù)存儲(chǔ)

2022-12-08 08:13:11

分布式數(shù)據(jù)庫(kù)CAP

2022-12-30 14:14:51

數(shù)據(jù)中心服務(wù)器

2021-03-16 10:28:41

數(shù)據(jù)中心IT云計(jì)算

2024-03-11 08:57:02

國(guó)產(chǎn)數(shù)據(jù)庫(kù)證券

2020-12-11 19:52:06

數(shù)據(jù)中心超大規(guī)模數(shù)據(jù)中心

2023-02-14 11:24:36

2020-06-23 09:35:13

分布式數(shù)據(jù)庫(kù)網(wǎng)絡(luò)

2023-03-07 09:49:04

分布式數(shù)據(jù)庫(kù)

2024-09-09 09:19:57

2022-08-01 18:33:45

關(guān)系型數(shù)據(jù)庫(kù)大數(shù)據(jù)

2022-03-10 06:36:59

分布式數(shù)據(jù)庫(kù)排序

2011-05-19 09:18:48

分布式數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)