search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

用大白話聊聊分散式系統

一提起「分散式系統」,大家的第一感覺就是好高大上啊,深不可測,看各類大牛關於分散式系統的演講或者書籍,也大多是一臉懵逼。本文期望用淺顯易懂的大白話來就什麼是分散式系統、分散式系統有哪些優勢、分散式系統會面臨哪裡挑戰、如何來設計分散式等方面的話題來展開討論。

什麼是分散式系統

關於「分散式系統」的定義,我們先看下老外是怎麼說的。《分散式系統原理和范型》一書中是這樣定義分散式系統的:「分散式系統是若干獨立計算機的集合,這些計算機對於用戶來說就像是單個相關係統」。

關於這個定義,我們直觀的感受就是:

  • 首先,這種系統相對來說比較牛逼,起碼由好幾台主機組成。以谷歌、亞馬遜等服務商而言,他們的數據中心都由上萬台主機支撐起來的。
  • 其次,雖然很牛逼,但對於外人來說,是感覺不到這些主機的存在。也就是說,我們只看到是一個系統在運作。以最近的「亞馬遜 S3 宕機事件」為例,平時,我們壓根不知道亞馬遜所提供的服務背後是由多少台主機組成,但是等到 S3 宕機才知道,這貨已經是佔了互聯網世界的半壁江山了。

從進程角度看,兩個程序分別運行在兩個台主機的進程上,它們相互協作最終完成同一個服務(或者功能),那麼理論上這兩個程序所組成的系統,也可以稱作是「分散式系統」。

當然,這個兩個程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我們又可以稱之為「集群」。所謂集群,就是將相同的程序,通過不斷橫向擴展,以提高服務能力的方式。

「分散式系統」和「集群」的定義夠都簡單吧。

(圖片選自《分散式系統常用技術及案例分析》)

分散式系統有哪些優勢

那麼,為啥我們要用分散式系統?

說起分散式系統,我們就不得不說下分散式系統的祖先——集中式系統。集中式系統跟分散式系統是完全相反的兩個概念。集中式系統就是把所有的程序、功能都集中到一台主機上,從而往外提供服務的方式。

集中式系統最容易理解了。比如,我們主機的PC電腦,或者手機,我們把各種軟體都安裝在一台機子上,當我需要什麼功能,我就從這台機子上去獲取。再比如,我們在學生時代做的課程設計或者開發時的小應用,我們把Web伺服器、資料庫等都會安裝到一台電腦上。好處是,易於理解、方便維護,想要的東西我都放到了一個地方,東西好找啊。當然弊端也是顯而易見的,如果這台機子崩了,或者硬碟壞了,那相當與整個系統就奔潰了,而且如果備份也是在這個硬碟上,那相當於招了滅頂之災。

所以巴菲特有個關於投資的名言,就是「不要把雞蛋放在一個籃子里」。對於系統而言也是如此。廠商的機子不可能永遠保證永遠不壞,我們也無法保證黑客不會來對我們的系統搞基,最為關鍵的是,我們自己無法保證自己的程序不會出bug。所以問題無法避免,錯誤也不可避免。我們只能雞蛋分散到不同的籃子里,來減輕一鍋端的風險。這就是為什麼需要分散式系統的原因。

使用分散式系統的另外一個理由是可擴展性。畢竟任何主機(哪怕是小型機、超級計算機)都會有性能的極限。而分散式系統可以通過不斷擴張主機的數量以實現橫向水平性能的擴展。大家也都了解到 Google 的伺服器主機,大多是淘汰的二線機子拼湊的吧。

分散式系統會面臨哪裡挑戰

毫無疑問,分散式系統對於集中式系統而言,在實現上會更加複雜。分散式系統將會是更難理解、設計、構建 和管理的,同時意味著應用程序的根源問題更難發現。

設計分散式系統時,經常需要考慮如下的挑戰:

  • 異構性:分散式系統由於基於不同的網路、操作系統、計算機硬體和編程語言來構造,必須要考慮一種通用的網路通信協議來屏蔽異構系統之間的差異。一般交由中間件來處理這些差異。
  • 缺乏全球時鐘:在程序需要協作時,它們通過交換消息來協調它們的動作。緊密的協調經常依賴於對程序動作發生時間的共識,但是,實際上網路上計算機同步時鐘的準確性受到極大的限制,即沒有一個正確時間的全局概念。這是通過網路發送消息作為唯一的通信方式這一事實帶來的直接結果。
  • 一致性:數據被分散或者複製到不同的機器上,如何保證各台主機之間的數據的一致性將成為一個難點。
  • 故障的獨立性:任何計算機都有可能故障,且各種故障不盡相同。他們之間出現故障的時機也是相互獨立的。一般分散式系統要設計成被允許出現部分故障而不影響整個系統的正常使用。
  • 併發:分散式系統的目的,是為了更好的共享資源。那麼系統中的每個資源都必須被設計成在併發環境中是安全的。
  • 透明性:分散式系統中任何組件的故障、或者主機的升級、遷移對於用戶來說都是透明的,不可見的。
  • 開放性:分散式系統由不同的程序員來編寫不同的組件,組件最終要集成成為一個系統,那麼組件所發布的介面必須遵守一定的規範且能夠被互相理解。
  • 安全性:加密用於給共享資源提供適當的保護,在網路上所有傳遞的敏感信息,都需要進行加密。拒絕服務攻擊仍然是一個有待解決的問題。
  • 可擴展性:系統要設計成隨著業務量的增加,相應的系統也必須要能擴展來提供對應的服務。

如何來設計分散式

設計分散式系統的本質就是「如何合理將一個系統拆分成多個子系統部署到不同機器上」。所以首要考慮的問題是如何合理的將系統進行拆分。由於拆分后的各個子系統不可能孤立的存在,必然是通過網路進行連接交互,所以它們之間如何通信變得尤為重要。當然在通信過程要識別「敵我」,防止信息在傳遞過程中被攔截和竄改,這就涉及到安全問題了。分散式系統要適應不斷增長的業務需求,那麼就需要考慮其擴展性。分散式系統還必須要保證可靠性和數據的一致性。

概況起來,在設計分散式系統時,應考慮以下幾個問題:

  • 系統如何拆分為子系統?
  • 如何規劃子系統間的通信?
  • 通信過程中的安全如何考慮?
  • 如何讓子系統可以擴展?
  • 子系統的可靠性如何保證?
  • 數據的一致性是如何實現的?

實際上,上面的每一個問題都不是簡單的問題。還好,我們要感謝開源,讓這個時代的技術可以共享,讓實現複雜系統的成本越來越低。比如,我們在設計通信時,我們可以採用面向消息的中間件,比如Apache ActiveMQ、RabbitMQ、Apache RocketMQ、Apache Kafka等,也有類似與 Google Protocol Buffer、Thrift等 RPC框架。在設計分散式計算時,我們分散式計算可以採用 MapReduce、Apache Hadoop、Apache Spark 等。在大數據和分散式存儲方面,我們可以選擇 Apache HBase、Apache Cassandra、Memcached、Redis、MongoDB等。在分散式監控方面,常用的技術包括Nagios、Zabbix、Consul、ZooKeeper等。

當然,本文也只是拋磚引玉,不可能面面俱到。望各位讀者有不同的見解,歡迎討論。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦