Distributed programming is the art of solving the same problem that you can solve on a single computer using multiple computers.
Scalability
處理每件事情都需要注意它的規模,如果規模達到一定程度,處理的難度明顯加強。例如你可以計算出一個房間中的人數,但是很難計算出一個國家的人數。在一個可擴展的分布式系統中,系統從小變大,但是相關性能沒有變差。
比如在單機文件系統上加 RAID5 做數據冗余,來解決單機文件系統的可靠性問題。假設 RAID5 的數據修復時間是1天(實際上往往做不到,尤其是業務系統本身壓力比較大的情況下,留給 RAID 修復用的磁盤讀寫帶寬很有限),這種方案單機的可靠性大概是100年丟失一次數據(即可靠性是2個9)。看起來尚可?但是你得小心兩種情況。一種是你的集群規模變大,你仍然沿用這個土方法,比如你現在有 100 台這樣的機器,那么就會變成1年就丟失一次數據。另一種情況是如果實際數據修復時間是 3 天,那么單機的可靠性就直降至4年丟失一次數據,100台就會是15天丟失一次數據。這個數字顯然無法讓人接受。
scalability(可擴展性)是指在一個系統、網絡以及處理能力范圍內,可以處理不斷增長的任務,並它們可以加強自己的能力來適應任務的增長(有點兒抽象)。
- 大小可擴展性:增加節點可以線性增加性能,並數據集的增加不增加延遲性
- 地理位置可擴展性:數據中心間延遲性采用合理的方式處理,則可以跨數據中心,減少用戶數據查詢響應時間
- 管理可擴展性:增加更多的節點不增加管理的開銷
Performance
性能特點是在一定任務情況下,系統處理所需要的時間和資源使用量來衡量的。如快速回復(低延遲性)、高吞吐量以及計算資源低使用率。但是這幾個性能,在實際中只能權衡。
latency
延遲性指事件初始化和發生的時間段。比如在分布式系統中寫操作,就寫發生到新的數據可以被用戶看到的時間段。latency經常要受一些硬件(ram的性能、cpu性能)的限制。
Availability
指系統處在運行狀態時間的比例,用戶不可以訪問,那么系統就是不可用。
分布式系統上可以獲得單機非常的特性,比如單機就是無法容忍機器宕機。分布式系統可以由一些非常不好的組件構成,但是可以提供可信賴的系統。
Availability = uptime / (uptime + downtime)
例如:
Availability % | How much downtime is allowed per year? |
---|---|
90% ("one nine") | More than a month |
99% ("two nines") | Less than 4 days |
99.9% ("three nines") | Less than 9 hours |
99.99% ("four nines") | Less than an hour |
99.999% ("five nines") | ~ 5 minutes |
99.9999% ("six nines") | ~ 31 seconds |
availability不僅僅是uptime,還可能受網絡中斷以及該業務超出系統的功能的影響。
Fault tolerance
指在故障發生時,系統還可以正常運行(和沒有發生故障時功能相同)的能力。
容錯歸結為:確定你所期望的故障,然后設計一個系統或一個算法可以容錯他們。沒有考慮過故障是無法容錯的。
什么在阻止我們獲得理想的狀態呢?
有以下兩個硬件方面的因素:
1 nodes的數量
2 nodes的距離
伴隨着以下限制:
1 獨立節點的增加,就增加了系統失敗的概率(減小了availability並增加了管理成本)
2 獨立節點的增加,就增加了節點的通信 (降低了可擴展的performance)
3 節點的跨機房部署,增加了節點之間的延遲性(降低了某些操作的performance)
可用性和性能是系統必須保證的,更高一級,可以考慮SLA(服務等級協議),如果我寫數據,如何更快在其他地方看到?
在數據被寫入時,什么可以保證耐久性?如果讓系統運行一個計算,如何迅速返回結果?當組件發生故障,執行取出操作,什么樣的影響將在在系統上?
設計技術:partition and replicate
如果要把數據分布在不同節點,那么上面兩個技術非常關鍵。數據可以被分割在多個節點(partition),以允許更多的並行處理。也可以被復制或緩存在不同的節點上,以減少客戶端和服務器之間距離以及更大的容錯性(replicate)
partitioning是把數據分成相互獨立的數據集,這樣可以避免數據的增長帶來的影響。partitioning是通過限制被檢查數據集的大小和定位相關數據在相同partition來提高性能的(如一個數據一分鍾的記錄,那么這個數據分布在一台機器和多台機器性能是截然不同的)。容許partition獨立失敗,來挺高可用性。在不可用情況下,容易更多節點失敗。
replication可以通過復制數據集,提高計算和帶寬能力。可以提高可用性,在不可用情況下,容易更多節點失敗。當然replication又會帶來一致性問題,后面再討論一致性的問題。