(InterviewBit) System Design - Storage Scalability

清單

  • 前言
  • 預備知識
  • CAP理論

前言

在做任何系統設計前,一定要自我先釐清整個系統會使用到的儲存空間會多大,可以透過不同的Use Case去思考,可能的使用量,當整個Storage都出來後再開始設計,系統會更加穩固,整個系統設計也會更貼切使用者的需求。

預備知識

  • 關聯式資料庫
    • 正規化
    • 實踐方法
  • 基本NoSQL概念
  • Concurrency知識
    • 多執行序開發
    • 死結
  • Neworking
    • TCP/IP
    • UDP
  • File Systmes
    • OS基礎
    • File System 如何運作
    • Database 如何運作
    • OS如何控制Cache

常用詞彙

  • Replication
    • 複製品
    • 其實也就是冗於,冗於通常用於災害發生時當作備案
  • Consistency
    • 一致性
    • 當分佈式系統時,你要怎樣確保使用者用到的檔案/資料是一致的
  • Eventual consistency
    • 最終一致性
    • 資料可以暫時的不同,但在使用者可以接受的時間內會達到一致
    • 也代表說在當下可以暫時的不一致,但長時間內需正確
      • 例如(座位餘額/即時時刻表)
  • Availability
    • 可使用性
    • 服務是不是可以7*24提供服務
  • Partition Tolerance
    • 部分容忍
    • 多節點有災難時(通訊失敗/Crash)但是還是可以正常運行
  • Vertical scaling and Horizontal scaling
    • Vertical scaling
      • 垂直擴增
      • 替機器增加資源(記憶體/硬碟/CPU)
    • Horizontal scaling
      • 增加Server的數量
  • Sharding
    • 分片管理
    • 將龐大的資訊切分成小部分,讓他可以更有效率

CAP理論

  • Consistency
  • Availability
  • Partition Tolerance

詳細的CAP範例可以參考我的另一篇翻譯文章
系統設計 - 基礎概念 CAP (Consistency, Availability, Partition Tolerance)

系統設計的五個步驟

  • 釐清需求
  • 估算資料量大小,該如何處理
    • 如何Sharding
    • 如何Caching
  • 找出關鍵瓶頸點
    • 找到此系統使用者最在乎的地方
    • 分析瓶頸點造成的影響
    • 範例
      • facebook最常使用的功能可能就是讚
      • 如何處理這樣大量的讚回饋
  • 粗略設計框架
  • 仔細分析框架細節

額外資源

Master & Slave

Database讀寫分離

  • Master提供資料的寫入
  • Slave提供資料的讀取
  • Master的資料會以幾乎即時的時間寫入到Slave中

為何要讀寫分離?

  • 當使用流量上升時寫和讀都會消耗CPU的運算速度,而大部分系統讀取的需求都會大於寫入,這時如果將資料庫分為讀取的資料庫和寫入的資料庫,那寫入再也不需要和讀取爭取資源。
  • 方便擴增 - 若是流量像是沒有天際的上升,那切分為讀取的資料庫就可以很簡單的擴增,只要將Master(寫入資料庫一起同步到新的擴增Slave(讀取資料庫))就好

為何讀寫分離會讓搜尋資料更快?

  • 因為將讀操作和寫操作分離,CPU可以將資源全力作其中一項事情

  • 記憶體

    • 讀資料庫可以不須在將讀操作時需要的index載入到記憶體中,進而讓讀操作可以全盤使用記憶體
  • 硬碟

    • 資料庫寫入硬碟時,必須將硬碟的head重新拉到可寫的目標中,在找尋可寫入的目標地址時需要耗號head移動的時間(物理移動)
    • 而寫入則只需要移到資料位子並且讀取就好
    • 若是資料庫讀寫分離的話,讀資料庫(Slave)則可以避免要寫入時,硬碟的磁頭移動需要消耗的時間,(因為磁頭不須再高頻的處理寫入時head的移動,只有在批量同步時才需要)。
  • 去除龐大

    • 資料庫讀寫分離後,你的資料庫不需要像以前依樣那麼龐大,讀寫分離可以帶出新的技術與概念(分庫分表),常使用的資料可以使用高等一點的Sever。而當機和Crash時,在也不需要等待龐大的資料庫重啟,甚至可以因為分庫分表,想出系統的分布可容錯措施。

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)