1. 程式人生 > >初遇分散式系統(一)

初遇分散式系統(一)

簡述

前期博文主要是針對一些分散式系統資料的學習筆記.

首先需要說明關於分散式中的一些認知誤區:

  • 網路是可靠的
  • 延遲為零
  • 頻寬無限
  • 網路非常安全
  • 網路拓撲不會改變
  • 只有一個管理者
  • 傳輸開銷為零
  • 網路同構(使用相同的配置和協議)

以上所述均為人生錯覺

這本書中,作者提出了自己對於分散式中所要解決的兩個終極問題

  1. 資訊以光速傳輸(時序問題)
  2. 錯誤之間相互獨立(容錯問題)

分散式系統主要為了完成兩個任務
1. 儲存
2. 計算

關於為了到達更好的計算能力,最直接的辦法就是上更好的機器(縱向擴充套件),但是在增加到一定程度後會面臨無法在單機到達可接受效率的問題.

同時,關於分散式系統中的機器選擇.在假設均勻訪存模型(Uniform memory architecture)(處理器訪問所有記憶體儲存器的時間是一樣的),隨著叢集中機器數量的增加,高階機器和普通機器的效能牆逐漸接近.其原因主要在於機器間的資料複製開銷和計算的協調開銷.

目標

可擴充套件性

Everything starts with size - scalability

需要重點關注的三個方面(擴充套件性):

  • 規模擴充套件性:增加更多節點使得系統線性增長(不增長延遲)
  • 地理伸縮性:可以使用多個異地的資料中心以解決使用者訪問(不增長延遲)
  • 管理的伸縮性:增加更多節點不應該增加系統的管理開銷

都是需要在保證一定延遲和開銷下的擴充套件.

效能及延遲

效能通過系統完成一定工作所使用的時間和資源來衡量.依據所需,應該達到以下的一點或多點:

  1. 低延遲
  2. 高吞吐量
  3. 低資源使用率

這幾者之間需要進行權衡,如為了達到更高的吞吐量,可以使用批處理的手段,但是在這種情況下,延遲就會相應地延長.

另外,延遲指的是操作發生至真正產生影響的時間.這一定義,主要解決問題:如果你發起一個計算所有資料的操作,但是同時有資料新增入系統,如果計算的速度和寫入速度一樣的話,….,延遲就是無限大.

可用性

如果一個使用者無法訪問系統,則表示該系統不可用.通常分散式系統相較於單機系統有更高的可用性,因為其具有更好的容錯性.

Availability=uptime/(uptime+downtime)

What prevents us from achieving good things

作者在這裡提出了兩個限制分散式系統的物理因素.

  • 分散式系統節點的數量
  • 節點間的距離

由此帶來的:

  • 降低可用性和提升了管理開銷
  • 隨著規模增大降低了效能(通訊開銷)
  • 異地的資料中心增加了延遲,降低效能

關於分散式系統的評價標準則是依據SLA(service level agreement)(服務的品質、水準、效能等方面所達成的雙方共同認可的協議或契約),另外一個沒有被經常提及的則是:理解度

Abstractions and models

抽象能夠將將現實中於問題無關的因素移除,幫助理解把握整個問題,模型則是能夠精確地描述分散式系統中的關鍵部分.例如,本書後面將會提到的一些模型的例子:

  • 系統模型(非同步/同步)
  • 失敗模型(拜占庭問題、分割槽問題)
  • 一致性模型(強一致、最終一致)

設計技巧:分割槽+冗餘

分割槽

資料分割槽後減少資料量能夠並行處理提高效能,保證了資料片間相互獨立

複製

複製得到的冗餘資料能夠提升系統容錯性,同時降低延遲,但是也帶來了資料的一致性問題.