iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

今天要來介紹DB有可能發生錯誤的地方以及狀況。

讀取爭用(Read Contention)

當多個client端或process同時嘗試從資料庫的同一位置讀取資料,可能會導致延遲或錯誤。

解決方案

  • 讀寫分離:通過設置主從資料庫,將讀操作分配給從資料庫,減少主資料庫的負載。
  • 緩存機制:使用緩存(如 Redis、Memcached)來存儲經常讀取的資料,減少對資料庫的直接讀取。
  • 提升併發控制:優化鎖的機制,避免不必要的鎖定讀取操作。

寫入爭用(Write Contention)

當多個client端或process同時嘗試向資料庫的同一位置寫入資料,可能會導致延遲或錯誤。

解決方案

  • 事務鎖定優化:確保事務的鎖定範圍最小化,減少鎖的持有時間。
  • 分區表:將資料表按某些條件分區,將寫入操作分散到不同的表或資料庫中。
  • 寫入合併:將多個寫入操作合併為一個批量操作,減少衝突。

驚群問題(Thundering Herd)

大量client端或process同時嘗試訪問同一資源,可能導致資源耗盡和性能下降。

解決方案

  • 限流:實施限流機制,控制同時訪問的client端數量。
  • 退避策略:使用退避機制(如指數退避),讓client端在失敗時自動延遲重試,減少對資源的瞬時壓力。
  • 分散請求:通過使用不同的資源副本或緩存來分散請求同一個server的壓力。

連鎖反應(Cascade)

資料庫系統的一部分發生故障時,引發連鎖反應,導致系統其他部分的故障。

解決方案

  • 隔離故障:使用容錯設計,確保一部分故障不會傳播到整個系統,例如使用隔離機制或熔斷器。
  • 冗餘設計:通過冗餘和備份來提高系統的容錯能力,防止單點故障擴展。
  • 監控與自動恢復:設置系統監控,並啟用自動恢復機制,及時處理故障。

死鎖(Deadlock)

兩個或多個事務互相等待對方釋放資源鎖,導致系統陷入僵局。

解決方案

  • 死鎖檢測與恢復:使用死鎖檢測機制,自動檢測並中止其中一個事務以打破僵局。
  • 鎖順序規則:確保所有事務按照固定的順序請求鎖,以減少死鎖的可能性。
  • 最小化鎖持有時間:優化事務設計,減少鎖的持有時間,降低死鎖風險。

資料損壞(Corruption)

資料庫中的資料受到損壞,可能導致讀取或寫入時出現錯誤或意外結果。

解決方案

  • 資料完整性檢查:定期執行資料完整性檢查,及時發現和修復損壞的資料。
  • 強制一致性機制:使用強一致性的資料庫引擎,確保資料寫入過程的完整性。
  • 備份與恢復策略:定期備份資料庫,以便在資料損壞時能夠迅速恢復。

阻斷服務攻擊(DoS attack)

惡意行為者試圖通過大量請求來淹沒資料庫,可能導致資源耗盡和性能下降。

解決方案

  • 防火牆與過濾:使用防火牆和過濾機制來識別和阻止來自惡意來源的流量。
  • 速率限制:實施速率限制策略,控制單個客戶端的請求速率,防止過載。
  • CDN與負載均衡:利用內容分發網絡(CDN)和負載均衡器分散流量,減少對單一資料庫的壓力。

總結

今天我們看了7種Failure Modes以及描述了可能的解決方式,讓我們對資料庫更進一步的瞭解了XD

reference

https://roadmap.sh/backend


上一篇
Day 21 Database Normalization
下一篇
Day 23 CAP Theorem
系列文
Backend Developer的學習Roadmap30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言