版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
一提起“分布式系統(tǒng)”,大家的第一感覺(jué)就是好高大上啊,深不可測(cè),看各類大牛關(guān)于分布式系統(tǒng)的演講或者書籍,也大多是一臉懵逼。本文期望用淺顯易懂的大白話來(lái)就什么是分布式系統(tǒng)、分布式系統(tǒng)有哪些優(yōu)勢(shì)、分布式系統(tǒng)會(huì)面臨哪里挑戰(zhàn)、如何來(lái)設(shè)計(jì)分布式等方面的話題來(lái)展開(kāi)討論。
關(guān)于“分布式系統(tǒng)”的定義,我們先看下老外是怎么說(shuō)的。《分布式系統(tǒng)原理和范型》一書中是這樣定義分布式系統(tǒng)的:“分布式系統(tǒng)是若干獨(dú)立計(jì)算機(jī)的集合,這些計(jì)算機(jī)對(duì)于用戶來(lái)說(shuō)就像是單個(gè)相關(guān)系統(tǒng)”。
關(guān)于這個(gè)定義,我們直觀的感受就是:
首先,這種系統(tǒng)相對(duì)來(lái)說(shuō)比較牛逼,起碼由好幾臺(tái)主機(jī)組成。以谷歌、亞馬遜等服務(wù)商而言,他們的數(shù)據(jù)中心都由上萬(wàn)臺(tái)主機(jī)支撐起來(lái)的。其次,雖然很牛逼,但對(duì)于外人來(lái)說(shuō),是感覺(jué)不到這些主機(jī)的存在。也就是說(shuō),我們只看到是一個(gè)系統(tǒng)在運(yùn)作。以最近的“亞馬遜 S3 宕機(jī)事件”為例,平時(shí),我們壓根不知道亞馬遜所提供的服務(wù)背后是由多少臺(tái)主機(jī)組成,但是等到 S3 宕機(jī)才知道,這貨已經(jīng)是占了互聯(lián)網(wǎng)世界的半壁江山了。從進(jìn)程角度看,兩個(gè)程序分別運(yùn)行在兩個(gè)臺(tái)主機(jī)的進(jìn)程上,它們相互協(xié)作最終完成同一個(gè)服務(wù)(或者功能),那么理論上這兩個(gè)程序所組成的系統(tǒng),也可以稱作是“分布式系統(tǒng)”。
當(dāng)然,這個(gè)兩個(gè)程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我們又可以稱之為“集群”。所謂集群,就是將相同的程序,通過(guò)不斷橫向擴(kuò)展,以提高服務(wù)能力的方式。
“分布式系統(tǒng)”和“集群”的定義夠都簡(jiǎn)單吧。
那么,為啥我們要用分布式系統(tǒng)?
說(shuō)起分布式系統(tǒng),我們就不得不說(shuō)下分布式系統(tǒng)的祖先——集中式系統(tǒng)。集中式系統(tǒng)跟分布式系統(tǒng)是完全相反的兩個(gè)概念。集中式系統(tǒng)就是把所有的程序、功能都集中到一臺(tái)主機(jī)上,從而往外提供服務(wù)的方式。
集中式系統(tǒng)最容易理解了。比如,我們主機(jī)的PC電腦,或者手機(jī),我們把各種軟件都安裝在一臺(tái)機(jī)子上,當(dāng)我需要什么功能,我就從這臺(tái)機(jī)子上去獲取。再比如,我們?cè)趯W(xué)生時(shí)代做的課程設(shè)計(jì)或者開(kāi)發(fā)時(shí)的小應(yīng)用,我們把Web服務(wù)器、數(shù)據(jù)庫(kù)等都會(huì)安裝到一臺(tái)電腦上。好處是,易于理解、方便維護(hù),想要的東西我都放到了一個(gè)地方,東西好找啊。當(dāng)然弊端也是顯而易見(jiàn)的,如果這臺(tái)機(jī)子崩了,或者硬盤壞了,那相當(dāng)與整個(gè)系統(tǒng)就奔潰了,而且如果備份也是在這個(gè)硬盤上,那相當(dāng)于招了滅頂之災(zāi)。
所以巴菲特有個(gè)關(guān)于投資的名言,就是“不要把雞蛋放在一個(gè)籃子里”。對(duì)于系統(tǒng)而言也是如此。廠商的機(jī)子不可能永遠(yuǎn)保證永遠(yuǎn)不壞,我們也無(wú)法保證黑客不會(huì)來(lái)對(duì)我們的系統(tǒng)搞基,最為關(guān)鍵的是,我們自己無(wú)法保證自己的程序不會(huì)出bug。所以問(wèn)題無(wú)法避免,錯(cuò)誤也不可避免。我們只能雞蛋分散到不同的籃子里,來(lái)減輕一鍋端的風(fēng)險(xiǎn)。這就是為什么需要分布式系統(tǒng)的原因。
使用分布式系統(tǒng)的另外一個(gè)理由是可擴(kuò)展性。畢竟任何主機(jī)(哪怕是小型機(jī)、超級(jí)計(jì)算機(jī))都會(huì)有性能的極限。而分布式系統(tǒng)可以通過(guò)不斷擴(kuò)張主機(jī)的數(shù)量以實(shí)現(xiàn)橫向水平性能的擴(kuò)展。大家也都了解到 Google 的服務(wù)器主機(jī),大多是淘汰的二線機(jī)子拼湊的吧。
毫無(wú)疑問(wèn),分布式系統(tǒng)對(duì)于集中式系統(tǒng)而言,在實(shí)現(xiàn)上會(huì)更加復(fù)雜。分布式系統(tǒng)將會(huì)是更難理解、設(shè)計(jì)、構(gòu)建 和管理的,同時(shí)意味著應(yīng)用程序的根源問(wèn)題更難發(fā)現(xiàn)。
設(shè)計(jì)分布式系統(tǒng)時(shí),經(jīng)常需要考慮如下的挑戰(zhàn):
異構(gòu)性:分布式系統(tǒng)由于基于不同的網(wǎng)絡(luò)、操作系統(tǒng)、計(jì)算機(jī)硬件和編程語(yǔ)言來(lái)構(gòu)造,必須要考慮一種通用的網(wǎng)絡(luò)通信協(xié)議來(lái)屏蔽異構(gòu)系統(tǒng)之間的差異。一般交由中間件來(lái)處理這些差異。缺乏全球時(shí)鐘:在程序需要協(xié)作時(shí),它們通過(guò)交換消息來(lái)協(xié)調(diào)它們的動(dòng)作。緊密的協(xié)調(diào)經(jīng)常依賴于對(duì)程序動(dòng)作發(fā)生時(shí)間的共識(shí),但是,實(shí)際上網(wǎng)絡(luò)上計(jì)算機(jī)同步時(shí)鐘的準(zhǔn)確性受到極大的限制,即沒(méi)有一個(gè)正確時(shí)間的全局概念。這是通過(guò)網(wǎng)絡(luò)發(fā)送消息作為唯一的通信方式這一事實(shí)帶來(lái)的直接結(jié)果。一致性:數(shù)據(jù)被分散或者復(fù)制到不同的機(jī)器上,如何保證各臺(tái)主機(jī)之間的數(shù)據(jù)的一致性將成為一個(gè)難點(diǎn)。故障的獨(dú)立性:任何計(jì)算機(jī)都有可能故障,且各種故障不盡相同。他們之間出現(xiàn)故障的時(shí)機(jī)也是相互獨(dú)立的。一般分布式系統(tǒng)要設(shè)計(jì)成被允許出現(xiàn)部分故障而不影響整個(gè)系統(tǒng)的正常使用。并發(fā):分布式系統(tǒng)的目的,是為了更好的共享資源。那么系統(tǒng)中的每個(gè)資源都必須被設(shè)計(jì)成在并發(fā)環(huán)境中是安全的。透明性:分布式系統(tǒng)中任何組件的故障、或者主機(jī)的升級(jí)、遷移對(duì)于用戶來(lái)說(shuō)都是透明的,不可見(jiàn)的。開(kāi)放性:分布式系統(tǒng)由不同的程序員來(lái)編寫不同的組件,組件最終要集成成為一個(gè)系統(tǒng),那么組件所發(fā)布的接口必須遵守一定的規(guī)范且能夠被互相理解。安全性:加密用于給共享資源提供適當(dāng)?shù)谋Wo(hù),在網(wǎng)絡(luò)上所有傳遞的敏感信息,都需要進(jìn)行加密。拒絕服務(wù)攻擊仍然是一個(gè)有待解決的問(wèn)題。可擴(kuò)展性:系統(tǒng)要設(shè)計(jì)成隨著業(yè)務(wù)量的增加,相應(yīng)的系統(tǒng)也必須要能擴(kuò)展來(lái)提供對(duì)應(yīng)的服務(wù)。設(shè)計(jì)分布式系統(tǒng)的本質(zhì)就是“如何合理將一個(gè)系統(tǒng)拆分成多個(gè)子系統(tǒng)部署到不同機(jī)器上”。所以首要考慮的問(wèn)題是如何合理的將系統(tǒng)進(jìn)行拆分。由于拆分后的各個(gè)子系統(tǒng)不可能孤立的存在,必然是通過(guò)網(wǎng)絡(luò)進(jìn)行連接交互,所以它們之間如何通信變得尤為重要。當(dāng)然在通信過(guò)程要識(shí)別“敵我”,防止信息在傳遞過(guò)程中被攔截和竄改,這就涉及到安全問(wèn)題了。分布式系統(tǒng)要適應(yīng)不斷增長(zhǎng)的業(yè)務(wù)需求,那么就需要考慮其擴(kuò)展性。分布式系統(tǒng)還必須要保證可靠性和數(shù)據(jù)的一致性。
概況起來(lái),在設(shè)計(jì)分布式系統(tǒng)時(shí),應(yīng)考慮以下幾個(gè)問(wèn)題:
系統(tǒng)如何拆分為子系統(tǒng)?如何規(guī)劃子系統(tǒng)間的通信?通信過(guò)程中的安全如何考慮?如何讓子系統(tǒng)可以擴(kuò)展?子系統(tǒng)的可靠性如何保證?數(shù)據(jù)的一致性是如何實(shí)現(xiàn)的?實(shí)際上,上面的每一個(gè)問(wèn)題都不是簡(jiǎn)單的問(wèn)題。還好,我們要感謝開(kāi)源,讓這個(gè)時(shí)代的技術(shù)可以共享,讓實(shí)現(xiàn)復(fù)雜系統(tǒng)的成本越來(lái)越低。比如,我們?cè)谠O(shè)計(jì)通信時(shí),我們可以采用面向消息的中間件,比如Apache ActiveMQ、RabbitMQ、Apache RocketMQ、Apache Kafka等,也有類似與 Google PRotocol Buffer、Thrift等 RPC框架。在設(shè)計(jì)分布式計(jì)算時(shí),我們分布式計(jì)算可以采用 MapReduce、Apache Hadoop、Apache Spark 等。在大數(shù)據(jù)和分布式存儲(chǔ)方面,我們可以選擇 Apache Hbase、Apache Cassandra、Memcached、Redis、MongoDB等。在分布式監(jiān)控方面,常用的技術(shù)包括Nagios、Zabbix、Consul、ZooKeeper等。
當(dāng)然,本文也只是拋磚引玉,不可能面面俱到。望各位讀者有不同的見(jiàn)解,歡迎討論。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注