# 分散式系統學習筆記 Distributed Systems 是把一台電腦可以做完的事情分到很多台電腦上。 但不管 Application 要完成什麼,都只包含兩件事: 1. 資料儲存 storage 2. 運算 computation Distributed system 就是把這兩個問題從一台電腦上,「分散」到多台電腦上而已。 --- ## 目標: Scalability 只用一台電腦要做擴展的話,直覺就是把資源往上加,但這樣成本會太高。 使用多台電腦就可以用較低的成本換取相近的效能,不過會增加一些麻煩,這就是 Distributed System 要討論的東西。 ### 三個 Scalability 的方向 1. Size Scalability:增加系統的 Node 時,系統跑的速度應該要線性提昇;資料變多時讀取速度不會因此而變得過慢 2. Geographic Scalability:服務橫跨的區域變大,在美國使用和在台灣使用都不會因此變得很慢 3. Administrative Scalability:不會因為增加了幾顆 node,就增加過多的管理成本。 ### 兩個評估角度: Performance & Availability - Performance: Response Speed, High throughput, Less Resource - Availability (Fault Tolerance): 讓使用者以為我們的服務一直是 alive 的 ``` Availability = uptime / (uptime + downtime) ``` {{:learn:1_2qwmgaxpo0uqhfly084g-a.png?nolink|}} ## Scalability 的困難之處 1. Node 增加時會產生 overhead 2. Node 之間的距離 --- ## 面對分散式系統的兩個常用技巧: Partition 和 Replicate - Partition: 把資料切成多個小塊 - Replicate: 把資料複製多份 ### 對 Performance & Availability 的影響 | | Partition | Replicate | | Performance | 降低搜尋的目標集 | 增加存取吞吐量 | | Availability | 縮窄損害範圍 | 提供備援資料 | --- ## 建立抽象模型以解決分散式系統問題 例子: - System model (asynchronous / synchronous) - Failure model (crash-fail, partitions, Byzantine) - Consistency model (strong, eventual) ### 兩個面向評估抽象化:易理解程度 & 成本考量 - 易理解程度: 盡可能像是在用單台電腦 - 成本考量: 越像一台電腦,成本越高 ### 什麼叫「抽象程度更高」 一般日常中,聽到「你講得很抽象」跟這邊指的不是同一件事。 可以先把這邊講的抽象想成是「簡化事情的複雜程度」。 所以「A 比 B 的抽象程度更高」,指的是 A 刻意忽視了 B 的某些細節,以方便管理,所以 A 更易於理解。 > 當我們每次進行抽象化時,都會失去對一些東西的掌握;假如遇到某些效能瓶頸時,還是得往實際面去解決,這時候就得重新審視那些被忽略的地方。 ## Ref - [[https://medium.com/the-bayesian-trap/414855e7bd74 | Denny 興趣使然地學習分散式系統(0)]] - [[https://medium.com/the-bayesian-trap/167180ca7152 | Denny 興趣使然地學習分散式系統(1)]] - [[https://medium.com/the-bayesian-trap/e0ec11e97953 | Denny 興趣使然地學習分散式系統(2)]] - [[https://medium.com/the-bayesian-trap/a62d553d9cae | Denny 興趣使然地學習分散式系統(3)]] - [[http://book.mixu.net/distsys/intro.html | Distributed systems for fun and profit]]