聊聊分散式系統
整理資料,回顧之前寫的東西,常常覺得這些就是要不斷地拿出來提,特別是 分散式系統 (Distributed Systems)
已經是現代架構的常態,他就跟組織一樣,要面對各式各樣 依賴性
、內外聚合
、可控性
、可治理
、可觀測
、網路拓墣
、效能
、快取
、事件處理
… 等問題,這些問題不只可以對應到系統,也可以對應到人、組織 (康威定律
)。
- 一、分散式系統核心問題
- 二、理論基礎與方法概念
- 三、當代工程方法與實踐
- 四、分散式系統、組織運作、腦科學、宇宙、意識
一、分散式系統核心問題
分散式系統相對的就是集中式系統,代表的是 IBM 的大型主機 (Mainframe),像是 z/System、z/OS 系列。分散式系統相對於大型主機的好處,主要在於可擴展性佳、高容錯性、高冗余、可以承載高容量的業務量,但是這些優點背後也是有很大的代價的,也因此有很多學者發表很多理論討論相關議題,整理如下:
- 核心議題:分散式一致性問題與共識演算法
- 分散式系統的謬論 (Fallacies of distributed computing)
分散式系統的謬論 (Fallacies of distributed computing)
計算計科學家 Peter Deutsch 在九零年代就提出 Fallacies of distributed computing (分散式系統的謬論),點出以下容易被忽略、或者輕忽的觀點:
- The network is reliable (網路是可靠的)
- Latency is zero (網路沒有延遲)
- Bandwidth is infinite (頻寬是無限的)
- The network is secure (網路是安全的)
- Topology doesn’t change (網路拓墣不會改變)
- There is one administrator (網路上有個管理員)
- Transport cost is zero (傳輸沒有成本)
- The network is homogeneous (網路是同質的)
這些概念,特別是在現代雲端流行的時代,更容易被忽略,但實際上卻是很重要的。特別是在 Microservices、SRE、Chaos Engineering 裡都是經常被拿出來個別討論的。
註一:同事 Earou 分享 效能測試 時,提到了我們曾遇過的 DNS resolved 卡在 NAT network throughput 的案例,我們也曾在 K8s 跑效能時,遇到了 kube-dns 效能問題。
註二:這個謬論說,我個個人覺得很大程度是因為用平行計算 (Parallel Computing)
的思路,來想分散式系統架構 (concurrency and resource sharing)。確沒意識到兩者有截然不同的背景。詳細參閱:平行程式設計
下圖是 Why Distributed Systems Are Hard 中用貓來表達這八點:
二、理論基礎與方法概念
理論基礎
- CAP Theorem、
ACID
、BASE
- 共識演算法
- 通訊問題:Distributed Message Systems
- Design Patterns for Distributed Systems
- 程式設計實踐基礎:
Design Patterns
與OOP
- 程式設計實踐基礎:
相關論文與代表人物
- Leslie Lamport: 美國計算機科學家,是排版系統 LaTex 的開發者,提出 Paxos 共識演算法,是分散式系統領域早期的研究學者,在 2013 獲得圖靈獎。他有幾篇重要的論文:
- 1982: The Byzantine Generals Problem (拜占庭問題)
- 1990: The Part-time Parliament
- 2001: Paxos Made Simple
Mike Burrows
: Google Chubby 分散式鎖的實作者,他認為只有一種分散式共識演算法,就是 PaxosDiego Ongaro
和John Ousterhout
: Raft 演算法作者。- Werner Vogels: 現任 AWS CTO, 發表過底下兩篇著名的論文
- 2016: What’s Really New with NewSQL?
- 2017: Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases
- Google 三大論文:
- 2003: The Google File System, by Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung
- 2004: MapReduce: Simplified Data Processing on Large Clusters, by Jeffrey Dean and Sanjay Ghemawat
- 2006: Bigtable: A Distributed Storage System for Structured Data, by Fay Chang, Jeffrey Dean, Sanjay Ghemawat, Wilson C. Hsieh, Deborah A. Wallach Mike Burrows, Tushar Chandra, Andrew Fikes, Robert E. Gruber
分散式系統 發展史 與 理論論文
為了有效的了解分散式系統的發展歷史,我整理相關論文的時間軸,了解前後發展的歷史:
Timeline: https://www.timetoast.com/timelines/2346231
從歷史來看,分散式系統發展到現在的時間不算長,把理論落實到工程實踐的時間約在 2000 之後。
2000 之後幾個關鍵的理論基礎,像是 CAP、Paxos、BASE、ACID 不斷的被討論,後來 Google 的 BigTable、MapReduce、GFS 的實踐,Chubby lock 把 Paxos 從理論搬到實踐;AWS 的 Dynamo、Eventually consistent … 等。這些過程也催生了現在的三大公有雲 AWS、Azure、GCP 。
隨後去中心化的想法持續發酵,2010 年之後催生了 微服務架構
的實踐,各種實踐的想法誕生,像是 ZooKeeper 的 ZAB、Google 提出的分散式追蹤模型 Dapper、Cassandra 實踐去中心化資料庫、Google 著名的分散式叢集管理系統 Borg 衍生的 Kubernates、簡化 Paxos 的 Raft 演算法 …
廿年下來,理論與實踐激盪出很精彩的分散式系統架構史,這整個歷史還在發展,我們都還在洪流中被帶著走,標準
的教科書也還沒出現,就讓我們一起看下去吧~
三、當代工程方法與實踐
實踐分散式架構的內外心法
Designing Distributed Systems 開頭第一章就提到一段話:
But building distributed systems is challenging. Often, they are one-off bespoke solutions. In this way, distributed system development bears a striking resemblance to the world of software development prior to the development of modern object-oriented programming languages.
不管是不是分散式系統,本質上,軟體架構關鍵性的從內到外概念包含了:
- 內功心法:
- 分散式核心問題:分散式一致性問題 (consistency)、共識演算法 (Consensus Algorithm)、Paxos 與 Raft
- 分散式資料處理理論:
CAP
、ACID
、BASE
DDD (Domain Driven Design, 領域驅動設計)
: 解偶、拆分- 程式設計實踐基礎:
Design Patterns
與OOP
- 外家功夫:
- 分散式架構概念,像是 Microservices、Service Mesh、API Gateway
- 分散式系統治理:如何有效管理分散式系統彼此之間協作的問題,分成系統上線前中後,整理相關議題有以下:
- Service Mesh: 服務的之間的限流、熔斷、認證授權、監控 … 等議題,最著名的實踐就是 Istio
- Service Discovery: 服務識別管理的問題
- Service Catalog: 服務目錄管理的問題。
- Config Management: 服務配置管理
- Distributed Tracing: Jaeger
- 分散式交易 (Distributed Transaction)
- XA (X/Open Distributed Transaction Processing Model): 強一致性
- 2PC (Two Phase Commit)
- 3PC (Three Phase Commit): CanCommit, PreCommit, DoCommit
- TCC
- Cloud Native:
- 容器技術 (Docker、Katada)、Kubernetes
- 持續交付概念,包含 CI/CD
- 雲端架構實務,像是 Architecting for the Cloud, AWS Well-Architected Framework
- Site Reliability Engineering
- Chaos Engineering
內外兼修,才能滿足分散式系統的架構實踐。
相關議題:可靠性工程的架構
底下名詞是與可靠性 (Reliability) 有關係的架構議題:
- Elasticity 彈性
- Resilient 韌性
- Redundant 冗餘
- Replication 副本
- Highly Availability 可用性
- Sharding 分片
微服務架構/分散式架構
在 API Gateway Private Endpoint 最後畫了一張架構圖,其中包含 API Gateway、Service Discovery、Service Catelog、Message Queue 等概念,主要就是描述大型架構的基礎架構。分散式架構通常要面對的是分散式服務治理的問題。
關聯字 or Buzzwords
最近相關字詞很多,在整理筆記時 (2018/04),慢慢的把這幾件事情都連在一起了,下圖是我在 SRE Taiwan 用比較詼諧、自嘲的方式,紀錄這些流行用詞的關連性,保留原始溫度,截圖記錄如下:
原文 點這裡,歡迎來喇低賽 XD
看完笑笑就好,認真地重新整理如下:
SRE (Site Reliability Engineering)
: 這是我工作上的主軸之一,強調自動化、用軟體工程做 Ops、救火隊兼架構顧問- Google SRE 不只是用軟體工程做維運,同時也肩負架構顧問,協助 Review 開發團隊的架構,詳細參閱 SRE CH27 - Reliable Product Launches at Scale
- Chaos Engineering:工程問題,中文翻譯成
混沌工程
,主要目的是透過破壞、找到系統的脆弱點,目的是 反脆弱 (Antifragile),建立強健可靠的系統。 Distributed Systems
: 現代架構趨勢,因而有 Chaos Engineering 的方法論。Microservices
: 這幾年最潮!但是說很容易,做很不容易,他的前提很多,這些前提都做到通常也不太需要這個架構了。隨便舉例幾個前提:- 能夠重構架構 <– 光這點很多公司就不可能了
- 快速建置環境:很多公司的環境都是亂成一團,快速建置是開玩笑的
Service Mesh
: 新一代的概念,概念跟 API Gateway 很像。相關介紹參閱我的筆記:Service Mesh、Overview API GatewayKubernetes
:現代分散式系統的最佳實踐平台,容器編排的戰國時代已經結束了。DevOps
:企業組織文化的革新觀念,值得所有經營者、管理者深入了解、思考。Agile
:這是軟體開發流程的顯學,導入也是要有很多前提的。例如團隊要夠成熟、願意面對改變。- 通常團隊都不夠成熟,不敢面對改變
- 上述兩個條件都達到時,沒有這個開發流程一樣能做到好的軟體
相關詞很多,例如還有 XyxOps
這類的也可以扯進來,不過這會變得像是無限上綱,所以還是到此為止。
四、分散式系統、組織運作、腦科學、宇宙、意識
人類大腦的運作
我很喜歡研究 科幻
有關的主題,底下是我最喜歡的科幻分析 Youtuber,談的是人類大腦的概念,裡面提到一段想法跟分散式系統很像。
底下整理 Youtube 內容的摘要:
人類大腦由 140 億個神經元組成,神經元又由細胞體、神經纖維組成,其中細胞體想像成計算機,神經纖維想像成網路。生命的演化,正是因為神經元不斷地增長,最後才演化出智慧生命體:人類。人類大腦的
灰質
相當於計算機 (細胞體)
,白質
相當於連結系統 (神經纖維) 的網路
。表示人腦約有 140 億台計算機 (灰質、細胞體) 同時在運作,計算機之間透過網路連結 (白質、神經纖維)。
下圖摘錄影片說明細胞體、神經元,對比到計算計、網路的概念圖:
研究顯示註,人與人之間的區別,不在灰質,在於白質。例如鋼琴家的白質,遠比普通人發達的多。人與人之間腦袋裡的運算能力其實大同小異,但是相差很大的是腦袋裡的網路的連線方式不同。
註:大腦白質有價值
這段意思不是說網路比運算能力還重要,這只是表面的錯意。實際上要表達的是,計算機之間的溝通、協作,會比計算機本身還要重要。
一些對照:
- 分散式系統:計算機的連結方式,比計算機本身計算能力還重要。
- 團隊:團隊的溝通協作模式,比個人能力還重要。
人類群體社會的運作
人類社會群體的運作,就是一個龐大且複雜的分散式系統。
- 政府、組織,就是治理、負責處理共識、一致性問題問題。
- 人類的溝通就如同分散式系統的溝通模式,而問題就如同
分散式系統的謬論
的論述 - 各式各樣的組織與社群、個人,都是系統的一份子,如何管理追蹤群體事件的變化,本身就是困難的。
- 人類的協作、溝通越順暢,整體社會運作越有效率、成本越低。
延伸閱讀 (站內)
分散式系統系列文章
- 概念與理論
- 實踐方法與技術
- 經驗分享
參考資料
書籍 / 論文
- Designing Distributed Systems, Design patterns for container-based distributed systems by Brendan Burns, David Oppenheimer (Google)
- Designing Event-Driven Systems - Free
- Chaos Engineering - Free
- 反脆弱:脆弱的反義詞不是堅強,是反脆弱 Antifragile: Things That Gain from Disorder
- Gossiping in Distributed Systems
- 左耳朵耗子:分散式系統架構經典資料
網站文章
- ACM: Gossiping in Distributed Systems
- Fallacies of distributed computing
- 架构 - 又一个类似与“平台”一样的词汇
- 到底什麼是分散式?
- Notes on Distributed Systems for Young Bloods
- 区块链技术指南: 其中一個章節整理很豐富的分散式系統核心問題
- 图解 Elasticsearch 原理
- Why Distributed Systems Are Hard
學習資源
- MIT 6.824: Distributed Systems - by Frans Kaashoek (ACM Fellow), Robert Morris
聯想參考
- 【问舰】人脑只开发了10%不只是个传说,换个角度解读科幻片《超体》
- 大腦白質有價值
- 保存大腦,就能保存心智?
- 人的意識來自宇宙 腦細胞聯繫超過三度空間
- 攻殼機動隊電影解析:什麼是人?/ 賽伯格與哈洛威 Cyborg and Haraway / 意識 & 心靈哲學
異動紀錄
- 2019/10/13: [增加段落] 相關論文與代表人物、人類群體社會的運作
- 2020/05/17: 調整文章結構