分佈式有幾十年的歷史了,但從來沒有想今天這麼火過。從分佈式存儲到微服務架構,從區塊鏈到邊緣計算,無所不在,無人不知。下面我們就分佈式所涉及的基本內容列一個大綱,以供大家學習,瞭解。
本大綱旨在向軟件工程師介紹現實中分佈式系統的基礎知識,以便讓大家獲得對分佈式系統中關鍵術語的直觀理解,並探討生產中問題。
分佈式系統的定義
什麼是分佈式系統?Lamport在1987給出了分佈式的定義
A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable.
一個分佈式系統是那種發生問題後,你都不知道發生在哪裡,最終導致你的計算機變得無法訪問和使用。
上面其實是對分佈式的一個簡單描述,可以說不是嚴格的定義。分佈式是將業務分散在多個處理單元(節點)上,通過單元(單元)間的協作完成一個共同的任務。
分佈式的節點
節點是分佈式的基本單元,英文名為Node。在分佈式系統中節點也是要認真考慮的問題,包含性能和容錯等內容。
- 硬件設備
- 雙網卡冗餘,單網卡的故障會導致節點的不可用,因此需要考慮雙網卡冗餘
- CPU綁定,CPU的緩存對提升性能有很大的幫助,綁定CPU避免進程跨CPU切換導致緩存失效。
- RDMA,高性能的設備對性能的提升非常明顯
- 操作系統
- 內存拷貝對性能的影響
- 零拷貝技術
- 緩存與文件系統
- 編程語言與編譯器
- 程序寫法對性能的影響
- 編譯器優化
分佈式的網絡
網絡是分佈式的基石,分佈式系統只有通過網絡才能將多個節點連接成為一個整體。一般分佈式系統都是基於TCP協議進行的,另外,在TCP的基礎上回封裝自己的私有協議。
- 網絡是節點溝通的通道
- 人類交流通過講話
- 計算機交互通過協議(TCP、UDP、RPC)
- 計算機的協議其實類似人類的語言
- 消息隨時間廣播
- 這是分佈式系統的緩慢部分
- 我們稱這為“延遲latency"
- 網絡會存在各種異常
- 重複Duplicate
- 延誤Delay
- 丟失Drop
- 重新排序Reorder
分佈式協議
由於分佈式系統的複雜性和網絡的不可靠性,因此科學家發明了很多算法來解決這些問題。分佈式領域核心的算法有3類,分佈式解決分佈式一致性的算法,進行負載均衡選路的算法和信息高效分發的協議。
- 分佈式一致性協議
- 二階段提交
- 三階段提交
- Paxos協議
- Raft協議
- ZAB協議
- 選路算法
- DHT一致性哈希算法
- 數據分發算法
- Gossip
分佈式應用
分佈式系統在實際生產中涉及的內容很多,但從應用方面就包括分佈式計算和分佈式存儲。而分佈式存儲又分為IaaS的存儲、KV存儲、表格存儲和緩存等等,內容之多,數不勝數。
分佈式任務處理服務:負責具體的業務邏輯處理
分佈式節點註冊和查詢:負責管理所有分佈式節點的命名和物理信息的註冊與查詢,是節點之間聯繫的橋樑
分佈式DB:分佈式結構化數據存取
分佈式Cache:分佈式緩存數據(非持久化)存取
分佈式文件:分佈式文件存取
網絡通信:節點之間的網絡數據通信
監控管理:蒐集、監控和診斷所有節點運行狀態
分佈式編程語言:用於分佈式環境下的專有編程語言,比如Elang、Scala
分佈式算法:為解決分佈式環境下一些特有問題的算法,比如解決一致性問題的Paxos算法
開源項目:Redis,ZooKeeper,Dubbo,Etcd,Ceph,K8S
上述內容都是進行分佈式開發和設計必須的內容,希望對大家有所幫助。