本文是閱讀深入理解分布式系統第一章認識分布式系統時的筆記。
分布式系統的特點
- 多進程
- 不共享操作系統
- 不共享時鐘
分布式系統
- 由多個可獨立運行的子系統組成。
- 每個子系統可以獨立選擇運行平臺。
- 不同的運行平臺存在差異,比如操作系統,硬件規格等。
- 由于底層平臺不同,因此無法共享底層基礎設施,比如:
- 通信,無法使用單機常見的通信機制,只能使用消息來通信,比如TCP、消息隊列等。
- 時鐘,不同平臺的時鐘精度不同,或多或少存在一定的誤差,且無法完全避免。
傳統的單體應用
與分布式系統相比:
- 所有子系統或者組件在同一個進程內運行。
- 所有子系統運行于相同的平臺上,依賴相同的底層平臺。
- 所有的子系統需要適配共同平臺的特點,適應優點和缺點。
- 所有的子系統共享相同平臺的基礎設施。
- 由于在同一個進程內,子系統之間通信時,可選擇的方案很多,并且可靠。
- 在同一個平臺上,時鐘的誤差相對穩定,對所有子系統的影響是相同的。
分布式系統的異構優勢
對于分布式系統而言,不同的子系統可以使用不同的底層平臺和硬件規格,因此可以依據不同的需求,做出不同的選擇。比如:
- 對于計算密集型的子系統,可以配置核數多、計算頻率高的CPU。
- 對于緩存型業務的子系統,可以配置大的內存,盡可能將數據緩存至內存中,提升緩存的訪問效果。
- 對于網絡I/O密集型的子系統,可以配置帶寬大、處理能力強的網卡。
- 對于文件I/O密集且時延敏感的子系統,可以配置SSD盤,降低I/O處理時延,提升I/O吞吐量。
- 對于文件I/O密集且時延不敏感、吞吐量敏感的子系統,可以配置HDD盤,滿足大帶寬的訪問能力,同時有效降低成本。
使用分布式系統的主要動力
使用分布式系統來承載業務交付的主要動力:
- 高性能
簡單的堆砌硬件,提升硬件規格,可能已經無法滿足客戶對業務性能的訴求。
提升硬件的規格目前面臨物理定律的限制,提升的難度和成本快速增長,相比之下提升規格的效益和投入成本越來越不匹配。
從單機系統遷移至多機的分布式系統,堆砌簡單、低成本的硬件,期望換取性能的線性或者準線性增長。 - 可擴展性
性能不足時,可以通過向集群中增加新的節點,來提升性能,同時不會顯著增加系統復雜度以及各類成本。 - 高可用
降低子系統失效時,對業務整體的影響。 - 必要性
不同地域,不同業務歸屬等原因,導致一些業務系統天然具備分布式系統的特征。
個人見解
在做技術選型時,從開發、驗證、維護的角度來說,假如單體系統或者單體應用可以滿足客戶要求的功能、性能、擴展性等要求的話,優先選擇單體的方案,快速交付、快速滿足客戶需求,爭取到活下來的機會,然后再依據客戶的訴求,業務發展的方向,逐步遷移技術路徑,將單體應用逐步改造為分布式系統,支撐業務不斷迭代和成長。
常見的分布式系統
依據Google的成功經驗,梳理分布式系統的服務,如下:
- 分布式鎖服務
- 分布式協調服務
- 分布式緩存服務,鍵值對
- 分布式存儲服務
- 分布式塊服務
- 分布式文件服務
- 分布式對象服務
- 分布式數據庫
- NoSQL數據庫
- 行式數據庫
- 列式數據庫
- 分布式緩存型數據庫
- 行式數據庫
- 列式數據庫
- 分布式批處理服務
- 分布式流處理服務
- 分布式計算服務
- 分布式圖計算服務
- 分布式調度服務
- 任務的類型
- 定時任務
- 一次性任務
- 任務的操作
- 新建
- 執行
- 暫停
- 刪除
- 任務之間的依賴關系
- 資源的分配和管理
- 任務的類型
- 時鐘服務
- DNS服務
- 集群管理
- 擴容
- 縮容
- 隔離
- 監控
- 告警
- 性能
- 升級
- 回退
- 打補丁
常見的思維誤區
設計、交付分布式系統時,常見的思維誤區:
- 網絡是可靠的。
- 子系統間傳遞信息的延遲為零。
- 子系統間傳遞信息時的帶寬是無限的。
- 子系統間通信時的網絡是安全的。
- 網絡拓撲結構不會發生改變。
- 有單一、萬能且不會犯錯的管理員。
- 子系統之間傳遞信息的傳輸成本為零。
- 網絡是同構的。
網絡延遲類的問題
在傳遞消息時,發送者創建、發送消息,消息通過網絡傳遞至接收者。
-
從發送者角度來看
- 消息丟失,即發送消息后,消息沒有傳遞給接收端。
- 在超時前,沒有等到回應,即發送消息后,發送者等待一段時間后沒有收到接收者的回應,從而判定消息丟失。但有可能接收者確實收到了消息,但整體上耗時超出發送者的預期。
- 重試之后,仍然無法按照發送者預期的方式通信,導致發送者判定接收者失效,但接收者可能是正常的。
- 網絡傳輸消息時,可能無法保證時序,即發送者接收到響應消息,但順序和預期存在差異。
-
從接收者的角度來看
- 發送者可能重復發送了消息,比如發送者設置的超時值太短。
- 網絡在傳遞消息時,可能由于各種原因,多次傳遞了消息,導致接收者收到了重復的消息。
- 網絡傳輸消息時,可能無法保證時序,即接收者收到消息時,消息的順序和發送時的順序不同。
部分失效的問題
客戶期望分布式系統中個別子系統失效,不影響整體業務的表現。
但在分布式系統中,各子系統可能會以預想不到的方式出現失效,從而顯著提升相關問題的定位、修復的難度。
時鐘的問題
手表定律
擁有兩塊以上的手表并不能幫人更準確的判斷時間,反而會制造混亂,讓看表的人失去對時間的判斷。
對于分布式系統而言,由于子系統運行在各種平臺上,各自擁有不同的時鐘,從而導致無法準確、一致的預計時間,因此判斷事件的先后順序,變成了一件極其有挑戰的事情。
常規操作的規格
掌握常見操作的時延,有助于評估分布式系統場景下各業務處理流程的耗時,從而選擇最佳的實現方案。
常見的評估指標
比如時延、帶寬、吞吐量等。