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