瞭解資料庫分片的入門知識

瞭解資料庫分片的入門知識

建立一個網站是在網際網路上建立你的存在的第一步。為了長期發展,你還必須確保你的網站能夠擴充套件以適應增長。而第一步就是實施一個能與你一起擴充套件的資料庫。否則,你有可能遇到查詢效能緩慢和資料庫中斷的風險。

這篇文章將討論如何使用資料庫分片來實現資料的高擴充套件性和可用性。我們還將談到分片的缺點和你可以使用的不同分片架構。

  1. 什麼是資料庫分片?
  2. 資料庫分片的好處
  3. 分片的缺點
  4. 分片架構

什麼是資料庫分片?

分片是一種優化技術,將表分佈在其他資料庫伺服器上。它和分割槽一樣,都涉及到將資料分割成更小的子集。不同的是,分片將這些子集分佈在不同的伺服器上,而分割槽將它們儲存在一個資料庫中。這些伺服器使用相同的資料庫引擎和硬體型別,以實現所有分片的類似效能水平。

分片的目的是完成一個無共享的架構,消除處理瓶頸和單點故障。

database-sharding-example

分片的一個例子 (圖片來源:Analytics Vidhya)

你可以通過兩種方式實現分片–橫向和縱向。橫向分片是根據行來劃分表,而縱向分片是根據列來劃分表。

在這方面,分片就像分割槽一樣,將大表分成小表。

水平分片對於大多數查詢返回行的子集的資料庫是有效的,比如客戶資料庫,它一次就能返回資料(如姓名、地址、電子郵件等)。

垂直分片對那些查詢返回單列的資料庫來說是有效的。例如,如果客戶資料庫分別返回客戶的姓名或電子郵件,你可以把姓名和電子郵件分成不同的群組。

資料庫分片的優勢

以下是資料庫分片的一些優勢。

改進水平擴充套件

你可以垂直或水平地擴充套件你的資料庫。垂直擴充套件是指在伺服器上增加更多的中央處理單元(CPU)和隨機存取記憶體(RAM),以提高效能。對於中小型資料庫來說,垂直擴充套件是一個有用的解決方案。然而,隨著你的資料增長,垂直擴充套件變得不可行了。你能新增到一臺伺服器上的能量是有限的。

橫向擴充套件是更靈活的。它使你能夠通過在系統中新增更多的伺服器,根據需要擴充套件你的資料庫。這些伺服器中的每一個都為不同的資料庫分片提供資源。這分配了工作負荷,提高了系統處理更多請求的能力。

更快的查詢響應時間

分片只有幾行和幾列。正因為如此,處理資料庫查詢所需的時間更短。相比之下,對非分片資料庫的查詢可能需要通過數百–甚至數千–行的搜尋。

在故障情況下增加可靠性

資料庫中斷有各種原因,包括意外的資料刪除、連線錯誤和網路安全攻擊。分片可以將故障的影響降到最低。由於每個分片是自主的,只有受影響的分片才會面臨停機。例如,如果你有四個分片,其中一個出現故障,只有25%的操作會受到影響。

分片的弊端

雖然分片可以提高資料庫的可靠性和可用性,但實施起來很複雜。使用錯誤的分片架構會降低效能並導致資料丟失。

請確保選擇一種分片技術,允許在所有分片上平衡地分配資料。如果沒有這種平衡,你就會有創造資料庫熱點的風險,當一個分片儲存大部分資料而其他分片幾乎保持空閒時,就會出現這種情況。這就減少了對單個分片的寫入吞吐量。

為了解決這個問題,你可以將不平衡的分片進一步分割槽,但這個過程很有挑戰性,而且在遷移資料時可能會使你的資料庫癱瘓。

分片的另一個缺點是,涉及不同分片中的多個表的SQL連線會變得太慢,並降低效能。然而,有了正確的架構,你可以避免這個問題。

分片架構

你可以使用三種架構實現分片。

  • 基於金鑰的分片
  • 基於範圍的分片
  • 基於目錄的分片

你選擇的架構取決於你的使用情況。

基於金鑰的分片

在基於金鑰或雜湊的分片架構中,資料庫應用程式使用分片金鑰來定位一個分片。雜湊函式對分片的金鑰值進行雜湊,輸出將資料對映到一個特定的分片。一個簡單的雜湊函式可以是金鑰的模數和分片的數量。

雜湊函式可以採取一個以上的分片金鑰。正因為如此,基於金鑰的分片適用於可能有共享金鑰的資料記錄。通過演算法分配資料,可以最大限度地減少建立資料庫熱點的可能性,即一個分片包含的資料比另一個多。

然而,由於分佈只依賴於雜湊函式,不可能在邏輯上將資料分組。因此,需要從多個分片中獲取資料的資料庫操作可能效率很低,因為它們需要從每個分片中讀取資料。

基於範圍的分片

基於範圍的分片涉及根據指定的數值範圍來分片資料庫。

它使用一個分片鍵來確定將一個值分配給哪個分片。資料庫應用程式在查詢表中檢查與分片鍵相對應的分片,並儲存資料。正因為如此,基於範圍的分片很容易設計和實現。

例如,你可以使用使用者資料庫中的使用者ID值作為分片鍵。你可以在一個分片上儲存ID為0-2,000的使用者,在另一個分片上儲存ID為2,000到4,000的使用者,以此類推。

基於範圍的分片會導致資料庫熱點。考慮一個使用者資料庫,其中大多數使用者的ID位於2,001和4,000之間。這個過程將它們分配到一個分片上,隨著時間的推移,會產生不平衡的現象。因此,基於範圍的分片對均勻分佈的資料來說效果最好。

基於目錄的分片

基於目錄的分片將邏輯上相關的資料歸入同一分片。它使用一個查詢表,其中包含資料庫中每個實體的對映列表。每個對映對應於一個資料庫分片。

基於目錄的分片比基於範圍或基於鍵的分片更靈活,因為你可以動態地將資料新增到分片中。沒有分片功能需要遵循,也沒有範圍值需要保持。這種靈活性提高了資料庫的效率。你可以在一個分片中儲存相關的資料,這意味著執行普通查詢需要更少的時間。

例如,如果你使用基於目錄的分片,並根據使用者的位置進行分組,從一個特定的地方檢索使用者,你只需要查詢一個分片。

小結

資料庫分片是一種擴充套件技術,它將表分割成更小的子集,並將其分配到不同的伺服器上,稱為分片。你可以通過各種方式實現分片,如基於金鑰的分片、基於範圍的分片和基於目錄的分片。

雖然分片提高了資料庫的可擴充套件性、可靠性和可用性,但它的實現非常複雜。此外,一旦你建立了一個分片,要把資料庫恢復到未分片的狀態並不容易。正因為如此,只有當你確定其他可擴充套件性選項不起作用時,才使用分片進行優化。

評論留言