Prepare System Design

  1. 詢問需求和規格 - 先確定這個系統需要提供哪些功能。
  2. 了解限制條件 - 問問面試官系統需要處理多少流量(traffic)、多少數據,延遲(latency)重要與否,優先選擇可用性還是一致性(CAP), AC選一個)。
  3. 計算所需資源 - 確定需要多少機器和儲存空間。
  4. 抽象設計 - 首先畫出系統的整體架構圖,確保每個組件都被包含在內,再根據面試官的需求深入討論某個具體的組件。
  5. 擴展性(Scale)設計 - 確保你的系統具有容錯能力(fault tolerance),能夠擴展到大型公司的系統架構。

CAP 可用性、一致性、分區容錯性, 詳細可看 http://ksat.me/a-plain-english-introduction-to-cap-theorem

Design Cache

soucre from 系統設計 - Design cache

Step 1, 2: 問requirement

  • 多少資料需要進cache? 30TB
  • expected QPS? 10M
  • eviction strategy? LRU
  • Access pattern? Write back(有空的話Write through, write around, write back都要知道什麼意思 利弊)
  • Latency重要嗎? cache的用途就是降低latency
  • C or A: A

Step 3:算一下你需要多大的machine多少台

Latency Numbers Every Programmer Should Know 這裡面的數字要有點sense

Latency Comparison Numbers (~2012)
----------------------------------
L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy             3,000   ns        3 us
Send 1K bytes over 1 Gbps network       10,000   ns       10 us
Read 4K randomly from SSD*             150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us
Round trip within same datacenter      500,000   ns      500 us
Read 1 MB sequentially from SSD*     1,000,000   ns    1,000 us    1 ms  ~1GB/sec SSD, 4X memory
Disk seek                           10,000,000   ns   10,000 us   10 ms  20x datacenter roundtrip
Read 1 MB sequentially from disk    20,000,000   ns   20,000 us   20 ms  80x memory, 20X SSD
Send packet CA->Netherlands->CA    150,000,000   ns  150,000 us  150 ms

Notes
-----
1 ns = 10^-9 seconds
1 us = 10^-6 seconds = 1,000 ns
1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns

Credit
------
By Jeff Dean:               http://research.google.com/people/jeff/
Originally by Peter Norvig: http://norvig.com/21-days.html#answers

Contributions
-------------
'Humanized' comparison:  https://gist.github.com/hellerbarde/2843375
Visual comparison chart: http://i.imgur.com/k0t1e.png

假設我們現在要用 72GB RAM 4 core的 machine. 那總共以儲存data來說需要 30TB/72GB = 420台 這樣的話每台的QPS = 10M/420 = 23000, 即使所有core都用了, 每個core要處理6000QPS (23000/4=5750), 代表說 1/6000 = 167 us . 167 us per queries 搭配上面那個比較可知道即使是ram sequentially read 1MB要250 us 所以我們如果用這個size的machine 會無法負荷 Read 1 MB sequentially from memory 250,000 ns 250 us

改變主意 假設現在用16GB RAM 4core的machine 30TB/16GB = 1875台, QPS per CPU = 10M/1875/4 = 1400QPS = 700us per queries. 這個數字負擔小多了

先用data constrain算出要幾台機器, 再用traffic constrain算看看這樣的配置合不合理, 這樣做完你就知道你的system是需要猛的機器少台一點還是差一點的機器多台一點

Step4: 畫出大架構

這時候就必須推薦CS75 (Summer 2012) Lecture 9 Scalability Harvard Web Development David Malan , 後面架構圖的部份一定要看, 這個影片很長, 但是很值得看, 有很多很實用的東西

別人整理好的影片中點 : https://ninefu.github.io/blog/Harvard_CS75_Notes/

Step5: 喇賽時間

這時候system畫完了, 如果要scale的話需要什麼東西

  • load balance
  • DB就是可能要master-slave或是multi-master這種東西

至於怎麼fault tolerance呢

  • 常見的處理就是replication, 就是一樣的資料存很多地方
    • 假設有P個 replication 因為每次寫和讀都寫進/讀出這P個地方非常花時間, 那該怎麼辦呢? 假設寫的時候, 只要有W個replication confirm update我就return to user
    • 假設讀的時候, 只要有R個replication給我一個一樣的value, 我就return這個value給user depends on design的use case(這就是為什麼use case很重要)
    • 你要看read跟write哪一個operation可以承受高一些的latency
  • 如果要求read很快 write可以慢一點沒關係, 那就可以設R = 1, W = P, 反之可以設R = P, W = 1 總之 只要R+W > N 那這database就是strong consistent!

如果真的要求高速度的話就必須犧牲consistent, 那 R+W 就會 <P (weak consistent)

R = 1, W = P 和 R = P, W = 1 是在談論分佈式系統中的一致性模型, R 表示讀取操作 W 表示寫入操作 P 表示副本數量

在第一種模型中,即 R = 1, W = P,它假設讀取操作的一致性要求不高,可以從任意一個副本中讀取最新的資料。因此,只需要讀取一個副本,但寫入操作需要寫入所有的副本,以確保資料的一致性。

在第二種模型中,即 R = P, W = 1,則假設寫入操作的一致性要求不高,只需要將資料寫入任意一個副本。而讀取操作需要從所有副本中讀取資料,以確保讀取到最新的資料。

無論是哪種模型,只要讀取操作和寫入操作的總數量(R+W)超過副本的數量(N),這個分佈式系統就可以實現強一致性。換句話說,只要系統確保了所有的讀取和寫入都能夠經過足夠數量的副本,就可以保證強一致性。這些模型的選擇取決於對於讀取和寫入操作一致性要求的不同,以及系統的性能和成本考慮。

下禮拜要面system design的話

從小公司到上億用戶公司的架構演進

InterviewBit這是個非常好的互動式網站 他是一步一步漸進式的問你每個你在面試中該問的問題,帶你走過一遍system design interview的process 非常建議這裡面的八題都要寫過

Scalable Web Architecture and Distributed Systems

下個月要面的話

checkcheckzz/system-design-interview#introcheckcheckzz/system-design-interview#blog的文章都K過你就比大多數candidate強很多了

總結

其實有工作經驗的都知道 你很常需要去design一個新的project 而釐清use case這些事情是基本 連use case都沒問那面試官根本不會覺得你是個好的工程師 主要考察的是communication and problem solving, 給你一個開放性問題 你怎麼分析step by step, 你如何跟別人討論你的idea, 如何optimize你的system 往這個方向想就覺得其實system design其實沒想像中的難

Reference

© Kimi Tsai all right reserved.            Updated : 2023-07-12 09:04:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""