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