1. 程式人生 > >用大白話聊聊分散式系統

用大白話聊聊分散式系統

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/kkkloveyou/article/details/60493832 原文同步至https://waylau.com/talk-about-distributed-system/

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

什麼是分散式系統

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

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

首先,這種系統相對來說比較牛逼,起碼由好幾臺主機組成。以谷歌、亞馬遜等服務商而言,他們的資料中心都由上萬臺主機支撐起來的。 其次,雖然很牛逼,但對於外人來說,是感覺不到這些主機的存在。也就是說,我們只看到是一個系統在運作。以最近的“亞馬遜 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等。

當然,本文也只是拋磚引玉,不可能面面俱到。望各位讀者有不同的見解,歡迎討論。 ---------------------  作者:_waylau  來源:CSDN  原文:https://blog.csdn.net/kkkloveyou/article/details/60493832  版權宣告:本文為博主原創文章,轉載請附上博文連結!