架構設計(八):數據庫的水平擴展和垂直擴展

架構設計(八):數據庫的水平擴展和垂直擴展

作者:Grey

原文地址:

博客園:架構設計(八):數據庫的水平擴展和垂直擴展

CSDN:架構設計(八):數據庫的水平擴展和垂直擴展

數據庫的擴展有兩種方法:垂直擴展和水平擴展。

垂直擴展是通過提高現有機器的硬件配置(CPU、硬盤、內存等)來進行擴展。比如,如果使用的是亞馬遜的 RDS ,可以得到一個超大內存的數據庫服務器,所以在一臺數據庫服務器,就可以實現存儲和處理大量的數據。但是垂直擴展也有一些嚴重的缺點。

  • 雖然可以在數據庫服務器上增加更多的 CPU、內存等,但是有硬件的限制,如果用戶數量巨大,一臺服務器是不夠的。

  • 單點故障的風險更大。

  • 垂直擴展的總體成本很高。如果要配置一個強大的服務器,費用是很高的。

垂直擴展的示例圖如下

img

橫向擴展,就是將大型數據庫分離成更小、更容易管理的部分,橫向擴展也被稱爲分片,是增加更多服務器來承載更高的訪問需求,每個分片共享相同的模式,儘管每個分片上的實際數據對分片來說是獨一無二的。

橫向擴展的示例圖如下

img

以用戶ID的例子來說,用戶數據是根據用戶ID分配到數據庫服務器的。任何時候你訪問數據,都會使用一個哈希函數來尋找相應的分片,比如,可以使用取模方式來定位具體的服務器分片,利用用戶ID % 4 以後的結果定位到具體的服務器。如果結果等於0,分片區0就被用來存儲和獲取該用戶ID數據。如果結果等於1,則使用分片1。這個邏輯也適用於其他分片。

img

實施分片策略時要考慮的最重要因素是分片鍵的選擇。分片鍵(稱爲分區鍵)由一列或多列組成,決定數據的分配方式。上例中,用戶ID就是分片鍵。分片鍵允許你通過將數據庫查詢路由到正確的數據庫來有效地檢索和修改數據。在選擇分片密鑰時,最重要的標準之一是選擇一個能夠均勻分佈數據的密鑰。分片是擴展數據庫的技術,但它同時也不是完美的,它爲系統引入了複雜性。分片會遇到如下幾個問題

問題1,重分數據

  1. 由於數據的快速增長,單個分片不能再容納更多的數據時,就需要重分數據。

  2. 由於數據分佈不均,某些分片可能比其他分片更快地經歷分片耗盡。當分片耗盡發生時,需要更新分片功能並移動數據。可以利用一致性哈希來解決這個問題

問題2:熱點密鑰問題

即對一個特定分片的過度訪問可能會導致服務器過載。爲了解決這個問題,我們可能需要爲每個熱點密鑰分配一個分片。每個分片甚至可能需要進一步劃分。

問題3:分片的連接問題

一旦一個數據庫在多個服務器上被分片,就很難在數據庫分片間進行連接操作。一個常見的解決方法是對數據庫進行去規範化,這樣就可以在一個表中進行查詢,將數據庫分片,以支持快速增長的數據流量。同時,也可以把系統中的非關係型的功能被轉移 NoSQL 數據存儲,以減少數據庫的負載。

參考資料

System Design Interview

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