數據庫性能優化入門:數據庫分片初探

數據庫分片是一種用於提升數據庫性能的架構模式,選擇正確的分片策略和實施方式對於提高數據庫性能和應對大規模數據挑戰至關重要。

本文介紹了數據庫分片的定義、原理和實施方法。文章解釋了數據庫分片是如何通過將數據切分、分散存儲在多個服務器上來提升性能,並對數據庫分片與傳統數據庫的區別進行了詳細對比,探討了何時應該考慮進行數據庫分片。文章介紹了幾種常見的分片策略,包括基於鍵、基於範圍、垂直和基於目錄的分片,並分析了它們的優缺點。文章還討論了數據庫分片的實施步驟和長期解決方案,強調了 TiDB 作爲支持自動分片的分佈式 SQL 數據庫的優勢 。


數據庫分片是一種提升數據庫性能的策略,通過把數據切分成若干部分,然後將這些部分分散存儲在多個數據庫服務器上。 這些被切分的數據部分稱爲“分片”,每個分片都包含數據的一部分。 把所有分片合起來,就構成了完整的數據集,且每條數據僅存儲在一個分片中。 由於涉及更多的機器參與處理,分片能讓數據庫處理更多事務,存儲更多數據。 對於那些需要高可擴展性的大型分佈式系統,數據庫分片特別有效。

數據庫分片是一種“無共享”架構的體現,即每個分片操作獨立的數據庫服務器,不與其他分片共享任何計算資源。比如,下方左圖展示了存儲在計算機上的一個原始表:

若原始表非常大,查詢操作就會變得非常緩慢。採用分片架構可以提升查詢性能,如右圖所示,數據被分成兩部分,一部分存儲在數據庫服務器 DB1 上,另一部分則存儲在 DB2 上。通過這種方式,把數據分散存儲在多個服務器上,就實現了分片。

在設置數據庫分片時,分片策略的選擇將直接影響數據庫性能。我們將在文後詳細探討不同的分片方法。這篇文章旨在深入介紹數據庫分片的原理,並揭示這一流行架構模式的所有細節。

傳統數據庫的侷限性

傳統數據庫通常運行在單一服務器上,無論是實體服務器、虛擬機還是其他形式的節點。這些系統的一個共同點是它們的性能存在上限。這也意味着,爲了滿足快速增長的數據處理需求,你可能需要將數據庫遷移到更強大但成本更高的硬件上。一旦數據庫超出當前機器的處理能力,你就必須重複這一過程。

還有另一種既昂貴又複雜的解決方法,你可以在你的環境中添加新的數據庫硬件。但這需要某種方式智能地將數據分佈在多臺機器上,通過在多個數據庫服務器上增加一個軟件層或將這個能力添加到你的應用程序中來實現。這種做法非常普遍,業界也形成了專門的術語–數據庫分片。

數據庫分片和分區的區別是什麼?

數據庫分片與分區(partitioning https://docs.pingcap.com/zh/tidb/stable/partitioned-table ) 的主要區別在於其作用範圍和數據分割的方式。分區發生在單個數據庫服務器內部,將數據切分爲多個段,即分區,但這些分區依然處於同一數據庫系統內。這類似於在一個大倉庫內劃分不同的區域,而分片則相當於將貨物分佈到多個倉庫中。每個分區,就像分片一樣,包含數據集的一個子集,但所有分區都位於同一數據庫服務器內。這種方式有助於管理大型數據表,並在不分散負載到多個服務器的情況下提升查詢效率。

下圖與前面的圖相似。主要區別在於,原始表被分割成塊,這些塊位於單個數據庫服務器上。分片的數據位於多個數據庫服務器上。

雖然數據庫分片通過將數據分割並分佈到不同的數據庫中以實現可擴展性,分區則在單個數據庫內組織數據以實現高效管理和訪問。兩者都旨在提高數據庫性能,只是實現方式不同。

分區和分片不是非此即彼的事情,數據庫架構中二者結合的做法也是非常普遍的,在此我們不做贅述。

我何時考慮進行數據庫分片?

決定何時以及是否對數據庫進行分片,就像挑選擴展業務的恰當時機一樣——時機與必要性並重。數據庫分片並非萬能鑰匙,會引入一定的複雜性。

1 何時分片

  • 面對高流量與大數據量 :當數據庫承受數百萬用戶或 TB 級別數據的壓力開始掙扎時,分片便顯得尤爲必要。
  • 擴展性需求迫在眉睫 :業務快速成長,持續的數據與用戶增長成爲了新常態。
  • 性能遇到瓶頸 :查詢反應遲緩,數據層面的瓶頸開始顯現。

2 何時避免分片

  • 數據庫規模尚小 :未觸及存儲或處理能力的上限。
  • 簡單的工作量 :數據庫未面臨複雜查詢或高交易量的挑戰。
  • 技術資源受限 :分片需要專業的知識進行實施與管理,若團隊尚未準備好迎接這種複雜性,最好暫緩行動。

記住, 數據庫分片不是銀彈,考慮周全後再決策是否適合你的數據庫需求 

分片架構的選擇

分片策略的關鍵在於通過使用分片鍵,將數據高效分佈至不同的分片中。不同的策略各有優缺點,選擇應基於數據庫的具體需求和特性。

1 基於鍵的數據庫分片

基於鍵的分片利用特定值,如用戶 ID 或時間戳,作爲分片鍵。

如下圖所示,我們選擇了列 1 作爲分片鍵。然後,我們對數據項應用哈希函數。哈希鍵決定了我們的數據將去往哪個分片。

基於鍵的分片有利於實現均勻分佈數據。可隨着數據增長,需要重新整理已有數據,維護成本較高。

2 基於範圍的數據庫分片(水平分片)

使用基於範圍的分片方式會根據一系列值(如日期或地理位置)的範圍進行數據分片劃分。

在下圖中,我們選擇了基於 Paint Color 列進行分片, Paint Color 是一個數值。數據庫將採用此數值以及分片範圍來確定數據應該放置的位置。

這種方法根據範圍(如字母順序或日期範圍)來實現數據分片,簡單明瞭,非常適合時序數據這樣具有清晰、均勻劃分的數據類型。但如果某些範圍比其他範圍擁有更多數據(即熱點),則可能導致數據分佈不均。

3 垂直數據庫分片

垂直分片根據表列分割數據,並將列分佈在不同的分片中。這種模式用於將寬表分割成多個表,其中一個表比另一個表更窄,而這個更窄的表將包含最常查詢的數據。如果需要查詢第二個表數據的時候,你可以將第二個表與第一個表連接。

垂直分片適用於包含大量未使用列的表,通過隔離頻繁訪問的數據來提高性能。

4 基於目錄的數據庫分片

基於目錄的分片策略根據表列分割數據,並將列分佈在不同的分片中。

在下圖中,我們再回到之前使用的 Paint Color 列。在這個例子中,我們使用字典(也稱爲查找表)將數據放置在特定的分片中。

此種分片策略適用於包含大量未使用列的表數據庫,通過隔離頻繁訪問的數據來提高性能。

這種分片方法涉及使用查找目錄來跟蹤哪些數據在哪個分片上。雖然它提供了很大的靈活性並且可以很好地處理數據不均勻分佈的問題,但引入的查找目錄也帶來了單點故障的風險。同時,維護和保持目錄的一致性也是重要的考慮因素。

手動分片還是自動分片?

我們已經討論了分片策略,但還有更關鍵細節:由誰來實施分片?換句話說,你可以手動分片你的數據庫,或者你可以使用中間件層或可以有效自動分片數據的數據庫。

讓我們來看看我們可以使用哪些具體方法來實現手動分片或自動分片數據庫:

1 自動分片:使用分佈式 SQL 數據庫

分佈式 SQL 數據庫本身就支持自動分片,大大簡化了數據庫的擴展和維護。

  • 優點:內置自動分片機制、具備可擴展性和高可用性,同時減少了維護工作量。
  • 缺點:可能需要從現有系統遷移和新的操作專業知識。其實所有分片方案都會涉及環境變化和新技能的學習。使用支持自動分片的分佈式數據庫提供了可靠的長期解決方案。

2 自動分片:中間件解決方案

中間件解決方案是指使用像 ProxySQL 或 Vitess 這樣的爲 MySQL 設計的分片中間件。這些工具部署在你的應用程序和數據庫之間,透明處理分片邏輯。

  • 優點:簡化了分片過程並對應用程序透明。
  • 缺點:增加了另一個需要管理的架構層級,並增加了學習曲線,這也意味着更高的軟件、硬件和管理成本。

3 手動或自動分片:使用內置分片能力的數據庫

如 MySQL Cluster 或 MariaDB 等數據庫都包含內置分片功能,可以提供更 MySQL 原生的分片解決方案:

  • 優點:與 MySQL 生態系統的原生集成。
  • 缺點:可能比其他分佈式 SQL 數據庫的靈活性差,因爲分片能力是後來加入的。相比起來,分佈式 SQL 數據庫則是從一開始就支持自動分片。

4 手動分片:應用層分片

應用層分片策略通過修改你的應用程序邏輯,以在多個數據庫實例間分配數據。該策略讓你有更多控制權,但需要大量的開發工作。

  • 優點:對分片邏輯有高度控制。
  • 缺點:需要大量的開發和維護工作。擴展數據庫需要大量的規劃,執行通常需要停機時間。實施這種策略往往會帶來可能會在應用程序生命週期中不斷重複的數據庫諮詢項目。

數據庫分片項目步驟

數據庫分片是一項複雜的工程,往往包含以下實施步驟:

  1. 確定分片需求:評估你的數據庫以瞭解分片的需求。考慮因素如數據量、事務率和性能問題。
  2. 確定計算和存儲需求:這是此過程中最重要的步驟之一。如果你正在對一個本地數據庫進行分片,你可能需要購買硬件。如果你在雲環境中運行,你需要估計所需虛擬機和存儲的成本。當然,也別忘了軟件。你可能需要額外的許可證或產品。如果你選擇使用開源軟件(非常推薦),你可能需要增加你的支持協議。
  3. 創建測試環境:測試環境在許多情況下簡化了過程。儘管測試過程比較痛苦,但搞砸測試環境總比破壞生產系統要好。別忘了在你的規模文檔中添加測試環境。
  4. 獲取計算和存儲資源:別忘了訂購必要的軟件和硬件。
  5. 選擇分片策略:結合你的數據結構和使用模式,在前文中所介紹的分片策略中做出選擇適合你的。
  6. 選擇分片鍵:選擇合適的分片鍵鍵以確保平衡的數據分佈並最小化複雜的跨分片查詢。
  7. 實施分片邏輯:這一步可在應用層完成。在數據庫服務器之上增加一個分片層或使用支持自動分片的數據庫管理系統。
  8. 測試:在上線前徹底測試分片數據庫以確保數據完整性和性能。
  9. 監控和調整:實施分片後,持續監控分片數據庫的性能,並在必要時重新平衡分片。

對於數據庫分片的最佳長期解決方案

選擇正確的數據庫分片策略對於組織的成長至關重要。TiDB,由 PingCAP 開發的開源分佈式 SQL 數據庫,內置自動分片功能。它能爲現代應用提供彈性擴展、實時分析和持續數據訪問。使用 TiDB 進行 RDBMS 擴展以及互聯網規模 OLTP 工作負載處理的公司可從以下方面獲益:

  1. 與 MySQL 兼容 ( https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility ):兼容 MySQL 8.0,使開發者可以利用 MySQL 生態系統中的豐富工具和框架。
  2. 水平可擴展 ( https://docs.pingcap.com/zh/tidb/stable/scale-tidb-using-tiup ):完全透明地處理數據工作負載,能根據需要即時擴展或縮減,無需手動分片。
  3. 高可用性 ( https://docs.pingcap.com/zh/tidb/dev/high-availability-faq ):在系統故障或網絡問題時自動故障轉移和自我修復,確保數據持續可訪問。
  4. 強一致性:保持 ACID 事務的強一致性,即使是在全球分佈數據時也能做到。
  5. 混合工作負載能力 ( https://docs.pingcap.com/zh/tidb/stable/quick-start-with-htap ):簡化技術棧,使實時分析更加便捷,通過智能查詢優化器選取最高效的查詢執行計劃。
  6. 混合雲和多雲支持 ( https://docs.pingcap.com/tidbcloud/tidb-cloud-intro ):支持在全球任意地點的公有云、私有云和混合雲環境中部署數據庫集羣,兼容 VMs、容器或裸機部署。
  7. 開源:100%開源,遵循 Apache 2.0 許可,爲業務創新開闢道路。
  8. 安全 ( https://cn.pingcap.com/law/ ):提供企業級數據加密,無論數據在傳輸中還是靜態狀態下均受保護。

結論

在我們探討了數據庫分片的複雜性和策略後,明顯的結論是,儘管分片提供了一種強大的方法來處理大規模數據和高事務量,但它並不是一勞永逸的解決方案。特別是當考慮實施手動分片時,這一點尤爲重要。因此,在決定分片之前,仔細評估數據庫的規模、預期增長和可用的技術資源是非常必要的。

最終目標,無論是選擇分片還是採取其他策略,都是確保數據庫的可擴展性、高效性、易於維護性,並且能夠滿足應用程序當前和未來的需求。

在這方面,採用如 TiDB 這樣支持自動分片的分佈式 SQL 數據庫,提供了一個理想的解決方案。它不僅能夠應對規模的縮放挑戰,還能夠處理分片帶來的複雜性,同時在處理大量數據時保持卓越的性能。這樣的系統允許開發者專注於業務邏輯的實現,而不必過分擔憂底層數據存儲的細節,實現了技術架構的高效和靈活性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章