System Design 關係型資料庫的擴充套件 - 學習筆記

weixin_33832340發表於2018-04-25

引用:
系統設計入門

主從複製

3415798-ed57f6b09e436812
主從複製

主庫同時負責讀取和寫入操作,並複製寫入到一個或多個從庫中,從庫只負責讀操作。
樹狀形式的從庫再將寫入複製到更多的從庫中去。如果主庫離線,系統可以以只讀模式執行,直到某個從庫被提升為主庫或有新的主庫出現。

缺點:

  • 將從庫提升為主庫需要額外的邏輯。

主主複製

3415798-ca7f1c738566c473
主主複製

兩個主庫都負責讀操作和寫操作,寫入操作時互相協調。如果其中一個主庫掛機,系統可以繼續讀取和寫入。

缺點:

  • 你需要新增負載均衡器或者在應用邏輯中做改動,來確定寫入哪一個資料庫。
  • 多數主-主系統要麼不能保證一致性(違反 ACID),要麼因為同步產生了寫入延遲。
  • 隨著更多寫入節點的加入和延遲的提高,如何解決衝突顯得越發重要。

主從複製和主主複製共同的問題

  • 如果主庫在將新寫入的資料複製到其他節點前掛掉,則有資料丟失的可能。
  • 副本可能因為過多寫操作阻塞住,導致讀取功能異常。
  • 讀取從庫越多,需要複製的寫入資料就越多,導致更嚴重的複製延遲。
  • 在某些資料庫系統中,寫入主庫的操作可以用多個執行緒並行寫入,但讀取副本只支援單執行緒順序地寫入。
  • 複製意味著更多的硬體和額外的複雜度。

聯合

聯合(或按功能劃分)將資料庫按對應功能分割。
例如,你可以有三個資料庫:論壇、使用者和產品,而不僅是一個單體資料庫,從而減少每個資料庫的讀取和寫入流量,減少複製延遲。
較小的資料庫意味著更多適合放入記憶體的資料,進而意味著更高的快取命中機率。沒有隻能序列寫入的中心化主庫,你可以並行寫入,提高負載能力。

缺點:

  • 如果你的資料庫模式需要大量的功能和資料表,聯合的效率並不好。
  • 你需要更新應用程式的邏輯來確定要讀取和寫入哪個資料庫。
  • 從兩個庫聯結資料更復雜。
  • 聯合需要更多的硬體和額外的複雜度。

分片

3415798-bbd63f956dc5ec85
分片

分片將資料分配在不同的資料庫上,使得每個資料庫僅管理整個資料集的一個子集。
以使用者資料庫為例,隨著使用者數量的增加,越來越多的分片會被新增到叢集中。

類似聯合的優點,分片可以減少讀取和寫入流量,減少複製並提高快取命中率。也減少了索引,通常意味著查詢更快,效能更好。如果一個分片出問題,其他的仍能執行,你可以使用某種形式的冗餘來防止資料丟失。類似聯合,沒有隻能序列寫入的中心化主庫,你可以並行寫入,提高負載能力。

常見的做法是使用者姓氏的首字母或者使用者的地理位置來分隔使用者表。

缺點:

  • 你需要修改應用程式的邏輯來實現分片,這會帶來複雜的 SQL 查詢。
  • 分片不合理可能導致資料負載不均衡。例如,被頻繁訪問的使用者資料會導致其所在分片的負載相對其他分片高。
  • 再平衡會引入額外的複雜度。基於一致性雜湊的分片演算法可以減少這種情況。
  • 聯結多個分片的資料操作更復雜。
  • 分片需要更多的硬體和額外的複雜度。

非規範化

非規範化試圖以寫入效能為代價來換取讀取效能。在多個表中冗餘資料副本,以避免高成本的聯結操作。

在多數系統中,讀取操作的頻率遠高於寫入操作,比例可達到 100:1,甚至 1000:1。需要複雜的資料庫聯結的讀取操作成本非常高,在磁碟操作上消耗了大量時間。

參見 細聊冗餘表資料一致性 學習筆記

SQL調優

參見 MySQL 效能優化學習筆記
參見 MySQL 索引學習筆記

相關文章