據(jù)分片(Sharding)概念介紹)
分片概述雖然現(xiàn)代數(shù)據(jù)庫(kù)理論上可以支持非常大的數(shù)據(jù)量(TB級(jí)、PB級(jí))但在實(shí)際應(yīng)用中達(dá)到這些理論極限之前往往就會(huì)遇到性能瓶頸、備份與恢復(fù)時(shí)間過(guò)長(zhǎng)等問(wèn)題。這也是為什么在數(shù)據(jù)量達(dá)到一定規(guī)模時(shí)很多系統(tǒng)會(huì)采取數(shù)據(jù)庫(kù)分片(Sharding)來(lái)優(yōu)化存儲(chǔ)和性能的原因。分片是一種提高數(shù)據(jù)庫(kù)擴(kuò)展性的方法用于將一個(gè)數(shù)據(jù)集分成兩個(gè)或多個(gè)較小的塊(chunk)稱(chēng)為邏輯分片logical shards。然后邏輯分片logical shards分布在單獨(dú)的數(shù)據(jù)庫(kù)節(jié)點(diǎn)上稱(chēng)為物理分片physical shards。物理分片physical shards可以容納一到多個(gè)邏輯分片logical shards。分片允許將較大的數(shù)據(jù)集拆分成較小的塊并存儲(chǔ)在多個(gè)數(shù)據(jù)節(jié)點(diǎn)中從而增加系統(tǒng)的總存儲(chǔ)容量、吞吐量等能力。這些被切分的數(shù)據(jù)稱(chēng)為分片每個(gè)分片都包含數(shù)據(jù)的一部分。把所有分片合起來(lái)就構(gòu)成了完整的數(shù)據(jù)集且每條數(shù)據(jù)僅存儲(chǔ)在一個(gè)分片中。由于涉及更多的機(jī)器參與處理分片能讓數(shù)據(jù)庫(kù)處理更多事務(wù)存儲(chǔ)更多數(shù)據(jù)。對(duì)于那些需要高可擴(kuò)展性的大型分布式系統(tǒng)數(shù)據(jù)庫(kù)分片特別有效。根據(jù)分片的方向可以將數(shù)據(jù)分片進(jìn)一步劃分為垂直分片vertical sharding和水平分片horizontal sharding兩種。垂直分片是指將一個(gè)大表按照列即數(shù)據(jù)的屬性進(jìn)行分割將相關(guān)性較高或者經(jīng)常一起使用的列劃分到不同的表也稱(chēng)為分片中。每個(gè)分片包含原表的一部分列不同分片可以存儲(chǔ)在不同的數(shù)據(jù)庫(kù)服務(wù)器上。這種分片方式基于數(shù)據(jù)的不同屬性或功能進(jìn)行劃分。水平分片則是根據(jù)行即數(shù)據(jù)的記錄來(lái)分割數(shù)據(jù)將表中的數(shù)據(jù)按某種邏輯如用戶(hù)ID的范圍、時(shí)間戳等劃分到不同的分片中每個(gè)分片包含所有列但只保存一部分行記錄。這樣不同的分片可以分布在不同的數(shù)據(jù)庫(kù)服務(wù)器上實(shí)現(xiàn)數(shù)據(jù)的分布式存儲(chǔ)。垂直分片是一種scale-up實(shí)現(xiàn)水平分片是一種scale-out實(shí)現(xiàn)。注意垂直分片和水平分片不是完全隔離的兩種分片技術(shù)在業(yè)務(wù)服務(wù)中可以同時(shí)使用垂直分片和水平分片。對(duì)于一個(gè)行數(shù)較多的大表來(lái)說(shuō)可以分別對(duì)其進(jìn)行垂直分片和水平分片以提高服務(wù)的處理能力。除了根據(jù)分片的方向?qū)Ψ制M(jìn)行分類(lèi)還可根據(jù)分片技術(shù)作用的技術(shù)層次將其進(jìn)行技術(shù)分類(lèi)由于業(yè)務(wù)服務(wù)對(duì)這種分類(lèi)的感知必要性不高這里不再介紹有興趣的同學(xué)可以參考一文讀懂?dāng)?shù)據(jù)分片技術(shù)差異這篇文章。分片是一種擴(kuò)展形式稱(chēng)為水平擴(kuò)展或橫向擴(kuò)展因?yàn)闀?huì)引入更多節(jié)點(diǎn)來(lái)分擔(dān)負(fù)載。水平擴(kuò)展可實(shí)現(xiàn)近乎無(wú)限的可擴(kuò)展性以處理大數(shù)據(jù)和高強(qiáng)度工作負(fù)載。相比之下垂直擴(kuò)展是指通過(guò)更強(qiáng)大的 CPU、更大的 RAM 或更大的存儲(chǔ)容量來(lái)提高單臺(tái)機(jī)器或單臺(tái)服務(wù)器的性能。對(duì)于垂直分片主流數(shù)據(jù)庫(kù)均未提供邏輯垂直分片能力均是物理垂直分片能力而物理垂直分片能力就是新增表的能力。所以后續(xù)如無(wú)特殊說(shuō)明介紹的分片均指水平分片。分片的優(yōu)缺點(diǎn)在使用分片前應(yīng)充分評(píng)估其優(yōu)缺點(diǎn)對(duì)業(yè)務(wù)服務(wù)的影響只有在明確其使用價(jià)值大于其帶來(lái)的問(wèn)題后才考慮使用該技術(shù)。接下來(lái)將分別介紹下分片的優(yōu)點(diǎn)和缺點(diǎn)。分片的優(yōu)點(diǎn)提升系統(tǒng)可擴(kuò)展性隨著業(yè)務(wù)的發(fā)展對(duì)數(shù)據(jù)庫(kù)的吞吐量可能會(huì)急劇增長(zhǎng)。分片可以通過(guò)增加更多的數(shù)據(jù)庫(kù)服務(wù)器來(lái)水平擴(kuò)展系統(tǒng)的處理能力。通過(guò)添加額外的分片來(lái)適應(yīng)業(yè)務(wù)增長(zhǎng)確保系統(tǒng)性能保持穩(wěn)定從而更容易應(yīng)對(duì)高并發(fā)場(chǎng)景。提高性能隨著數(shù)據(jù)量的增加單一數(shù)據(jù)庫(kù)的查詢(xún)、寫(xiě)入速度會(huì)逐漸下降。通過(guò)分片技術(shù)可以將數(shù)據(jù)分散到多個(gè)數(shù)據(jù)庫(kù)或表中減少單個(gè)數(shù)據(jù)庫(kù)的負(fù)擔(dān)從而提高系統(tǒng)的整體性能。提高可用性由于數(shù)據(jù)是分布式的即使部分?jǐn)?shù)據(jù)庫(kù)發(fā)生故障其他數(shù)據(jù)庫(kù)仍能繼續(xù)提供服務(wù)保證了系統(tǒng)的可用性。這對(duì)于很多需要7x24小時(shí)不間斷服務(wù)的業(yè)務(wù)至關(guān)重要。分片的缺點(diǎn)盡管分片能夠有效解決大數(shù)據(jù)量和高并發(fā)帶來(lái)的問(wèn)題但它也會(huì)帶來(lái)系統(tǒng)復(fù)雜度上升的問(wèn)題引入了一些新的挑戰(zhàn)和潛在問(wèn)題主要包括復(fù)雜性分片為數(shù)據(jù)庫(kù)架構(gòu)帶來(lái)了復(fù)雜性。它需要仔細(xì)規(guī)劃、監(jiān)控和維護(hù)。選擇正確的分片策略、分片鍵等技術(shù)細(xì)節(jié)可能具有挑戰(zhàn)性。此外管理大量分片可能變得很麻煩。分片創(chuàng)建、刪除和重新平衡需要仔細(xì)協(xié)調(diào)和自動(dòng)化。數(shù)據(jù)分布不均如果分片策略設(shè)計(jì)不當(dāng)可能導(dǎo)致數(shù)據(jù)在不同庫(kù)或表之間的分布不均勻(數(shù)據(jù)傾斜)某些庫(kù)或表負(fù)載過(guò)高而其他則資源閑置影響整體性能。數(shù)據(jù)一致性問(wèn)題在分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性是一個(gè)挑戰(zhàn)尤其是在涉及跨分片的操作時(shí)。需要采用分布式事務(wù)、最終一致性的策略或使用分布式鎖等機(jī)制來(lái)確保數(shù)據(jù)的一致性并且可能會(huì)影響性能。跨分片操作問(wèn)題盡管數(shù)據(jù)進(jìn)行了分片但對(duì)外部來(lái)說(shuō)還是一個(gè)邏輯的整體。對(duì)于需要跨分片的操作如何在業(yè)務(wù)請(qǐng)求拆分到各個(gè)分片然后再處理完后又將各個(gè)分片的結(jié)果統(tǒng)一是一個(gè)難點(diǎn)。如某些查詢(xún)可能跨越多個(gè)分片需要協(xié)調(diào)機(jī)制來(lái)檢索、合并和連貫地呈現(xiàn)數(shù)據(jù)從而影響性能。分片實(shí)現(xiàn)策略常見(jiàn)的分片策略有以下幾種哈希分片○ 原理通過(guò)計(jì)算分片鍵的哈希值并根據(jù)哈希值的范圍或取模運(yùn)算結(jié)果來(lái)決定數(shù)據(jù)存放在哪個(gè)分片上。這種方法可以非常均勻地分布數(shù)據(jù)適用于不需要保持?jǐn)?shù)據(jù)順序的場(chǎng)景。○ 優(yōu)點(diǎn)數(shù)據(jù)分布均勻擴(kuò)展性好容易實(shí)現(xiàn)。○ 缺點(diǎn)不適合范圍查詢(xún)且分片鍵的選擇對(duì)性能影響大。范圍分片○ 原理根據(jù)分片鍵的值范圍來(lái)決定數(shù)據(jù)的存儲(chǔ)位置。如按時(shí)間戳將數(shù)據(jù)分配到不同的表或庫(kù)中。○ 優(yōu)點(diǎn)支持范圍查詢(xún)和排序操作直觀易理解。○ 缺點(diǎn)數(shù)據(jù)分布可能不均勻擴(kuò)展時(shí)可能需要重新分配數(shù)據(jù)。列表分片也稱(chēng)為指定位分片○ 原理預(yù)先定義一系列的分片鍵值每個(gè)值對(duì)應(yīng)一個(gè)分片。數(shù)據(jù)根據(jù)分片鍵值直接映射到對(duì)應(yīng)的分片。○ 優(yōu)點(diǎn)簡(jiǎn)單直觀適用于分片鍵取值范圍有限且已知的場(chǎng)景。○ 缺點(diǎn)擴(kuò)展性和靈活性較差分片鍵值的增減可能需要重新調(diào)整分片。一致性哈希○ 原理一種特殊的哈希算法可以解決普通哈希分片在節(jié)點(diǎn)增刪時(shí)重分布數(shù)據(jù)的問(wèn)題。數(shù)據(jù)通過(guò)哈希環(huán)映射到不同的節(jié)點(diǎn)增加或減少節(jié)點(diǎn)只影響相鄰節(jié)點(diǎn)的數(shù)據(jù)。○ 優(yōu)點(diǎn)在節(jié)點(diǎn)變化時(shí)能最小化數(shù)據(jù)遷移適用于動(dòng)態(tài)擴(kuò)展的場(chǎng)景。○ 缺點(diǎn)實(shí)現(xiàn)相對(duì)復(fù)雜且在極端情況下仍可能存在數(shù)據(jù)分布不均。分片策略有很多這里僅列舉幾種比較常見(jiàn)的分片策略。選擇合適的分片策略需要根據(jù)業(yè)務(wù)的具體需求、查詢(xún)模式、數(shù)據(jù)增長(zhǎng)預(yù)期以及系統(tǒng)的擴(kuò)展目標(biāo)來(lái)決定。在實(shí)際應(yīng)用中可能還會(huì)結(jié)合中間件等技術(shù)來(lái)進(jìn)一步優(yōu)化分片管理、查詢(xún)路由和數(shù)據(jù)一致性等問(wèn)題。分片(Sharding)和分區(qū)(Partitioning)的對(duì)比分片Sharding和分區(qū)Partitioning都是數(shù)據(jù)庫(kù)和分布式系統(tǒng)中用于數(shù)據(jù)分布和管理的策略。它們都旨在通過(guò)將數(shù)據(jù)分割成更小的、更易于管理的部分來(lái)提高性能、可擴(kuò)展性和可用性。分片用于將一個(gè)數(shù)據(jù)集合切分成多個(gè)分片。然后分片分布在單獨(dú)的數(shù)據(jù)庫(kù)節(jié)點(diǎn)上。每個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)可以容納一到多個(gè)分片。分片允許將較大的數(shù)據(jù)集拆分成較小的塊并存儲(chǔ)在多個(gè)數(shù)據(jù)節(jié)點(diǎn)中從而增加系統(tǒng)的總存儲(chǔ)容量、吞吐量等能力。分區(qū)用于將一個(gè)數(shù)據(jù)集合切分成多個(gè)分區(qū)。分區(qū)會(huì)將數(shù)據(jù)庫(kù)中的表劃分為多個(gè)部分每個(gè)部分稱(chēng)為分區(qū)。每個(gè)分區(qū)存儲(chǔ)表中的一部分行數(shù)據(jù)并獨(dú)立存儲(chǔ)。通過(guò)將表分割為多個(gè)分區(qū)從而提高查詢(xún)性能。分片與分區(qū)的主要區(qū)別在于其作用范圍和數(shù)據(jù)分割的方式。分區(qū)發(fā)生在單個(gè)數(shù)據(jù)庫(kù)服務(wù)器內(nèi)部將數(shù)據(jù)切分為多個(gè)段即分區(qū)但這些分區(qū)依然處于同一數(shù)據(jù)庫(kù)系統(tǒng)內(nèi)。這類(lèi)似于在一個(gè)大倉(cāng)庫(kù)內(nèi)劃分不同的區(qū)域而分片則相當(dāng)于將貨物分布到多個(gè)倉(cāng)庫(kù)中。每個(gè)分區(qū)就像分片一樣包含數(shù)據(jù)集的一個(gè)子集但所有分區(qū)都位于同一數(shù)據(jù)庫(kù)服務(wù)器內(nèi)。這種方式有助于管理大型數(shù)據(jù)表并在不分散負(fù)載到多個(gè)服務(wù)器的情況下提升查詢(xún)效率。上圖中分區(qū)會(huì)將原始表分割成塊然后這些塊位于單個(gè)數(shù)據(jù)庫(kù)服務(wù)器上。而分片的數(shù)據(jù)在切分后位于多個(gè)數(shù)據(jù)庫(kù)服務(wù)器上。接下來(lái)簡(jiǎn)單對(duì)比下分片和分區(qū)(1) 數(shù)據(jù)分布位置分區(qū)通常在單個(gè)數(shù)據(jù)庫(kù)實(shí)例內(nèi)部進(jìn)行而分片可能跨越多個(gè)數(shù)據(jù)庫(kù)實(shí)例或服務(wù)器。(2) 分片的管理分區(qū)通常由數(shù)據(jù)庫(kù)管理系統(tǒng)自動(dòng)管理而分片可能需要額外的中間件或服務(wù)來(lái)管理數(shù)據(jù)的分布和路由。(3) 復(fù)雜性分片可能比分區(qū)更復(fù)雜因?yàn)樗婕暗娇缍鄠€(gè)節(jié)點(diǎn)的數(shù)據(jù)管理和一致性問(wèn)題。從上面的對(duì)比可知分區(qū)適用于單個(gè)數(shù)據(jù)庫(kù)實(shí)例內(nèi)的數(shù)據(jù)組織而分片適用于跨多個(gè)節(jié)點(diǎn)的大規(guī)模分布式系統(tǒng)。在實(shí)際應(yīng)用中分區(qū)和分片可以結(jié)合使用以滿(mǎn)足不同的性能、可擴(kuò)展性和可用性需求。例如一個(gè)分布式數(shù)據(jù)庫(kù)可能在每個(gè)分片內(nèi)部使用分區(qū)來(lái)進(jìn)一步優(yōu)化數(shù)據(jù)的存儲(chǔ)和訪問(wèn)。分片時(shí)機(jī)與任何分布式架構(gòu)一樣數(shù)據(jù)庫(kù)分片并非免費(fèi)提供。設(shè)置分片、維護(hù)每個(gè)分片上的數(shù)據(jù)以及正確路由這些分片之間的請(qǐng)求會(huì)產(chǎn)生開(kāi)銷(xiāo)和復(fù)雜性。在開(kāi)始分片之前請(qǐng)考慮以下替代解決方案是否可以解決問(wèn)題(0) 什么也不做在沒(méi)有任何明顯瓶頸或限制因素例如用盡可以支持工作負(fù)載的硬件的情況下分片不是一個(gè)好主意。不建議對(duì)一個(gè)數(shù)據(jù)量和訪問(wèn)量都不高的業(yè)務(wù)服務(wù)提供分片能力。(1) 升級(jí)機(jī)器只需升級(jí)機(jī)器就可解決業(yè)務(wù)瓶頸而無(wú)需分片的復(fù)雜性。添加 RAM、升級(jí)機(jī)器的CPU或增加數(shù)據(jù)庫(kù)可用的存儲(chǔ)空間都是簡(jiǎn)單的解決方案不需要您更改數(shù)據(jù)庫(kù)架構(gòu)或應(yīng)用程序的設(shè)計(jì)。(2) 專(zhuān)業(yè)服務(wù)或數(shù)據(jù)庫(kù)根據(jù)業(yè)務(wù)需求將一部分負(fù)擔(dān)轉(zhuǎn)移到其他提供商甚至單獨(dú)的數(shù)據(jù)庫(kù)上可能更有意義。例如可以將 blob 或文件存儲(chǔ)直接移動(dòng)到云提供商如 Amazon S3。分析或全文搜索可以由專(zhuān)業(yè)服務(wù)或數(shù)據(jù)倉(cāng)庫(kù)處理。卸載此特定功能比嘗試分片整個(gè)數(shù)據(jù)庫(kù)更有意義。(3) 使用緩存如果業(yè)務(wù)服務(wù)的讀取性能存在瓶頸那么緩存是一種有助于改善性能的策略。緩存涉及將已請(qǐng)求的數(shù)據(jù)臨時(shí)存儲(chǔ)在內(nèi)存中以便后續(xù)的請(qǐng)求可以更快地訪問(wèn)它。(4) 提供副本如果業(yè)務(wù)數(shù)據(jù)工作負(fù)載主要以讀取為重點(diǎn)則使用副本可提高可用性和讀取性能同時(shí)避免數(shù)據(jù)庫(kù)分片的一些復(fù)雜性。只需啟動(dòng)數(shù)據(jù)庫(kù)的額外副本就可以通過(guò)負(fù)載平衡或地理定位查詢(xún)路由來(lái)提高讀取性能。但是部分會(huì)給以寫(xiě)入為中心的工作負(fù)載帶來(lái)復(fù)雜性因?yàn)楸仨殞⒚總€(gè)寫(xiě)入復(fù)制到每個(gè)復(fù)制節(jié)點(diǎn)。如果以上替代解決方案均未能解決問(wèn)題則有必要考慮分片。數(shù)據(jù)分片不是銀彈只有在必要時(shí)才應(yīng)考慮分片。同時(shí)已使用分片的應(yīng)用程序具有以下主要特征(1) 應(yīng)用程序數(shù)據(jù)量增長(zhǎng)到超過(guò)單個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)的存儲(chǔ)容量。當(dāng)數(shù)據(jù)庫(kù)承受數(shù)百萬(wàn)用戶(hù)或 TB 級(jí)別數(shù)據(jù)的壓力開(kāi)始掙扎時(shí)分片便顯得尤為必要。(2) 對(duì)數(shù)據(jù)庫(kù)的寫(xiě)入或讀取量超出了單個(gè)節(jié)點(diǎn)或其讀取副本可以處理的范圍(如數(shù)據(jù)庫(kù)連接達(dá)到了上限且成為了讀寫(xiě)的瓶頸)導(dǎo)致響應(yīng)時(shí)間變慢或超時(shí)。(3) 應(yīng)用程序所需的網(wǎng)絡(luò)帶寬超過(guò)了單個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)和任何讀取副本可用的帶寬導(dǎo)致響應(yīng)時(shí)間變慢或超時(shí)。(4) 擴(kuò)展性需求迫在眉睫業(yè)務(wù)快速增長(zhǎng)持續(xù)的數(shù)據(jù)與用戶(hù)增長(zhǎng)成為了新常態(tài)。如發(fā)布的某一款應(yīng)用成為了爆款。參考https://juejin.cn/post/7315117029983207461 Scaling Your Database: A Comprehensive Guide to Sharding and Partitioninghttps://www.mongodb.com/resources/products/capabilities/database-sharding-explained Database Sharding: Concepts and Exampleshttps://cn.pingcap.com/blog/database-sharding/ 數(shù)據(jù)庫(kù)性能優(yōu)化入門(mén)數(shù)據(jù)庫(kù)分片初探https://cloud.tencent.com/developer/article/1902755 一文讀懂?dāng)?shù)據(jù)分片技術(shù)差異https://www.amazonaws.cn/knowledge/database-sharding/ 什么是數(shù)據(jù)分片?https://www.mongodb.com/resources/products/capabilities/database-sharding-explained Database Sharding: Concepts and Exampleshttps://learn.microsoft.com/en-us/azure/architecture/patterns/sharding Sharding patternhttps://developer.aliyun.com/article/1596741 分區(qū)和分片https://hazelcast.com/glossary/sharding/ What is Shardinghttps://architecturenotes.co/p/database-sharding-explained Database Sharding Explainedhttps://www.digitalocean.com/community/tutorials/understanding-database-sharding Understanding Database Shardinghttps://www.cnblogs.com/qcloud1001/p/10405281.html 數(shù)據(jù)庫(kù)分片Database Sharding)詳解