日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

分布式系統(tǒng)概念原理以及應(yīng)用介紹 | 大數(shù)據(jù)百科 | 數(shù)據(jù)觀 | 中國(guó)大數(shù)據(jù)產(chǎn)業(yè)觀察

 qinjy2008 2016-04-07

分布式系統(tǒng)概念原理以及應(yīng)用介紹

來(lái)源:數(shù)據(jù)觀 時(shí)間:2016-03-25 16:42:36 作者:

分布式系統(tǒng)概念原理以及應(yīng)用介紹

  分布式系統(tǒng)是什么意思?分布式系統(tǒng)原理又是怎樣?分布式系統(tǒng)有哪些應(yīng)用?本文將詳細(xì)解釋。

  分布式系統(tǒng)

  分布式系統(tǒng)(distributed system)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。正是因?yàn)檐浖奶匦?,所以分布式系統(tǒng)具有高度的內(nèi)聚性和透明性。因此,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng)),而不是硬件。內(nèi)聚性是指每一個(gè)數(shù)據(jù)庫(kù)分布節(jié)點(diǎn)高度自治,有本地的數(shù)據(jù)庫(kù)管理系統(tǒng)。透明性是指每一個(gè)數(shù)據(jù)庫(kù)分布節(jié)點(diǎn)對(duì)用戶的應(yīng)用來(lái)說(shuō)都是透明的,看不出是本地還是遠(yuǎn)程。在分布式數(shù)據(jù)庫(kù)系統(tǒng)中,用戶感覺(jué)不到數(shù)據(jù)是分布的,即用戶不須知道關(guān)系是否分割、有無(wú)副本、數(shù)據(jù)存于哪個(gè)站點(diǎn)以及事務(wù)在哪個(gè)站點(diǎn)上執(zhí)行等。

  分布式系統(tǒng)概念

  在一個(gè)分布式系統(tǒng)中,一組獨(dú)立的計(jì)算機(jī)展現(xiàn)給用戶的是一個(gè)統(tǒng)一的整體,就好像是一個(gè)系統(tǒng)似的。系統(tǒng)擁有多種通用的物理和邏輯資源,可以動(dòng)態(tài)的分配任務(wù),分散的物理和邏輯資源通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)信息交換。系統(tǒng)中存在一個(gè)以全局的方式管理計(jì)算機(jī)資源的分布式操作系統(tǒng)。通常,對(duì)用戶來(lái)說(shuō),分布式系統(tǒng)只有一個(gè)模型或范型。在操作系統(tǒng)之上有一層軟件中間件(middleware)負(fù)責(zé)實(shí)現(xiàn)這個(gè)模型。一個(gè)著名的分布式系統(tǒng)的例子是萬(wàn)維網(wǎng)(World Wide Web),在萬(wàn)維網(wǎng)中,所有的一切看起來(lái)就好像是一個(gè)文檔(Web頁(yè)面)一樣。

  在計(jì)算機(jī)網(wǎng)絡(luò)中,這種統(tǒng)一性、模型以及其中的軟件都不存在。用戶看到的是實(shí)際的機(jī)器,計(jì)算機(jī)網(wǎng)絡(luò)并沒(méi)有使這些機(jī)器看起來(lái)是統(tǒng)一的。如果這些機(jī)器有不同的硬件或者不同的操作系統(tǒng),那么,這些差異對(duì)于用戶來(lái)說(shuō)都是完全可見(jiàn)的。如果一個(gè)用戶希望在一臺(tái)遠(yuǎn)程機(jī)器上運(yùn)行一個(gè)程序,那么,他必須登陸到遠(yuǎn)程機(jī)器上,然后在那臺(tái)機(jī)器上運(yùn)行該程序。

  分布式系統(tǒng)和計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)的共同點(diǎn)是:多數(shù)分布式系統(tǒng)是建立在計(jì)算機(jī)網(wǎng)絡(luò)之上的,所以分布式系統(tǒng)與計(jì)算機(jī)網(wǎng)絡(luò)在物理結(jié)構(gòu)上是基本相同的。

  他們的區(qū)別在于:分布式操作系統(tǒng)的設(shè)計(jì)思想和網(wǎng)絡(luò)操作系統(tǒng)是不同的,這決定了他們?cè)诮Y(jié)構(gòu)、工作方式和功能上也不同。網(wǎng)絡(luò)操作系統(tǒng)要求網(wǎng)絡(luò)用戶在使用網(wǎng)絡(luò)資源時(shí)首先必須了解網(wǎng)絡(luò)資源,網(wǎng)絡(luò)用戶必須知道網(wǎng)絡(luò)中各個(gè)計(jì)算機(jī)的功能與配置、軟件資源、網(wǎng)絡(luò)文件結(jié)構(gòu)等情況,在網(wǎng)絡(luò)中如果用戶要讀一個(gè)共享文件時(shí),用戶必須知道這個(gè)文件放在哪一臺(tái)計(jì)算機(jī)的哪一個(gè)目錄下;分布式操作系統(tǒng)是以全局方式管理系統(tǒng)資源的,它可以為用戶任意調(diào)度網(wǎng)絡(luò)資源,并且調(diào)度過(guò)程是“透明”的。當(dāng)用戶提交一個(gè)作業(yè)時(shí),分布式操作系統(tǒng)能夠根據(jù)需要在系統(tǒng)中選擇最合適的處理器,將用戶的作業(yè)提交到該處理程序,在處理器完成作業(yè)后,將結(jié)果傳給用戶。在這個(gè)過(guò)程中,用戶并不會(huì)意識(shí)到有多個(gè)處理器的存在,這個(gè)系統(tǒng)就像是一個(gè)處理器一樣。

  專業(yè)測(cè)評(píng)

    分布式軟件系統(tǒng)(Distributed Software Systems)是支持分布式處理的軟件系統(tǒng),是在由通信網(wǎng)絡(luò)互聯(lián)的多處理機(jī)體系結(jié)構(gòu)上執(zhí)行任務(wù)的系統(tǒng)。它包括分布式操作系統(tǒng)、分布式程序設(shè)計(jì)語(yǔ)言及其編譯(解釋)系統(tǒng)、分布式文件系統(tǒng)和分布式數(shù)據(jù)庫(kù)系統(tǒng)等。

  分布式操作系統(tǒng)

  負(fù)責(zé)管理分布式處理系統(tǒng)資源和控制分布式程序運(yùn)行。它和集中式操作系統(tǒng)的區(qū)別在于資源管理、進(jìn)程通信和系統(tǒng)結(jié)構(gòu)等方面。

  分布式程序設(shè)計(jì)語(yǔ)言用于編寫運(yùn)行于分布式計(jì)算機(jī)系統(tǒng)上的分布式程序。一個(gè)分布式程序由若干個(gè)可以獨(dú)立執(zhí)行的程序模塊組成,它們分布于一個(gè)分布式處理系統(tǒng)的多臺(tái)計(jì)算機(jī)上被同時(shí)執(zhí)行。它與集中式的程序設(shè)計(jì)語(yǔ)言相比有三個(gè)特點(diǎn):分布性、通信性和穩(wěn)健性。

  分布式文件系統(tǒng)

  具有執(zhí)行遠(yuǎn)程文件存取的能力,并以透明方式對(duì)分布在網(wǎng)絡(luò)上的文件進(jìn)行管理和存取。

  分布式數(shù)據(jù)庫(kù)系統(tǒng)

  由分布于多個(gè)計(jì)算機(jī)結(jié)點(diǎn)上的若干個(gè)數(shù)據(jù)庫(kù)系統(tǒng)組成,它提供有效的存取手段來(lái)操縱這些結(jié)點(diǎn)上的子數(shù)據(jù)庫(kù)。分布式數(shù)據(jù)庫(kù)在使用上可視為一個(gè)完整的數(shù)據(jù)庫(kù),而實(shí)際上它是分布在地理分散的各個(gè)結(jié)點(diǎn)上。當(dāng)然,分布在各個(gè)結(jié)點(diǎn)上的子數(shù)據(jù)庫(kù)在邏輯上是相關(guān)的。

  分布式郵件系統(tǒng)

  分布式郵件系統(tǒng)的部署設(shè)計(jì),即同一域名下,跨地域部署的郵件系統(tǒng)。適用 于在各地設(shè)有分部的政府機(jī)構(gòu)或者大型集團(tuán),有效管理各地的人員結(jié)構(gòu),同時(shí)提高了郵件服務(wù)器應(yīng)用效率。[1] 分布式郵件系統(tǒng)由多個(gè)數(shù)據(jù)中心組成,大量分支機(jī)構(gòu)或較小的分散站點(diǎn)與數(shù)據(jù)中心的連接。分支機(jī)構(gòu)需要建立自己的郵件服務(wù)器,來(lái)加快處理當(dāng)?shù)胤种C(jī)構(gòu)的郵件。承載相應(yīng)的數(shù)據(jù)處理量。以提高郵件處理能力,郵件收發(fā)速度,郵件功能模塊化。

 

在了解了分布式系統(tǒng)的基本概念之后,我們來(lái)看看分布式系統(tǒng)的原理是怎樣的?

    在了解了分布式系統(tǒng)的基本概念之后,我們來(lái)看看分布式系統(tǒng)的原理是怎樣的?

    【分布式系統(tǒng)原理】

    分布式系統(tǒng)基礎(chǔ)要點(diǎn)

    對(duì)外提供無(wú)狀態(tài)節(jié)點(diǎn),內(nèi)部實(shí)現(xiàn)具體有狀態(tài)或者無(wú)狀態(tài)節(jié)點(diǎn)邏輯,節(jié)點(diǎn)即可以是提供服務(wù),也可以是存儲(chǔ)數(shù)據(jù)。

    拜占庭問(wèn)題,在分布式系統(tǒng)中的使用,目的是保證服務(wù)可用,而不是找出錯(cuò)誤的節(jié)點(diǎn),如果。

    異常常見(jiàn)情況,機(jī)器宕機(jī)、網(wǎng)絡(luò)異常、消息丟失、消息亂序、數(shù)據(jù)錯(cuò)誤、不可靠的TCP??赡苁鞘盏较⒑箦礄C(jī)、也可能是處理完成以后機(jī)器宕機(jī)、處理完成任務(wù)后發(fā)送確認(rèn)消息是網(wǎng)絡(luò)異常。也有可能是發(fā)出去的消息丟失,或者發(fā)送確認(rèn)消息時(shí)丟失??赡芟劝l(fā)送出去的數(shù)據(jù)后收到

    分布式狀態(tài)、成功、失敗、超時(shí)。超時(shí)的情況,不能判斷是否成功,原有同上。

    數(shù)據(jù)存儲(chǔ)在機(jī)械硬盤上,隨時(shí)有可能發(fā)生異常,導(dǎo)致數(shù)據(jù)沒(méi)有能正確存儲(chǔ)。

    無(wú)法歸類的異常,比如,系統(tǒng)的處理能力時(shí)高、時(shí)低,的詭異行為。

    即使是小概率事件,在每天百萬(wàn)、千萬(wàn)、及以上的運(yùn)算量時(shí)也會(huì)上升為大概率事件。

    副本提高數(shù)據(jù)的冗余,提高系統(tǒng)的可用性,但是在使用副本代來(lái)好處的同時(shí),也導(dǎo)致維護(hù)副本需要成本。如副本的一致性,多個(gè)副本一致性,多個(gè)副本直接可能到不一致。

    一致性級(jí)別:強(qiáng)一致性、單調(diào)一致性,讀取最新數(shù)據(jù)、會(huì)話一致性,通過(guò)版本讀取統(tǒng)一值。最終一致性、弱一致性。

    分布式系統(tǒng)性能指標(biāo):吞吐量、響應(yīng)延遲、并發(fā)量;常用單位QPS,即每秒鐘的處理能力。高吞吐量會(huì)帶來(lái)低響應(yīng)、他們之間是相互制約關(guān)系。

    可用性指標(biāo):可以服務(wù)時(shí)間和非服務(wù)時(shí)間的比率和請(qǐng)求的成功和失敗次數(shù)來(lái)衡量。

    可擴(kuò)展性指標(biāo):實(shí)現(xiàn)能水平擴(kuò)展,增加低配置的機(jī)器即可以實(shí)現(xiàn)更大的運(yùn)算量,和更高的處理能力。

    一致性指標(biāo):實(shí)現(xiàn)副本間的一致性能力,一致性需要嚴(yán)格考量是否業(yè)務(wù)允許。

    二、分布式系統(tǒng)原理:

    1.哈希方式,把不同的值進(jìn)行哈希運(yùn)算,映射到,不同的機(jī)器或者節(jié)點(diǎn)??紤]冗余的時(shí)候可以把多個(gè)哈希值映射到同一個(gè)地方。哈希的實(shí)現(xiàn)方式,取余。其實(shí)現(xiàn)擴(kuò)展時(shí),比較困難,數(shù)據(jù)分散在很多機(jī)器上,擴(kuò)展的時(shí)候要從個(gè)機(jī)器上獲取數(shù)據(jù)。而且容易出現(xiàn)分布不均有的情況。

    常見(jiàn)的哈希,用IP、URL、ID、或者固定的值進(jìn)行哈希,總是得到相同的結(jié)果。

    2.按數(shù)據(jù)范圍分布,比如ID在1~20的在機(jī)器A上,ID在21~40的在機(jī)器B上,ID在40~60的在機(jī)器C上實(shí)現(xiàn),ID在60~100的分布在機(jī)器D上,數(shù)據(jù)分布比較均勻。如果某個(gè)節(jié)點(diǎn)處理能力有限,可以直接分裂該節(jié)點(diǎn)。維護(hù)數(shù)據(jù)分布的元信息,可能出現(xiàn)單點(diǎn)瓶頸。幾千機(jī)器,每個(gè)機(jī)器又劃分為N個(gè)范圍,導(dǎo)致需要維護(hù)的數(shù)據(jù)分布范圍元數(shù)據(jù)過(guò)大,導(dǎo)致可能需要幾臺(tái)機(jī)器實(shí)現(xiàn)。

    一定要嚴(yán)格控制元數(shù)據(jù)量,進(jìn)可能的減少元數(shù)據(jù)的存儲(chǔ)。

    3.按數(shù)據(jù)量分布,另一類常用的數(shù)據(jù)分布方式則是按照數(shù)據(jù)量分布數(shù)據(jù)。與哈希方式和按數(shù)據(jù)范圍方式不同,數(shù)據(jù)量分布數(shù)據(jù)與具體的數(shù)據(jù)特征無(wú)關(guān),而是將數(shù)據(jù)視為一個(gè)順序增長(zhǎng)的文件,并將這個(gè)文件按照某一較為固定的大小劃分為若干數(shù)據(jù)塊(chunk),不同的數(shù)據(jù)塊分布到不同的服務(wù)器上。與按數(shù)據(jù)范圍分布數(shù)據(jù)的方式類似的是,按數(shù)據(jù)量分布數(shù)據(jù)也需要記錄數(shù)據(jù)塊的具體分布情況,并將該分布信息作為元數(shù)據(jù)使用元數(shù)據(jù)服務(wù)器管理。

    由于與具體的數(shù)據(jù)內(nèi)容無(wú)關(guān),按數(shù)據(jù)量分布數(shù)據(jù)的方式一般沒(méi)有數(shù)據(jù)傾斜的問(wèn)題,數(shù)據(jù)總是被均勻切分并分布到集群中。當(dāng)集群需要重新負(fù)載均衡時(shí),只需通過(guò)遷移數(shù)據(jù)塊即可完成。集群擴(kuò)容也沒(méi)有太大的限制,只需將部分?jǐn)?shù)據(jù)庫(kù)遷移到新加入的機(jī)器上即可以完成擴(kuò)容。按數(shù)據(jù)量劃分?jǐn)?shù)據(jù)的缺點(diǎn)是需要管理較為復(fù)雜的元信息,與按范圍分布數(shù)據(jù)的方式類似,當(dāng)集群規(guī)模較大時(shí),元信息的數(shù)據(jù)量也變得很大,高效的管理元信息成為新的課題。

    4.一致性哈希,構(gòu)造哈希環(huán),有哈希域[0,10],則構(gòu)造3個(gè)部分,[1,4)/[4,9)/[9,10),[0,1)/分成了3個(gè)部分,這3部分是一個(gè)環(huán)狀,增加機(jī)器時(shí),變動(dòng)的是其附近的節(jié)點(diǎn),分擔(dān)的是附近節(jié)點(diǎn)的壓力,其元數(shù)據(jù)的維護(hù)和按數(shù)據(jù)量分布一樣。其未來(lái)的擴(kuò)展,可以實(shí)現(xiàn)多個(gè)需節(jié)點(diǎn)。

    5. 構(gòu)建映射元數(shù)據(jù),建立映射表的方式。

    6. 副本與數(shù)據(jù)分布,把一個(gè)數(shù)據(jù)副本分散到多臺(tái)服務(wù)器上。比如應(yīng)用A的數(shù)據(jù),存儲(chǔ)在A、B、C ,3臺(tái)機(jī)器上,如果3臺(tái)機(jī)器中,其中一臺(tái)出現(xiàn)問(wèn)題,請(qǐng)求被處理到其他2臺(tái)機(jī)器上,如果加機(jī)器恢復(fù),還需要從另外2臺(tái)機(jī)器上,Copy數(shù)據(jù),又增加了這2臺(tái)機(jī)器的負(fù)擔(dān)。如果我們有應(yīng)用A和應(yīng)用B,各自有3臺(tái)機(jī)器,那么我們可以把A應(yīng)用分散在6臺(tái)機(jī)器上,B應(yīng)用也分散在6臺(tái)機(jī)器上,可以實(shí)現(xiàn)相同的數(shù)據(jù)備份,但是應(yīng)用存儲(chǔ)的數(shù)據(jù)被分散了。某臺(tái)機(jī)器損害,只是把該機(jī)器所承擔(dān)的負(fù)載平均分配到了,另外5臺(tái)機(jī)器上?;謴?fù)數(shù)據(jù)從5臺(tái)機(jī)器恢復(fù),其速度快和給各臺(tái)服務(wù)器的壓力都不大,而且可以實(shí)現(xiàn)機(jī)器損害,更換完全不影響應(yīng)用。

    其原理是多個(gè)機(jī)器互為副本,是比較理想的實(shí)現(xiàn)負(fù)載分壓的方式。

    7.分布式計(jì)算思想,移動(dòng)數(shù)據(jù)不如移動(dòng)計(jì)算,就進(jìn)計(jì)算原則,減少跨進(jìn)程、跨網(wǎng)絡(luò)、等跨度較大的實(shí)現(xiàn),把計(jì)算所需的資源盡可能的靠近。因?yàn)榭赡艹霈F(xiàn)網(wǎng)絡(luò)、遠(yuǎn)程機(jī)器的瓶頸。

    8. 常見(jiàn)分布式系統(tǒng)數(shù)據(jù)分布方式: GFS、HDFS:按數(shù)據(jù)量分布;Map reduce 按GFS的數(shù)據(jù)分布做本地化;BigTable、HBase按數(shù)據(jù)范圍分布;Pnuts按哈希方式或者數(shù)據(jù)范圍分布,可以選擇;Dynamo、Cassndra按一致性哈希;Mola、Armor、BigPipe按哈希方式分布;Doris按哈希方式和按數(shù)據(jù)量分布組合。

    三、數(shù)據(jù)副本協(xié)議

    1. 副本一定要滿足一定的可用性和一致性要求、具體容錯(cuò)能力,即使出現(xiàn)一些問(wèn)題也能提供可靠服務(wù)。

    2. 數(shù)據(jù)副本的基本協(xié)議,中心化和去中心化2種基本的副本控制協(xié)議。

    3.中心化副本控制協(xié)議的基本思路是由一個(gè)中心節(jié)點(diǎn)協(xié)調(diào)副本數(shù)據(jù)的更新、維護(hù)副本之間的一致性。中心化副本控制協(xié)議的優(yōu)點(diǎn)是協(xié)議相對(duì)較為簡(jiǎn)單,所有的副本相關(guān)的控制交由中心節(jié)點(diǎn)完成。并發(fā)控制將由中心節(jié)點(diǎn)完成,從而使得一個(gè)分布式并發(fā)控制問(wèn)題,簡(jiǎn)化為一個(gè)單機(jī)并發(fā)控制問(wèn)題??刂茊?wèn)題,簡(jiǎn)化為一個(gè)單機(jī)并發(fā)控制問(wèn)題。所謂并發(fā)控制,即多個(gè)節(jié)點(diǎn)同時(shí)需要修改副本數(shù)據(jù)時(shí),需要解決“寫寫”、“讀寫”等并發(fā)沖突。單機(jī)系統(tǒng)上常用加鎖等方式進(jìn)行并發(fā)控制。對(duì)于分布式并發(fā)控制,加鎖也是一個(gè)常用的方法,但如果沒(méi)有中心節(jié)點(diǎn)統(tǒng)一進(jìn)行鎖管理,就需要完全分布式化的鎖系統(tǒng),會(huì)使得協(xié)議非常復(fù)雜。中心化副本控制協(xié)議的缺點(diǎn)是系統(tǒng)的可用性依賴于中心化節(jié)點(diǎn),當(dāng)中心節(jié)點(diǎn)異?;蚺c中心節(jié)點(diǎn)通信中斷時(shí),系統(tǒng)將失去某些服務(wù)(通常至少失去更新服務(wù)),所以中心化副本控制協(xié)議的缺點(diǎn)正是存在一定的停服務(wù)時(shí)間。即存在單點(diǎn)問(wèn)題,即使中心化節(jié)點(diǎn)是一個(gè)集群,也只不過(guò)是一個(gè)大的單點(diǎn)。

    4.副本數(shù)據(jù)同步常見(jiàn)問(wèn)題,1)網(wǎng)絡(luò)異常,導(dǎo)致副本沒(méi)有得到數(shù)據(jù);2)數(shù)據(jù)臟讀,主節(jié)點(diǎn)數(shù)據(jù)已經(jīng)更新,但是由于某種原因,沒(méi)有得到最新數(shù)據(jù);3)增加新節(jié)點(diǎn)沒(méi)有得到主節(jié)點(diǎn)數(shù)據(jù),而讀數(shù)據(jù)時(shí)從新節(jié)點(diǎn)讀數(shù)據(jù)導(dǎo)致,沒(méi)有得到數(shù)據(jù)。

    5.去中心化副本控制協(xié)議沒(méi)有中心節(jié)點(diǎn),協(xié)議中所有的節(jié)點(diǎn)都是完全對(duì)等的,節(jié)點(diǎn)之間通過(guò)平等協(xié)商達(dá)到一致。從而去中心化協(xié)議沒(méi)有因?yàn)橹行幕?jié)點(diǎn)異常而帶來(lái)的停服務(wù)等問(wèn)題。然而,沒(méi)有什么事情是完美的,去中心化協(xié)議的最大的缺點(diǎn)是協(xié)議過(guò)程通常比較復(fù)雜。尤其當(dāng)去中心化協(xié)議需要實(shí)現(xiàn)強(qiáng)一致性時(shí),協(xié)議流程變得復(fù)雜且不容易理解。由于流程的復(fù)雜,去中心化協(xié)議的效率和性能較低。

    6. Paxos是唯一在工程中得到應(yīng)用的強(qiáng)一致性去中心化副本控制協(xié)議。ZooKeeper、Chubby,就是該協(xié)議的應(yīng)用。

    Zookeeper用Paxos協(xié)議選擇Leader,用Lease協(xié)議控制數(shù)據(jù)是否有效。用Quorum協(xié)議把Leader的數(shù)據(jù)同步到follow。

    Zeekeeper,實(shí)現(xiàn)Quorum寫入時(shí),如果沒(méi)有完全寫入成功,則所有的follow機(jī)器,反向向Leader寫數(shù)據(jù),寫入數(shù)據(jù)后follow又向Leader同步數(shù)據(jù),保持一致,如果是失敗的數(shù)據(jù)先寫入,你們follow同步到原來(lái)的數(shù)據(jù),相對(duì)于回滾;如是是最新的數(shù)據(jù)先寫入Leader則就是完成了最新數(shù)據(jù)的更新。

    7. Megastore,使用的是改進(jìn)型行Paxos協(xié)議。

    8. Dynamo / Cassandra使用基于一致性哈希的去中心化協(xié)議。Dynamo使用Quorum機(jī)制來(lái)管理副本。

    9. Lease機(jī)制是最重要的分布式協(xié)議,廣泛應(yīng)用于各種實(shí)際的分布式系統(tǒng)中。1)Lease通常定義為:頒發(fā)者在一定期限內(nèi)給予持有者一定權(quán)利的協(xié)議。2)Lease 表達(dá)了頒發(fā)者在一定期限內(nèi)的承諾,只要未過(guò)期頒發(fā)者必須嚴(yán)格遵守 lease 約定的承諾;3)Lease 的持有者在期限內(nèi)使用頒發(fā)者的承諾,但 lease 一旦過(guò)期必須放棄使用或者重新和頒發(fā)者續(xù)約。4)的影響。中心服務(wù)器發(fā)出的lease的含義為:在lease的有效期內(nèi),中心服務(wù)器保證不會(huì)修改對(duì)應(yīng)數(shù)據(jù)的值。5)可以通過(guò)版本號(hào)、過(guò)多上時(shí)間、或者到某個(gè)固定時(shí)間點(diǎn)認(rèn)為L(zhǎng)ease證書失效。

    其原理和我們的Cache一樣,比如瀏覽器緩存道理一致。其要求時(shí)間時(shí)鐘同步,因?yàn)閿?shù)據(jù)完全依賴于期限。

    10. 心跳(heartbeat)檢測(cè)不可靠,假如檢測(cè)及其Q,被檢測(cè)機(jī)器A,可能由于Q發(fā)起檢測(cè),但是A的回應(yīng)被阻塞,導(dǎo)致Q 認(rèn)為A宕機(jī),阻塞很快恢復(fù),導(dǎo)致根據(jù)心跳檢測(cè)來(lái)做判斷不可靠;也可能是他們之間的網(wǎng)絡(luò)斷開(kāi);也可能是Q機(jī)器本身異常導(dǎo)致認(rèn)為A機(jī)器宕機(jī);如果根據(jù)Q的檢測(cè)結(jié)果,來(lái)判斷很可能出現(xiàn)多個(gè)主機(jī)的情況。

    11. Write-all-read-one(簡(jiǎn)稱WARO)是一種最簡(jiǎn)單的副本控制規(guī)則,顧名思義即在更新時(shí)寫所有的副本,只有在所有的副本上更新成功,才認(rèn)為更新成功,從而保證所有的副本一致,這樣在讀取數(shù)據(jù)時(shí)可以讀任一副本上的數(shù)據(jù)。寫多份,讀從其中一份讀取。

    12. quorum協(xié)議,其實(shí)就是讀取成功的副本數(shù)大于失敗的副本數(shù),你們讀取的副本里面一定包含了最新的副本。

    13. Mola*和Armor*系統(tǒng)中所有的副本管理都是基于Quorum,即數(shù)據(jù)在多數(shù)副本上更新成功則認(rèn)為成功。

    14. Big Pipe*中的副本管理也是采用了WARO機(jī)制。

    四、日志技術(shù)

    1.日志技術(shù)是宕機(jī)恢復(fù)的主要技術(shù)之一。日志技術(shù)最初使用在數(shù)據(jù)庫(kù)系統(tǒng)中。嚴(yán)格來(lái)說(shuō)日志技術(shù)不是一種分布式系統(tǒng)的技術(shù),但在分布式系統(tǒng)的實(shí)踐中,卻廣泛使用了日志技術(shù)做宕機(jī)恢復(fù),甚至如BigTable等系統(tǒng)將日志保存到一個(gè)分布式系統(tǒng)中進(jìn)一步增強(qiáng)了系統(tǒng)容錯(cuò)能力。

    2. 兩種比較實(shí)用的日志技術(shù)Redo Log與No Redo/No undo Log。

    3. 數(shù)據(jù)庫(kù)的日志主要分為Undo Log、Redo Log、Redo/Undo Log與No Redo/No Undo Log。這四類日志的區(qū)別在更新日志文件和數(shù)據(jù)文件的時(shí)間點(diǎn)要求不同,從而造成性能和效率也不相同。

    4. 本節(jié)介紹另一種特殊的日志技術(shù)“No Undo/No Redo log”,這種技術(shù)也稱之為“0/1目錄”(0/1 directory)。還有一個(gè)主記錄,記錄當(dāng)前工作目錄,比如老數(shù)據(jù)在0目錄下,新數(shù)據(jù)在1目錄下,我們?cè)L問(wèn)數(shù)據(jù)時(shí),通過(guò)主紀(jì)錄,記錄當(dāng)前是工作在那個(gè)目錄下,如果是工作在目錄0下,取目錄0數(shù)據(jù),反之取1目錄數(shù)據(jù)。

    5. MySQL的主從庫(kù)設(shè)計(jì)也是基于日志。從庫(kù)只需通過(guò)回放主庫(kù)的日志,就可以實(shí)現(xiàn)與主庫(kù)的同步。由于從庫(kù)同步的速度與主庫(kù)更新的速度沒(méi)有強(qiáng)約束,這種方式只能實(shí)現(xiàn)最終一致性。

    6. 在單機(jī)上,事務(wù)靠日志技術(shù)或MVCC等技術(shù)實(shí)現(xiàn)。

    7.兩階段提交的思路比較簡(jiǎn)單,在第一階段,協(xié)調(diào)者詢問(wèn)所有的參與者是否可以提交事務(wù)(請(qǐng)參與者投票),所有參與者向協(xié)調(diào)者投票。在第二階段,協(xié)調(diào)者根據(jù)所有參與者的投票結(jié)果做出是否事務(wù)可以全局提交的決定,并通知所有的參與者執(zhí)行該決定。在一個(gè)兩階段提交流程中,參與者不能改變自己的投票結(jié)果。兩階段提交協(xié)議的可以全局提交的前提是所有的參與者都同意提交事務(wù),只要有一個(gè)參與者投票選擇放棄(abort)事務(wù),則事務(wù)必須被放棄。可以這么認(rèn)為,兩階段提交協(xié)議對(duì)于這種超時(shí)的相關(guān)異常也沒(méi)有很好的容錯(cuò)機(jī)制,整個(gè)流程只能阻塞在這里,且對(duì)于參與者而言流程狀態(tài)處于未知,參與者即不能提交本地節(jié)點(diǎn)上的事務(wù),也不能放棄本地節(jié)點(diǎn)事務(wù)。

    8. 第一、兩階段提交協(xié)議的容錯(cuò)能力較差。

    9.第二、兩階段提交協(xié)議的性能較差。一次成功的兩階段提交協(xié)議流程中,協(xié)調(diào)者與每個(gè)參與者之間至少需要兩輪交互4個(gè)消息“prepare”、“vote-commit”、“global-commit”、“確認(rèn)global-commit”。過(guò)多的交互次數(shù)會(huì)降低性能。另一方面,協(xié)調(diào)者需要等待所有的參與者的投票結(jié)果,一旦存在較慢的參與者,會(huì)影響全局流程執(zhí)行速度。

    10.顧名思義,MVCC即多個(gè)不同版本的數(shù)據(jù)實(shí)現(xiàn)并發(fā)控制的技術(shù),其基本思想是為每次事務(wù)生成一個(gè)新版本的數(shù)據(jù),在讀數(shù)據(jù)時(shí)選擇不同版本的數(shù)據(jù)即可以實(shí)現(xiàn)對(duì)事務(wù)結(jié)果的完整性讀取。在使用MVCC時(shí),每個(gè)事務(wù)都是基于一個(gè)已生效的基礎(chǔ)版本進(jìn)行更新,事務(wù)可以并行進(jìn)行。其思想是根據(jù)版本號(hào),在多個(gè)節(jié)點(diǎn)取同一個(gè)版本號(hào)的數(shù)據(jù)。

    11. MVCC的流程過(guò)程非常類似于SVN等版本控制系統(tǒng)的流程,或者說(shuō)SVN等版本控制系統(tǒng)就是使用的MVCC思想。

    五、CAP理論

    CAP理論的定義很簡(jiǎn)單,CAP三個(gè)字母分別代表了分布式系統(tǒng)中三個(gè)相互矛盾的屬性:1)Consistency (一致性):CAP理論中的副本一致性特指強(qiáng)一致性(1.3.4 );

    2)Availiablity(可用性):指系統(tǒng)在出現(xiàn)異常時(shí)已經(jīng)可以提供服務(wù);

    3)Toleranceto the partition of network (分區(qū)容忍):指系統(tǒng)可以對(duì)網(wǎng)絡(luò)分區(qū),這

    種異常情況進(jìn)行容錯(cuò)處理。

    2.CAP理論指出:無(wú)法設(shè)計(jì)一種分布式協(xié)議,使得同時(shí)完全具備CAP三個(gè)屬性,即1)該種協(xié)議下的副本始終是強(qiáng)一致性,2)服務(wù)始終是可用的,3)協(xié)議可以容忍任何網(wǎng)絡(luò)分區(qū)異常;分布式系統(tǒng)協(xié)議只能在CAP這三者間所有折中。

    

分布式系統(tǒng)設(shè)計(jì)原理與方案

    在看完分布式系統(tǒng)的原理之后,相信你對(duì)分布式系統(tǒng)有了一定了解,如果你想更深入地研究分布式系統(tǒng),請(qǐng)看下面的內(nèi)容:分布式系統(tǒng)設(shè)計(jì)原理與方案

    【分布式系統(tǒng)設(shè)計(jì)原理與方案】

    一直在思考分布式系統(tǒng)設(shè)計(jì)的問(wèn)題,業(yè)務(wù)對(duì)象原封不動(dòng)的情況下部署在客戶端和服務(wù)器端,可以根據(jù)配置文件選擇是連接服務(wù)器還是連接本地的數(shù)據(jù)庫(kù),這個(gè)問(wèn)題讓我絞盡腦汁,我總是設(shè)想的客戶端與服務(wù)器端通信的方式是最低端的Socket?;藘蓚€(gè)晚上研究CSLA.NET框架關(guān)于數(shù)據(jù)門戶這塊代碼,才發(fā)現(xiàn)問(wèn)題的關(guān)鍵所在:客戶端與服務(wù)器端通信不能采用最低端的Socket,而要用高端的WebService、.NET Remoting或者是自己定義一種協(xié)議等,只要它們支持客戶端直接根據(jù)服務(wù)器端的服務(wù)URL、類名、方法名和方法參數(shù)四個(gè)信息就可以調(diào)用服務(wù)器對(duì)應(yīng)的類和方法就行。

    說(shuō)明:本文中所表達(dá)的思想與CSLA.NET有很大區(qū)別,不要看了本文就以為是CSLA.NET的設(shè)計(jì)思想,也不要以為本文錯(cuò)誤的解釋了CSLA.NET,這不是一篇介紹CSLA.NET的文章,但純思想上它們是相同的。

    分布式系統(tǒng)的部署

    平常我們都說(shuō)三層架構(gòu),我認(rèn)為它是一個(gè)廣義的模型,更多層的設(shè)計(jì)可以合并相鄰幾層的方式最終回歸到三層這個(gè)寬泛的概念上來(lái),我的意思是:這些都只是概念,忘記這些概念去實(shí)際分析設(shè)計(jì)會(huì)離這些概念更近一些。

    接下來(lái)我要把三層變的更簡(jiǎn)單點(diǎn),兩層,數(shù)據(jù)訪問(wèn)層合并到業(yè)務(wù)層,統(tǒng)稱為業(yè)務(wù)層,因?yàn)槲覀兠鎸?duì)的問(wèn)題不是分層的問(wèn)題,而是分布式系統(tǒng)中各層應(yīng)該怎么部署的問(wèn)題。在CSLA.NET書中也說(shuō)到業(yè)務(wù)層和數(shù)據(jù)訪問(wèn)層放到同一臺(tái)機(jī)器上可以提高性能和容錯(cuò)性。因此他們倆的合并不影響分布式系統(tǒng)的部署。

    不過(guò)要解釋的是數(shù)據(jù)庫(kù)系統(tǒng)(CSLA.NET中說(shuō)的數(shù)據(jù)存儲(chǔ)和管理層)并沒(méi)有考慮到三層中來(lái),也就是它不包含在數(shù)據(jù)訪問(wèn)層中,如果把它算進(jìn)來(lái),那么它是在數(shù)據(jù)訪問(wèn)層之下單獨(dú)存在的。

    綜上,在分布式系統(tǒng)部署角度考慮的分層實(shí)際是三層:界面層、業(yè)務(wù)層(包含數(shù)據(jù)訪問(wèn)層的業(yè)務(wù)層)、數(shù)據(jù)存儲(chǔ)層。

    下面舉例說(shuō)明可能的部署情景,帶陰影的框框表示一臺(tái)機(jī)器,虛線框表示根據(jù)使用場(chǎng)合可有可無(wú),虛橫線表示從此處劃開(kāi)單獨(dú)出服務(wù)器。在B/S應(yīng)用中,Web瀏覽器為客戶端,其他全部為服務(wù)器。在C/S應(yīng)用中,處在最上層的界面層業(yè)務(wù)層為客戶端,其他為服務(wù)器

    非分布式系統(tǒng)的部署

單機(jī)版-非分布式系統(tǒng)的部署

    單機(jī)版

兩三臺(tái)機(jī)器-非分布式系統(tǒng)的部署

    兩三臺(tái)機(jī)器

    分布式系統(tǒng)的部署

分布式的Web系統(tǒng)

    分布式的Web系統(tǒng)

分布式的C/S系統(tǒng)

    分布式的C/S系統(tǒng)

    有幾點(diǎn)要說(shuō)明:

    1. 客戶端上的驗(yàn)證等業(yè)務(wù)邏輯是不可信的,因此任何一種部署都需要服務(wù)器端包含業(yè)務(wù)層;

    2.為了開(kāi)發(fā)、維護(hù)和部署中的高度可伸縮性,圖中的各業(yè)務(wù)層所包含的代碼都是一模一樣的;

    3.因?yàn)榈?點(diǎn),所以我遇到了業(yè)務(wù)層的同一個(gè)操作是與其他機(jī)器上的業(yè)務(wù)層通信還是訪問(wèn)數(shù)據(jù)庫(kù)這個(gè)難題。

    解決業(yè)務(wù)層的數(shù)據(jù)訪問(wèn)問(wèn)題

    這個(gè)問(wèn)題是關(guān)鍵問(wèn)題,也就是上面幾點(diǎn)說(shuō)明中的第3個(gè)問(wèn)題,為了解決這個(gè)問(wèn)題我們引入數(shù)據(jù)門戶的概念。

    下面以WebService為例說(shuō)明:界面層訪問(wèn)本機(jī)的業(yè)務(wù)對(duì)象的增刪改查中的“查”方法時(shí),跳過(guò)數(shù)據(jù)庫(kù)的查詢操作,訪問(wèn)另一臺(tái)機(jī)器中的同一個(gè)業(yè)務(wù)對(duì)象類的“查”方法。

分布式系統(tǒng)的部署

    以上是向另一臺(tái)機(jī)器發(fā)送請(qǐng)求,該請(qǐng)求并不直接調(diào)用另一臺(tái)機(jī)器上的業(yè)務(wù)對(duì)象類的“查”方法,而是將要調(diào)用的業(yè)務(wù)對(duì)象和方法參數(shù)信息轉(zhuǎn)為一個(gè)“二進(jìn)制包”,作為參數(shù)去調(diào)用另一臺(tái)機(jī)器上通用的“查”方法,另一臺(tái)機(jī)器上的“查”方法再解開(kāi)這個(gè)包,然后去調(diào)用解開(kāi)的包中所表示的業(yè)務(wù)對(duì)象類型,下面的靜態(tài)圖是另一臺(tái)機(jī)器接受到請(qǐng)求后的工作。

分布式系統(tǒng)的部署

    又有些說(shuō)明:

    1. 關(guān)于原理都已在圖中做了描述,不另寫大段文字解釋了;

    2. 上面兩個(gè)圖中,除了“實(shí)際業(yè)務(wù)對(duì)象類”以外的部分全部屬于架構(gòu)或者框架部分;

    3.如果用OO的思想去審查上面的兩個(gè)圖,你一定會(huì)為這糟糕的設(shè)計(jì)而抱怨,這里只是為了盡可能簡(jiǎn)單的表述分布式系統(tǒng)的工作原理,你可以采用策略模式使數(shù)據(jù)門戶不改變的情況下適應(yīng)各種請(qǐng)求響應(yīng)場(chǎng)合,采用工廠模式實(shí)現(xiàn)不同的請(qǐng)求響應(yīng)場(chǎng)合的切換。

    關(guān)于數(shù)據(jù)庫(kù)的分布

    為了解決數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),我們可能希望把數(shù)據(jù)分布存儲(chǔ)在多個(gè)服務(wù)器上,我設(shè)想的數(shù)據(jù)庫(kù)分布方案是,各服務(wù)器上的數(shù)據(jù)庫(kù)在結(jié)構(gòu)上一模一樣,而表里的數(shù)據(jù)存儲(chǔ)到不同服務(wù)器上,這樣數(shù)據(jù)訪問(wèn)層在查數(shù)據(jù)的時(shí)候分別向所有數(shù)據(jù)庫(kù)服務(wù)器發(fā)送同樣的sql命令,然后數(shù)據(jù)訪問(wèn)層得到數(shù)據(jù)后整合,這樣減輕每臺(tái)服務(wù)器的工作量。亦或者根據(jù)表里的某個(gè)代表性的字段(如:省份)分布數(shù)據(jù)到不同服務(wù)器。

 

分布式系統(tǒng)定義以及優(yōu)勢(shì)分析

介紹完分布式系統(tǒng)相關(guān)原理之后,我們來(lái)了解下分布式系統(tǒng)的優(yōu)勢(shì)分析

    【分布式系統(tǒng)定義以及優(yōu)勢(shì)分析

    分布式系統(tǒng)是個(gè)由多個(gè)互相連接的處理資源組成的計(jì)算機(jī)系統(tǒng),它們?cè)谡麄€(gè)系統(tǒng)的控制下協(xié)同執(zhí)行同一個(gè)任務(wù),最少依賴于集中的程序、數(shù)據(jù)或硬件。這些資源可以是地理上相鄰的,也可以是在地理上分散的。分布式系統(tǒng)隱含的共同特征是:場(chǎng)地分布、數(shù)據(jù)分布、硬件平臺(tái)多樣化、操作系統(tǒng)多樣化、應(yīng)用平臺(tái)多樣化。

    分布式系統(tǒng)的定義

    當(dāng)討論分布式系統(tǒng)時(shí),我們面臨許多以下這些形容詞所描述的 同類型:分布式的、刪絡(luò)的、并行的、并發(fā)的和分散的。分布式處理是一個(gè)相對(duì)較新的領(lǐng)域,所以還沒(méi)有‘致的定義。與順序計(jì)算相比、并行的、并發(fā)的和分布式的計(jì)算包括多個(gè)PE問(wèn)的集體協(xié)同動(dòng)作。這些術(shù)語(yǔ)在范圍一卜相互覆蓋,有時(shí)也交換使用。

    *“并行的”意味著從一個(gè)單一控制線程對(duì)數(shù)據(jù)集的鎖步(1ockst ep)動(dòng)作。

    在并行計(jì)算機(jī)級(jí)別上,指令流多數(shù)據(jù)流(SIMD)計(jì)算機(jī)就是一個(gè)使用多個(gè)數(shù)據(jù)處理單元在許多數(shù)據(jù)項(xiàng)上同時(shí)進(jìn)行相同或相似操作的例子。

    *“并發(fā)的”意味著某些動(dòng)作可以以任意次序執(zhí)行。例如,在史島級(jí)別,卜和在多指令流多數(shù)據(jù)流(MIMD)并行計(jì)算機(jī)上進(jìn)行部分獨(dú)立的操作。

    *“分布式的”意味著計(jì)算的成本或性能取決于數(shù)據(jù)和控制的通信。

    如果個(gè)系統(tǒng)的部件局限在一個(gè)地方,它就是集中式的:如果它的部件在不同地l20方,部件之間要么不存在或僅存在有限的合作,要么存在緊密的合作,它是分散式的。

    當(dāng)一個(gè)分散式系統(tǒng)不存在或僅存在有限的合作時(shí),它就被稱作網(wǎng)絡(luò)的;否則它就被稱作分布式的,表示在不同地方的部件之間存在緊密的合作。在給出分布式系統(tǒng)具體定義的模型中,分布式系統(tǒng)可以用硬件、控制、數(shù)據(jù)這三個(gè)維度加以檢驗(yàn)。

    分布式系統(tǒng)=分布式硬件 分布式控制 分布式數(shù)據(jù)

    分布式系統(tǒng)有很多不同的定義,但其中沒(méi)有一個(gè)是令人滿意或者能夠被所有人接受的。介紹分布式系統(tǒng),對(duì)它的特點(diǎn)的下列大致的描述足夠了:

    “一個(gè)分布式系統(tǒng)是一些獨(dú)立的計(jì)算機(jī)的集合,但是對(duì)這個(gè)系統(tǒng)的用戶來(lái)說(shuō),系統(tǒng)就象一臺(tái)計(jì)算機(jī)一樣?!?/p>

    這個(gè)定義有兩個(gè)方面的含義:第一,從硬件角度來(lái)講,各個(gè)計(jì)算機(jī)都是自治的;第二,從軟件角度來(lái)講,用戶將整個(gè)系統(tǒng)看作是一臺(tái)計(jì)算機(jī)。這兩者都是必需的,缺一不可。在簡(jiǎn)要介紹有關(guān)硬件、軟件的一些背景材料之后,我們將再回到這兩點(diǎn)上來(lái)進(jìn)行討論。

    由于給出分布式系統(tǒng)的一些實(shí)例可能要比進(jìn)一步的深入研究定義更有幫助,下面就給出一些分布式系統(tǒng)的例子。第一個(gè)例子,設(shè)想一個(gè)大學(xué)或公司部門內(nèi)的工作站網(wǎng)絡(luò)。除了每個(gè)用戶的個(gè)人工作站外,機(jī)房中可能還有一個(gè)共享的處理機(jī)池(pool of processor),這些處理機(jī)并沒(méi)有分配給特定的用戶,而是在需要的時(shí)候進(jìn)行動(dòng)態(tài)分配。這樣的系統(tǒng)可能會(huì)有一個(gè)單一的文件系統(tǒng),其中所有的文件可以從所有的計(jì)算機(jī)上以相同的方式并且使用相同的路徑名存取。另外,當(dāng)一個(gè)用戶輸入一條命令時(shí),系統(tǒng)能夠找到一個(gè)最好的地方執(zhí)行該命令。這可能是在用戶自己的工作站上,可能是在別人空閑的工作站上,也可能在機(jī)房里一個(gè)未分配的處理機(jī)上。如果這個(gè)從系統(tǒng)整體上看以及運(yùn)行起來(lái)看都像一個(gè)典型的單處理機(jī)分時(shí)系統(tǒng),那么就可以稱它為一個(gè)分布式系統(tǒng)。

    第二個(gè)例子,考慮一個(gè)到處是機(jī)器人的工廠。每個(gè)機(jī)器人都有一臺(tái)功能強(qiáng)大的計(jì)算機(jī)用于處理視覺(jué)、進(jìn)行計(jì)劃、通信以及其它任務(wù)。當(dāng)裝配線上的某個(gè)機(jī)器人發(fā)現(xiàn)一個(gè)它要安裝的零件有缺陷時(shí),它就要求該零件供應(yīng)部門的另一個(gè)機(jī)器人給它送一個(gè)替代品。如果所有的機(jī)器人都如同連接于同一中心計(jì)算機(jī)上的外設(shè)一樣工作,而且系統(tǒng)的程序也是以這種方式進(jìn)行編制的話,那么它也是一種分布式系統(tǒng)。

    最后一個(gè)例子是一個(gè)在世界各地有數(shù)百個(gè)分支機(jī)構(gòu)的大銀行。每個(gè)分支機(jī)構(gòu)有一臺(tái)主計(jì)算機(jī)存儲(chǔ)當(dāng)?shù)貛つ亢吞幚肀镜厥聞?wù)。此外,每臺(tái)計(jì)算機(jī)還能通過(guò)串口服務(wù)器與其他分支機(jī)構(gòu)的計(jì)算機(jī)及總部的計(jì)算機(jī)對(duì)話。如果交易不管顧客和帳目在哪里都能夠進(jìn)行,而且用戶也不會(huì)感到當(dāng)前這個(gè)系統(tǒng)與被替代的老的集中式主機(jī)有何不同,那么這個(gè)系統(tǒng)也被認(rèn)為是一個(gè)分布式系統(tǒng)。

    分布式系統(tǒng)的優(yōu)勢(shì)

    分布式系統(tǒng)與集中式系統(tǒng)相比較而言的優(yōu)點(diǎn)

    系統(tǒng)傾向于分布式發(fā)展潮流的真正驅(qū)動(dòng)力是經(jīng)濟(jì)。25年前,計(jì)算機(jī)權(quán)威和評(píng)論家Herb Grosch指出CPU的計(jì)算能力與它的價(jià)格的平方成正比,后來(lái)成為Grosch定理。也就是說(shuō)如果你付出兩倍的價(jià)錢,就能獲得四倍的性能。這一論斷與當(dāng)時(shí)的大型機(jī)技術(shù)非常吻合,因而使得許多機(jī)構(gòu)都盡其所能購(gòu)買最大的單個(gè)大型機(jī)。

    隨著微處理機(jī)技術(shù)的發(fā)展,Grosch定理不再適用了?,F(xiàn)在人們只需花幾百美元就能買到一個(gè)CPU芯片,這個(gè)芯片每秒鐘執(zhí)行的指令比80年代最大的大型機(jī)的處理機(jī)每秒鐘所執(zhí)行的指令還多。如果你愿意付出兩倍的價(jià)錢,將得到同樣的CPU,但它卻以更高的時(shí)鐘速率運(yùn)行。因此,最節(jié)約成本的辦法通常是在一個(gè)系統(tǒng)中使用集中在一起的大量的廉價(jià)CPU。所以,傾向于分布式系統(tǒng)的主要原因是它可以潛在地得到比單個(gè)的大型集中式系統(tǒng)好得多的性能價(jià)格比。實(shí)際上,分布式系統(tǒng)是通過(guò)較低廉的價(jià)格來(lái)實(shí)現(xiàn)相似的性能的。

    與這一觀點(diǎn)稍有不同的是,我們發(fā)現(xiàn)微處理機(jī)的集合不僅能產(chǎn)生比單個(gè)大型主機(jī)更好的性能價(jià)格比,而且還能產(chǎn)生單個(gè)大型主機(jī)無(wú)論如何都不能達(dá)到的絕對(duì)性能。例如,按目前的技術(shù),我們能夠用10,000個(gè)現(xiàn)代CPU芯片組成一個(gè)系統(tǒng),每個(gè)CPU芯片以50 MIPS(每秒百萬(wàn)指令)的速率運(yùn)行,那么整個(gè)系統(tǒng)的性能就是500,000 MIPS。而如果單個(gè)處理機(jī)(即CPU)要達(dá)到這一性能,就必需在2×10-12 秒(2 微微秒,0.002納秒)的時(shí)間內(nèi)執(zhí)行一條指令,然而沒(méi)有一個(gè)現(xiàn)存的計(jì)算機(jī)能接近這個(gè)速度,從理論上和工程上考慮都認(rèn)為能達(dá)到這一要求的計(jì)算機(jī)都是不可能存在的。理論上,愛(ài)因斯坦的相對(duì)論指出光的傳播速度最快,它能在2 微微秒內(nèi)傳播0.6毫米。實(shí)際上,一個(gè)包含于邊長(zhǎng)為0.6 毫米大小的立方體內(nèi)的具有上面所說(shuō)的計(jì)算速度的計(jì)算機(jī)產(chǎn)生大量的熱量就能將它自己立即熔掉。所以,無(wú)論是要以低價(jià)格獲得普通的性能還是要以較高的價(jià)格獲得極高的性能,分布式系統(tǒng)都能夠滿足。

    另一方面,一些作者對(duì)分布式系統(tǒng)和并行系統(tǒng)進(jìn)行了區(qū)分。他們認(rèn)為分布式系統(tǒng)是設(shè)計(jì)用來(lái)允許眾多用戶一起工作的,而并行系統(tǒng)的唯一目標(biāo)就是以最快的速度完成一個(gè)任務(wù),就像我們的速度為500,000 MIPS的計(jì)算機(jī)那樣。我們認(rèn)為,上述的區(qū)別是難以成立的,因?yàn)閷?shí)際上這兩個(gè)設(shè)計(jì)領(lǐng)域是統(tǒng)一的。我們更愿意在最廣泛的意義上使用“分布式系統(tǒng)”一詞來(lái)表示任何一個(gè)有多個(gè)互連的CPU協(xié)同工作的系統(tǒng)。

    建立分布式系統(tǒng)的另一原因在于一些應(yīng)用本身是分布式的。一個(gè)超級(jí)市場(chǎng)連鎖店可能有許多分店,每個(gè)商店都需要采購(gòu)當(dāng)?shù)厣a(chǎn)的商品(可能來(lái)自本地的農(nóng)場(chǎng))、進(jìn)行本地銷售,或者要對(duì)本地的哪些蔬菜因時(shí)間太長(zhǎng)或已經(jīng)腐爛而必須扔掉作出決定。因此,每個(gè)商店的本地計(jì)算機(jī)能明了存貨清單是有意義的,而不是集中于公司總部。畢竟,大多數(shù)查詢和更新都是在本地進(jìn)行的。然而,連鎖超級(jí)市場(chǎng)的高層管理者也會(huì)不時(shí)地想要了解他們目前還有多少甘藍(lán)。實(shí)現(xiàn)這一目標(biāo)的一種途徑就是將整個(gè)系統(tǒng)建設(shè)成對(duì)于應(yīng)用程序來(lái)說(shuō)就像一臺(tái)計(jì)算機(jī)一樣,但是在實(shí)現(xiàn)上它是分布的,像我們前面所描述的一個(gè)商店有一臺(tái)機(jī)器。這就是一個(gè)商業(yè)分布式系統(tǒng)。

    另一種固有的分布式系統(tǒng)是通常被稱為計(jì)算機(jī)支持下的協(xié)同工作系統(tǒng)(CSCW,Computer Supported Cooperative Work)。在這個(gè)系統(tǒng)中,一組相互之間在物理上距離較遠(yuǎn)的人員可以一起進(jìn)行工作,例如,寫出同一份報(bào)告。就計(jì)算機(jī)工業(yè)的長(zhǎng)期發(fā)展趨勢(shì)來(lái)說(shuō),人們可以很容易的想像出一個(gè)全新領(lǐng)域--計(jì)算機(jī)支持的協(xié)同游戲(CSCG:Computer Supported Cooperative Games)。在這個(gè)游戲中,不在同一地方的游戲者可以實(shí)時(shí)的玩游戲。你可以想像,在一個(gè)多維迷宮中玩電子捉迷藏,甚至是一起玩一場(chǎng)電子空戰(zhàn),每個(gè)人操縱自己的本地飛行模擬器去試著擊落別的游戲者,每個(gè)游戲者的屏幕上都顯示出其飛機(jī)外的情況,包括其它飛入它的視野的飛機(jī)。

    同集中式系統(tǒng)相比較,分布式系統(tǒng)的另一個(gè)潛在的優(yōu)勢(shì)在于它的高可靠性。通過(guò)把工作負(fù)載分散到眾多的機(jī)器上,單個(gè)芯片故障最多只會(huì)使一臺(tái)機(jī)器停機(jī),而其它機(jī)器不會(huì)受任何影響。理想條件下,某一時(shí)刻如果有5%的計(jì)算機(jī)出現(xiàn)故障,系統(tǒng)將仍能繼續(xù)工作,只不過(guò)損失5%的性能。對(duì)于關(guān)鍵性的應(yīng)用,如核反應(yīng)堆或飛機(jī)的控制系統(tǒng),采用分布式系統(tǒng)來(lái)實(shí)現(xiàn)主要是考慮到它可以獲得高可靠性。

    最后,漸增式的增長(zhǎng)方式也是分布式系統(tǒng)優(yōu)于集中式系統(tǒng)的一個(gè)潛在的重要的原因。通常,一個(gè)公司會(huì)買一臺(tái)大型主機(jī)來(lái)完成所有的工作。而當(dāng)公司繁榮擴(kuò)充、工作量就會(huì)增大,當(dāng)其增大到某一程度時(shí),這個(gè)主機(jī)就不能再勝任了。僅有的解決辦法是要么用更大型的機(jī)器(如果有的話)代替現(xiàn)有的大型主機(jī),要么再增加一臺(tái)大型主機(jī)。這兩種作法都會(huì)引起公司運(yùn)轉(zhuǎn)混亂。相比較之下,如果采用分布式系統(tǒng),僅給系統(tǒng)增加一些處理機(jī)就可能解決這個(gè)問(wèn)題,而且這也允許系統(tǒng)在需求增長(zhǎng)的時(shí)候逐漸進(jìn)行擴(kuò)充。表1-1中總結(jié)了以上這些優(yōu)點(diǎn)。

    項(xiàng)目

    描  述

    經(jīng)濟(jì)

    微處理機(jī)提供了比大型主機(jī)更好的性能價(jià)格比

    速度

    分布式系統(tǒng)總的計(jì)算能力比單個(gè)大型主機(jī)更強(qiáng)

    固有的分布性

    一些應(yīng)用涉及到空間上分散的機(jī)器

    可靠性

    如果一個(gè)機(jī)器崩潰,整個(gè)系統(tǒng)還可以運(yùn)轉(zhuǎn)

    漸增

    計(jì)算能力可以逐漸有所增加

    從長(zhǎng)遠(yuǎn)的角度來(lái)看,主要的驅(qū)動(dòng)力將是大量個(gè)人計(jì)算機(jī)的存在和人們共同工作與信息共享的需要,這種信息共享必需是以一種方便的形式進(jìn)行的,而不受地理或人員、數(shù)據(jù),機(jī)器的物理分布的影響。

    分布式系統(tǒng)與獨(dú)立PC機(jī)相比較的優(yōu)點(diǎn)

    既然使用微處理機(jī)是一種節(jié)省開(kāi)支的辦法,那么為什么不給每個(gè)人一臺(tái)個(gè)人計(jì)算機(jī),讓他們各自獨(dú)立地工作呢?一則,許多用戶需要共享數(shù)據(jù)。例如,機(jī)票預(yù)訂處的工作人員需要訪問(wèn)存儲(chǔ)航班以及現(xiàn)有座位信息的主數(shù)據(jù)庫(kù)。假如給每個(gè)工作人員都備份整個(gè)數(shù)據(jù)庫(kù),那么在實(shí)際中這是無(wú)法工作的,因?yàn)闆](méi)有人知道其他工作人員已經(jīng)賣出了哪些座位。共享的數(shù)據(jù)是上例和許多其它應(yīng)用的基礎(chǔ),所以計(jì)算機(jī)間必須互連。而計(jì)算機(jī)互連就產(chǎn)生了分布式系統(tǒng)。

    共享并不只是僅僅涉及數(shù)據(jù)。昂貴的外設(shè),例如彩色激光打印機(jī),照相排版機(jī)以及大型存儲(chǔ)設(shè)備(如自動(dòng)光盤點(diǎn)唱機(jī))都是共享資源。

    把一組孤立的計(jì)算機(jī)連成一個(gè)分布式系統(tǒng)的第三個(gè)原因是它可以增強(qiáng)人與人之間的溝通,電子郵件比信件、電話和傳真有更多的誘人之處。它比信件快的多,不像電話需要兩人同時(shí)都在,也不像傳真,它所產(chǎn)生的文件可在計(jì)算機(jī)中進(jìn)行編輯、重排和存儲(chǔ),也可以由文本處理程序來(lái)處理。

    最后,分布式系統(tǒng)可能比給每個(gè)用戶一個(gè)獨(dú)立的計(jì)算機(jī)更靈活。盡管一種可能的模式是給每個(gè)人一臺(tái)個(gè)人計(jì)算機(jī)并把它們通過(guò)LAN聯(lián)在一起,但這種方式并不是唯一的。另外還存在一種模式是將個(gè)人計(jì)算機(jī)和共享計(jì)算機(jī)混合連接在一起(這些機(jī)器的型號(hào)可能并不完全相同),使工作能夠在最合適的計(jì)算機(jī)上完成,而并不總是在自己的計(jì)算機(jī)上完成。這種方式可以使工作負(fù)荷能更有效地在計(jì)算機(jī)系統(tǒng)中進(jìn)行分配。系統(tǒng)中某些計(jì)算機(jī)的失效也可以通過(guò)使其工作在其它計(jì)算機(jī)上進(jìn)行而得到補(bǔ)償。表1-2總結(jié)了以上所介紹的各點(diǎn)。

    項(xiàng)目

    描 述

    數(shù)據(jù)共享

    允許多個(gè)用戶訪問(wèn)一個(gè)公共的數(shù)據(jù)庫(kù)

    設(shè)備共享

    允許多個(gè)用戶共享昂貴的外圍設(shè)備(如彩色打印機(jī))

    通信

    使得人們之間的通信更加容易,如通過(guò)電子郵件

    靈活性

    用最有效的方式將工作負(fù)荷分配到可用的機(jī)器上

     分布式系統(tǒng)的缺點(diǎn)

    盡管分布式系統(tǒng)有許多優(yōu)點(diǎn),但也有缺點(diǎn)。本節(jié)就將指出其中的一些缺點(diǎn)。我們前面已經(jīng)提到了最棘手的問(wèn)題:軟件。就目前的最新技術(shù)發(fā)展水平,我們?cè)谠O(shè)計(jì)、實(shí)現(xiàn)及使用分布式系統(tǒng)上都沒(méi)有太多的經(jīng)驗(yàn)。什么樣的操作系統(tǒng)、程序設(shè)計(jì)語(yǔ)言和應(yīng)用適合這一系統(tǒng)呢?用戶對(duì)分布式系統(tǒng)中分布式處理又應(yīng)該了解多少呢?系統(tǒng)應(yīng)當(dāng)做多少而用戶又應(yīng)當(dāng)做多少呢?專家們的觀點(diǎn)不一(這并不是因?yàn)閷<覀兣c眾不同,而是因?yàn)閷?duì)于分布式系統(tǒng)他們也很少涉及)。隨著更多的研究的進(jìn)行,這些問(wèn)題將會(huì)逐漸減少。但是目前我們不應(yīng)該低估這個(gè)問(wèn)題。

    第二個(gè)潛在的問(wèn)題是通信網(wǎng)絡(luò)。由于它會(huì)損失信息,所以就需要專門的軟件進(jìn)行恢復(fù)。同時(shí),網(wǎng)絡(luò)還會(huì)產(chǎn)生過(guò)載。當(dāng)網(wǎng)絡(luò)負(fù)載趨于飽和時(shí),必須對(duì)它進(jìn)行改造替換或加入另外一個(gè)網(wǎng)絡(luò)擴(kuò)容。在這兩種情況下,一個(gè)或多個(gè)建筑中的某些部分必須花費(fèi)很高的費(fèi)用進(jìn)行重新布線,或者更換網(wǎng)絡(luò)接口板(例如用光纖)。一旦系統(tǒng)依賴于網(wǎng)絡(luò),那么網(wǎng)絡(luò)的信息丟失或飽和將會(huì)抵消我們通過(guò)建立分布式系統(tǒng)所獲得的大部分優(yōu)勢(shì)。

    最后,上面我們作為優(yōu)點(diǎn)來(lái)描述的數(shù)據(jù)易于共享性也是具有兩面性的。如果人們能夠很方便地存取整個(gè)系統(tǒng)中的數(shù)據(jù),那么他們同樣也能很方便地存取與他們無(wú)關(guān)的數(shù)據(jù)。換句話說(shuō),我們經(jīng)常要考慮系統(tǒng)的安全性問(wèn)題。通常,對(duì)必須絕對(duì)保密的數(shù)據(jù),使用一個(gè)專用的、不與其它任何機(jī)器相連的孤立的個(gè)人計(jì)算機(jī)進(jìn)行存儲(chǔ)的方法更可取。而且這個(gè)計(jì)算機(jī)被保存在一個(gè)上鎖的十分安全的房間中,與這臺(tái)計(jì)算相配套的所有軟盤都存放在這個(gè)房間中的一個(gè)保險(xiǎn)箱中。分布式系統(tǒng)的缺點(diǎn)如表1-3所示。

    項(xiàng)目

    描 述

    軟件

    目前為分布式系統(tǒng)開(kāi)發(fā)的軟件還很少

    網(wǎng)絡(luò)

    網(wǎng)絡(luò)可能飽和和引起其它的問(wèn)題

    安全

    容易造成對(duì)保密數(shù)據(jù)的訪問(wèn)

     表 1-3. 分布式系統(tǒng)的缺點(diǎn)

    盡管存在這些潛在的問(wèn)題,許多人還是認(rèn)為分布式系統(tǒng)的優(yōu)點(diǎn)多于缺點(diǎn),并且普遍認(rèn)為分布式系統(tǒng)在未來(lái)幾年中會(huì)越來(lái)越重要。實(shí)際上,在幾年之內(nèi)許多機(jī)構(gòu)會(huì)將他們的大多數(shù)計(jì)算機(jī)連接到大型分布式系統(tǒng)中,為用戶提供更好、更廉價(jià)和更方便的服務(wù)。而在十年之后,中型或大型商業(yè)或其它機(jī)構(gòu)中可能將不再存在一臺(tái)孤立的計(jì)算機(jī)了。

    分布式系統(tǒng)的應(yīng)用

    分布式系統(tǒng)被用在許多不同類型的應(yīng)用中。以下我們列出了一些應(yīng)用。對(duì)這些應(yīng)用而言,使用分布式系統(tǒng)要比其他體系結(jié)構(gòu)如處理機(jī)和共享存儲(chǔ)器多處理機(jī)更優(yōu)越:

    并行和高性能應(yīng)用

    原則上,并行應(yīng)用也可以在共享存儲(chǔ)器多處理機(jī)上運(yùn)行,但共享存儲(chǔ)器系統(tǒng)不能很好地?cái)U(kuò)大規(guī)模以包括大量的處理機(jī)。HPCC(高性能計(jì)算和通信)應(yīng)用一般需要一個(gè)可伸縮的設(shè)計(jì),這種設(shè)計(jì)取決于分布式處理。

    容錯(cuò)應(yīng)用

    因?yàn)槊總€(gè)P E是自治的,所以分布式系統(tǒng)更加可靠。一個(gè)單元或資源(軟件或硬件)的故障不影響其他資源的正常功能。

    固有的分布式應(yīng)用

    許多應(yīng)用是固有分布式的。這些應(yīng)用是突發(fā)模式(burstmode)而非批量模式(bulk mode)。這方面的實(shí)例有事務(wù)處理和Internet Javad,程序。

    這些應(yīng)用的性能取決于吞吐量(事務(wù)響應(yīng)時(shí)陽(yáng)J或每秒完成的事務(wù)數(shù))而不是一般多處理機(jī)所用的執(zhí)行時(shí)間。

    對(duì)于一組用戶而言, 分布式系統(tǒng)有一個(gè)特別的應(yīng)用稱為計(jì)算機(jī)支持的協(xié)同工作(computer supported Cooperati veworking,CSCW)或群件(groupware), 支持用戶協(xié)同工作。另一個(gè)應(yīng)用是分布式會(huì)議,即通過(guò)物理的分布式網(wǎng)絡(luò)進(jìn)行電子會(huì)議。同樣,多媒體遠(yuǎn)程教學(xué)也是一個(gè)類似的應(yīng)用。由于在不同的平臺(tái)上如:Pc、工作站、局域網(wǎng)和廣域網(wǎng)上可獲得非常多樣的應(yīng)用,用戶希望能超出他fliP c的限制以獲得更廣泛的特十牛、功能和性能。不同網(wǎng)絡(luò)和環(huán)境(包括分布式系統(tǒng)環(huán)境)下的q 操作性變得越來(lái)越重要。為了達(dá)到互操作性,用戶需要一個(gè)標(biāo)準(zhǔn)的分布式計(jì)算環(huán)境,在這個(gè)環(huán)境里,所有系統(tǒng)和資源都可用。

    DCE (分布式計(jì)算環(huán)境)是OSF (開(kāi)放系統(tǒng)基金會(huì))開(kāi)發(fā)的分布式計(jì)算技術(shù)的工業(yè)標(biāo)準(zhǔn)集。它提供保護(hù)和控制對(duì)數(shù)據(jù)訪問(wèn)的安全服務(wù)、容易尋找分布式資源的名字服務(wù)、以及高度可伸縮的模型用于組織極為分散的用戶、服務(wù)和數(shù)據(jù)。D C E可在所有主要的計(jì)算平臺(tái)上運(yùn)行, 并設(shè)計(jì)成支持異型硬件和軟件環(huán)境下的分布式應(yīng)用。

    DCE已經(jīng)被包括TRANSVARL在內(nèi)的一些r一商實(shí)現(xiàn)。TRANSVARL是最早的多廠商組(multi vendor team)的成員之一,它提出的建議已成為DC E體系結(jié)構(gòu)的基礎(chǔ)。在中可以找到利用DCE開(kāi)發(fā)分布式應(yīng)用的指南。具有標(biāo)準(zhǔn)接口和協(xié)議的系統(tǒng)也叫做開(kāi)放系統(tǒng)。一些其它標(biāo)準(zhǔn)基于一個(gè)特別的模型,比如CORBA (公用對(duì)象請(qǐng)求代理程序體系結(jié)構(gòu)),它是由OMG (對(duì)象管理組)和多計(jì)算機(jī)廠商聯(lián)盟開(kāi)發(fā)的一個(gè)標(biāo)準(zhǔn)。CORBA使用面向?qū)ο竽P蛯?shí)現(xiàn)分布式系統(tǒng)中的透明服務(wù)請(qǐng)求。工業(yè)界有自己的標(biāo)準(zhǔn),比如微軟的分布式構(gòu)件對(duì)象模型(DCOM)和Sun Microsystem公司的Java Beans。

    分布式系統(tǒng)的測(cè)試

    在測(cè)試執(zhí)行過(guò)程中,對(duì)測(cè)試結(jié)果的分析是一個(gè)需要進(jìn)行深入思考的重點(diǎn)問(wèn)題。分布式系統(tǒng)測(cè)試的重點(diǎn)在于對(duì)后端服務(wù)器集群的測(cè)試,而判定系統(tǒng)中是否存在Bug則是我們需要解決的重要問(wèn)題。那么應(yīng)該如何確定是否存在Bug呢?

    對(duì)于測(cè)試結(jié)果的分析,我們通常觀察下面幾種情況。

    觀察前端應(yīng)用的返回結(jié)果。這里需要分兩種情況來(lái)考慮:第一,按照前端應(yīng)用業(yè)務(wù)功能點(diǎn)及流程進(jìn)行操作,觀察返回結(jié)果是否符合業(yè)務(wù)方的需求預(yù)期;第二,操作后端的服務(wù)器(通常是重啟、宕機(jī)、斷網(wǎng)等操作),觀察前端應(yīng)用的返回結(jié)果是否符合系統(tǒng)的設(shè)計(jì)需求。

    分析服務(wù)器日志。在功能測(cè)試過(guò)程中,當(dāng)我們?cè)趩?dòng)服務(wù)器的時(shí)候,需要將日志級(jí)別定義為Debug級(jí)別(最低級(jí)別)。這樣做的主要目的是為了能便于測(cè)試工程師來(lái)分析日志和定位問(wèn)題。為了能更好地定位問(wèn)題,常常需要在服務(wù)器程序代碼中進(jìn)行日志打樁,把程序中的一些重要數(shù)據(jù)通過(guò)日志的方式展現(xiàn)出來(lái)。通常情況下,我們需要對(duì)日志的格式進(jìn)行約定,在日志行中增加一些關(guān)鍵字來(lái)進(jìn)行分類,這將便于測(cè)試工程師進(jìn)行日志分析,也有利于開(kāi)展分布式系統(tǒng)的自動(dòng)化測(cè)試。另外,值得注意的是,我們盡可能地將打樁代碼放在Debug代碼中,避免影響系統(tǒng)代碼,引入新問(wèn)題。

    分析操作系統(tǒng)的一些重要信息。我們測(cè)試的分布式系統(tǒng)絕大多數(shù)是基于Linux操作系統(tǒng)開(kāi)發(fā)的,在測(cè)試的過(guò)程中,除了詳細(xì)分析程序日志以外,還需要對(duì)操作系統(tǒng)的一些重要數(shù)據(jù)信息進(jìn)行分析,從而來(lái)診斷服務(wù)器程序是否存在異常。以Linux操作系統(tǒng)為例,我們常常會(huì)使用top命令、netstat命令及sar命令來(lái)查看操作系統(tǒng)的一些數(shù)據(jù)信息。例如,可以通過(guò)netstat命令檢查服務(wù)器程序是否正確地監(jiān)聽(tīng)了指定的端口等。

    借助其他分析工具。例如,如何判斷服務(wù)器程序是否產(chǎn)生了內(nèi)存泄漏?通常需要借助于內(nèi)存檢測(cè)工具來(lái)進(jìn)行分析。在Linux環(huán)境下,我們常用Valgrind來(lái)進(jìn)行內(nèi)存檢測(cè)。這是一款非常好用、功能強(qiáng)大的分析工具,可以幫助測(cè)試或者開(kāi)發(fā)工程師快速發(fā)現(xiàn)很多隱藏的程序Bug,尤其是在內(nèi)存檢測(cè)方面(同時(shí)它還具有很多其他優(yōu)秀的功能,讀者可以自己查看官網(wǎng)中的使用手冊(cè))。

    分布式系統(tǒng)壓力測(cè)試與性能測(cè)試

    對(duì)于分布式系統(tǒng)而言,壓力測(cè)試和性能測(cè)試非常重要。在進(jìn)行壓力測(cè)試和性能測(cè)試的時(shí)候,可能會(huì)碰到下面一些難點(diǎn)。

    數(shù)據(jù)準(zhǔn)備。如何準(zhǔn)備海量的測(cè)試數(shù)據(jù)并保證模擬數(shù)據(jù)的真實(shí)性?以一個(gè)分布式的文件系統(tǒng)為例,預(yù)先存入100GB的數(shù)據(jù)還是存入100TB的數(shù)據(jù)、存入的文件是大小基本一致差別不大還是各不相同甚至差異很大(例如,從幾十字節(jié)至幾十兆字節(jié)不等),這些因素對(duì)于分布式系統(tǒng)的性能影響是有很大差異的。另外,如果需要預(yù)先存入100TB的數(shù)據(jù),若按每秒寫入100MB數(shù)據(jù)來(lái)計(jì)算,寫入100TB數(shù)據(jù)需要100×1024×1024/100=1048576秒=291.27小時(shí)=12天。我們是否能忍受這么長(zhǎng)時(shí)間的數(shù)據(jù)準(zhǔn)備工作?為了解決這樣的問(wèn)題,我們需要對(duì)系統(tǒng)架構(gòu)設(shè)計(jì)進(jìn)行深入分析,設(shè)計(jì)好測(cè)試場(chǎng)景,并提前進(jìn)行測(cè)試用例的設(shè)計(jì),以盡早開(kāi)始準(zhǔn)備測(cè)試數(shù)據(jù)。

    性能或壓力測(cè)試工具。通常來(lái)說(shuō),分布式系統(tǒng)的測(cè)試需要開(kāi)發(fā)一些測(cè)試工具來(lái)滿足性能測(cè)試的需求。如果可以的話,建議這樣的測(cè)試工具最好由測(cè)試工程師自己來(lái)實(shí)現(xiàn),因?yàn)闇y(cè)試工程師更清楚自己的測(cè)試需求。當(dāng)需要自己開(kāi)發(fā)測(cè)試工具的時(shí)候,有兩個(gè)關(guān)鍵問(wèn)題需要重點(diǎn)關(guān)注:第一,一些關(guān)鍵數(shù)據(jù)的收集方式與計(jì)算將成為性能測(cè)試工具的關(guān)鍵,例如,TPS(每秒請(qǐng)求數(shù))、Throughput(吞吐量)計(jì)算的準(zhǔn)確性;第二,要保證性能測(cè)試工具的性能,如果工具本身的性能不好,將無(wú)法給予分布式系統(tǒng)足夠強(qiáng)大的壓力來(lái)進(jìn)行測(cè)試。另外,當(dāng)考慮到多并發(fā)(例如有10萬(wàn)客戶端同時(shí)并發(fā)連接)時(shí),如果性能測(cè)試工具在一臺(tái)測(cè)試機(jī)器上只能運(yùn)行50個(gè)或者更少的話,那么需要的測(cè)試機(jī)器數(shù)量也將會(huì)很龐大(例如2000臺(tái)測(cè)試機(jī)),這個(gè)成本或許是許多公司不能承受的。因此,性能測(cè)試工具本身的性能必須要足夠好才能滿足需求、降低測(cè)試成本。

    分布式系統(tǒng)自動(dòng)化測(cè)試

    自動(dòng)化測(cè)試是測(cè)試行業(yè)發(fā)展的必然趨勢(shì),對(duì)于分布式系統(tǒng)測(cè)試而言也不例外。在實(shí)施分布式系統(tǒng)自動(dòng)化測(cè)試的過(guò)程中,我們可能會(huì)碰到下面兩個(gè)難點(diǎn)問(wèn)題。

    涉及平臺(tái)多且硬件雜,測(cè)試流程控制困難。在實(shí)施自動(dòng)化測(cè)試的過(guò)程中,測(cè)試腳本需要控制的操作系統(tǒng)和應(yīng)用程序很多,而且存在跨平臺(tái)的特性,同時(shí)還有可能需要控制一些網(wǎng)絡(luò)設(shè)備。因此,選擇一個(gè)優(yōu)秀的自動(dòng)化測(cè)試框架成為了非常重要的工作之一。以我們的實(shí)踐經(jīng)驗(yàn)來(lái)看,STAF是一個(gè)不錯(cuò)的選擇,它的平臺(tái)(Windows及Linux各版本)支持及開(kāi)發(fā)語(yǔ)言的支持都很全面。

    測(cè)試結(jié)果驗(yàn)證復(fù)雜。對(duì)于分布式系統(tǒng)的自動(dòng)化測(cè)試來(lái)說(shuō),我們需要通過(guò)測(cè)試腳本來(lái)收集各種測(cè)試結(jié)果數(shù)據(jù)以驗(yàn)證測(cè)試結(jié)果的正確性。在實(shí)施自動(dòng)化測(cè)試的過(guò)程中,我們可以將測(cè)試結(jié)果數(shù)據(jù)收集部分模塊化,通過(guò)各子模塊來(lái)檢測(cè)各項(xiàng)數(shù)據(jù)是否正確。例如,我們會(huì)設(shè)計(jì)一個(gè)日志分析模塊,主要負(fù)責(zé)從服務(wù)器應(yīng)用程序的日志中收集相應(yīng)數(shù)據(jù)進(jìn)行對(duì)比驗(yàn)證(本文前面提到的在打樁日志中增加關(guān)鍵字部分就顯得格外重要)。

    隨著互聯(lián)網(wǎng)的發(fā)展,大型分布式系統(tǒng)也越來(lái)越多、越來(lái)越復(fù)雜、越來(lái)越重要。如何有效地保證大型分布式系統(tǒng)7×24小時(shí)全天候持續(xù)穩(wěn)定地運(yùn)行也就成為了一個(gè)重要課題。

    

分布式系統(tǒng)編程

    最后,如果你想了解分布式系統(tǒng)編程方面的內(nèi)容,請(qǐng)認(rèn)真閱讀以下文字。

 

    【分布式系統(tǒng)編程,你到哪一級(jí)了?】

    介紹

    當(dāng)分布式系統(tǒng)編程成為你生活中的一部分時(shí),你需要經(jīng)歷一段學(xué)習(xí)曲線。這篇文章描述了一下我當(dāng)前在這個(gè)領(lǐng)域大致屬于哪個(gè)層次,并希望能為你指出足夠多的錯(cuò)誤,從別人的錯(cuò)誤中學(xué)習(xí),從而使你能以最優(yōu)的路徑通向成功。先聲明一下,我在1995年時(shí)達(dá)到第1級(jí),我現(xiàn)在處于第3級(jí)。你自己屬于哪一級(jí)呢?

    第0級(jí):完全一無(wú)所知

    每個(gè)程序員都從這一級(jí)開(kāi)始。我不會(huì)在此浪費(fèi)太多口舌,因?yàn)檫@實(shí)在沒(méi)什么太多可說(shuō)的。相反,我會(huì)引用一些我曾經(jīng)經(jīng)歷過(guò)的對(duì)話,為從未接觸過(guò)分布式系統(tǒng)的開(kāi)發(fā)者們提供一些建議。

    對(duì)話1:

    NN:“在分布式系統(tǒng)中,復(fù)制是個(gè)很容易的操作,你只需要讓所有的結(jié)點(diǎn)同時(shí)存儲(chǔ)你要復(fù)制的東東就行了”。

    另一段對(duì)話(從我記憶深處挖出來(lái)的):

    NN: “為了我們的第一人稱射擊游戲,我們得寫一個(gè)自己的網(wǎng)絡(luò)處理引擎。”

    我:“為什么?”

    NN: “雖然已經(jīng)有一些優(yōu)秀的商業(yè)引擎了,但獲取license的費(fèi)用非常高昂,我們不想為此買單?!?/p>

    我:“你之前對(duì)于分布式系統(tǒng)有什么經(jīng)驗(yàn)嗎?”

    NN:“是的,我之前寫過(guò)一個(gè)套接字服務(wù)器。”

    我:“你覺(jué)得你要花多久能完成這個(gè)網(wǎng)絡(luò)引擎?”

    NN:“我想2周吧。保險(xiǎn)起見(jiàn),我計(jì)劃用4周時(shí)間。”

    好吧,有時(shí)候還是保持沉默比較好。

    第1級(jí):RPC

    RMI是一種非常強(qiáng)大的用來(lái)構(gòu)建大型系統(tǒng)的技術(shù)。事實(shí)上,這個(gè)技術(shù)用Java來(lái)描述的話,結(jié)合一些工作的例子可以在短短幾頁(yè)紙內(nèi)描述清楚。RMI技術(shù)非常令人振奮,而且它很容易使用。你可以調(diào)用你所能綁定到的任何服務(wù)器資源,而且你可以構(gòu)建出分布式的網(wǎng)絡(luò)對(duì)象。過(guò)去人們常常為構(gòu)建復(fù)雜的軟件系統(tǒng)犯難,現(xiàn)在RMI打開(kāi)了這道大門。——Peter van der Linden, Just Java(第4版, Sun Microsystems)

    我先聲明,我并不是說(shuō)這本書很爛。我清楚的記得這本書讀起來(lái)很有趣(尤其是章節(jié)之間插入的軼聞),我曾經(jīng)學(xué)習(xí)Java的時(shí)候就是用的這本書(太久以前了,簡(jiǎn)直不像在一個(gè)時(shí)空里似的)。一般情況下,我覺(jué)得作者說(shuō)的挺好。他對(duì)RMI的態(tài)度就是典型的分布式系統(tǒng)設(shè)計(jì)的第1級(jí)水平。處于這個(gè)等級(jí)的人對(duì)統(tǒng)一的對(duì)象有共同的看法。事實(shí)上,Waldo在他們著名的論文“a note on distributed computing”(1994)上曾深入描述過(guò),這里我做下總結(jié):

    我所倡導(dǎo)的寫分布式應(yīng)用的策略可分為3個(gè)階段。第1階段,寫這個(gè)應(yīng)用時(shí)不用擔(dān)心對(duì)象存儲(chǔ)的位置,以及它們之間的通訊如何實(shí)現(xiàn)。第2階段,通過(guò)具體化對(duì)象的位置以及通訊方法來(lái)調(diào)整程序性能。第3階段,真槍實(shí)彈的測(cè)試(網(wǎng)絡(luò)隔離、機(jī)器宕機(jī)等各種情況)。這里的思想就是,不管一個(gè)調(diào)用是本地的還是遠(yuǎn)程的,對(duì)程序的正確性都不會(huì)產(chǎn)生任何影響。

    同樣還是這篇論文,隨后進(jìn)一步挖掘了這個(gè)主題并展示了其中的問(wèn)題。這個(gè)觀點(diǎn)是錯(cuò)誤的,而且已經(jīng)錯(cuò)了快20年。不管如何,如果說(shuō)Java RMI達(dá)成了一個(gè)目標(biāo),那就是:就算你從等式中拿掉傳輸協(xié)議、命名、綁定以及序列化,它還是不成立。能記得起CORBA的老程序員們同樣也會(huì)記得它也是不好使的,但他們有一個(gè)借口:CORBA還在同各種底層的問(wèn)題纏斗中。Java RMI將所有這些都拋開(kāi)了,但使剩下的問(wèn)題變得更為突出。其中有兩點(diǎn),第一點(diǎn)純粹就是個(gè)麻煩:

    網(wǎng)絡(luò)不是透明的

    讓我們看看這段簡(jiǎn)單的Java RMI代碼示例(同樣取自Just Java一書)

    public interface WeatherIntf extends java.rmi.Remote { public String getWeather() throws java.rmi.RemoteException;}

    想要使用天氣服務(wù)的客戶端需要這樣做:

    try { Remote robj = Naming.lookup(“//localhost/WeatherServer”); WeatherIntf weatherserver = (WeatherInf)robj; String forecast = weatherserver.getWeather(); System.out.println(“The weather will be “ forecast);}catch(Exception e) { System.out.println(e.getMessage());

    客戶端代碼需要將RemoteExceptions考慮在內(nèi)。如果你想看看你究竟會(huì)遇到什么樣的異常錯(cuò)誤,可以看看那20多個(gè)子類的定義。這樣你的代碼就會(huì)變得丑陋,好吧,這個(gè)我們就忍了。

    局部性錯(cuò)誤

    RMI的真正問(wèn)題在于這些調(diào)用可能會(huì)出現(xiàn)局部性失敗的情況。比如,調(diào)用可能會(huì)在對(duì)其他層的請(qǐng)求操作執(zhí)行前失敗,又或者請(qǐng)求成功了,但之后的返回值又不正確。引起這類局部性失敗的原因非常多。其實(shí),這些故障模式正是分布式系統(tǒng)特性的明確定義:

    “分布式系統(tǒng)就是某一臺(tái)你根本意識(shí)不到其存在的計(jì)算機(jī),它的故障會(huì)造成你的計(jì)算機(jī)無(wú)法正常使用?!薄 ?Leslie Lamport

    如果這個(gè)方法只是去檢索天氣預(yù)報(bào),出現(xiàn)問(wèn)題時(shí)你可以簡(jiǎn)單的進(jìn)行重試,但如果你想遞增一個(gè)計(jì)數(shù)器,重試可能會(huì)導(dǎo)致產(chǎn)生0到2次的更新,結(jié)果就不確定了。這個(gè)解決方案應(yīng)該來(lái)自冪等操作,但構(gòu)建這樣的操作并不總是可行的。此外,因?yàn)槟銢Q定改變方法調(diào)用的語(yǔ)義,那你基本上就承認(rèn)了RMI與本地調(diào)用是不同的。而這也就承認(rèn)了RMI實(shí)際上是個(gè)悖論。

    不論什么情況下,這種范式都是失敗的。因?yàn)榫W(wǎng)絡(luò)的透明度和分布式系統(tǒng)的架構(gòu)抽象從來(lái)就是無(wú)法實(shí)現(xiàn)的。這也表明了某些軟件所采用的方法比其他軟件為此所受到的影響更多。Scrum的一些變種方法中傾向于做原型化。原型更集中于“好的方面”(happy path),而好的方面通常都不是問(wèn)題所在之處。這基本上意味著你將永遠(yuǎn)停留在第1級(jí)的水平。(不好意思,我知道這是個(gè)小小的打擊)

    那些脫離了第一級(jí)水平的人懂得對(duì)于需要解決的這個(gè)問(wèn)題,我們要有足夠的尊重。他們摒棄了網(wǎng)絡(luò)透明化的思想,從戰(zhàn)略性的角度來(lái)處理局部性失敗的問(wèn)題。

    第2級(jí):分布式算法異步消息傳遞語(yǔ)言級(jí)支持

    OK,你已經(jīng)學(xué)習(xí)了分布式計(jì)算中的悖論是什么。你決定吞下這顆子彈,然后對(duì)消息傳遞機(jī)制建模,以此顯式地控制出現(xiàn)失敗的情況。你將應(yīng)用分為兩個(gè)層次,底層負(fù)責(zé)網(wǎng)絡(luò)和消息傳遞,而上層處理消息的到達(dá),以及需要處理的各種請(qǐng)求。

    這個(gè)上層實(shí)現(xiàn)了一種分布式狀態(tài)機(jī),如果你去問(wèn)設(shè)計(jì)者這個(gè)狀態(tài)機(jī)是用來(lái)做什么的,他們可能會(huì)這樣回答你:這是建立在TCP之上的一個(gè)Multi-Paxos算法實(shí)現(xiàn)。

    明智的開(kāi)發(fā),這里用到的策略可以歸結(jié)為:程序員首先在本地主要采用線程來(lái)模擬不同的進(jìn)程來(lái)開(kāi)發(fā)這個(gè)應(yīng)用。每個(gè)線程運(yùn)行分布式狀態(tài)機(jī)的一個(gè)部分,基本上就是負(fù)責(zé)運(yùn)行一段消息處理的循環(huán)。一旦這個(gè)應(yīng)用是本地完整的且運(yùn)行正確,就可以在遠(yuǎn)端的計(jì)算機(jī)上用真正的進(jìn)程來(lái)取代線程。到這個(gè)階段,除去網(wǎng)絡(luò)中可能出現(xiàn)的問(wèn)題外,這個(gè)分布式應(yīng)用已經(jīng)可以正常工作了。到容錯(cuò)階段時(shí),可以通過(guò)配置每個(gè)分布式實(shí)體來(lái)正確反映故障的方式來(lái)達(dá)成,這種方式很直接。(我引述自“A Fault Tolerant Abstraction for Transparent Distributed Programming”)

    因?yàn)榉植际綘顟B(tài)機(jī)的存在,局部性故障可以通過(guò)設(shè)計(jì)來(lái)解決。對(duì)于線程,其實(shí)也有很多種選擇,但協(xié)程(coroutines)更適合(在各種不同的編程語(yǔ)言中,協(xié)程也被稱為纖程fiber,輕量級(jí)線程,微線程或者就叫線程),因?yàn)閰f(xié)程允許我們對(duì)并發(fā)行為有更細(xì)粒度的控制。

    結(jié)合“C代碼并不會(huì)使網(wǎng)絡(luò)變得更快”的論點(diǎn),你可以轉(zhuǎn)移到在語(yǔ)言級(jí)支持這種細(xì)粒度并發(fā)控制的編程語(yǔ)言中去。流行的選擇如下(排名不分先后)注意,這些編程語(yǔ)言往往都是函數(shù)式的:

    1. Mozart

    2. Erlang

    3. OCaml

    4. Haskell

    5. Stackless

    6. Clojure

    舉個(gè)例子,下面讓我們看看在Erlang中這種并發(fā)控制的代碼看起來(lái)是怎樣的(取自Erlang concurrent programming)

    -module(tut15)-export([start/0, ping/2, pong/0]).ping(0, Pong_PID) -> Pong_PID ! finished, io:format(“ping finished~n”, );ping(N, Pong_PID)-> Pong_PID ! {ping, self()}, receive pong -> io:format(“Ping received pong~n”, ) end, ping(N – 1, Pong_PID).pong() -> receivefinished -> io:format(“Pong finished~n”, );{ping, Ping_PID} -> io:format(“Pong received ping~n”, ), Ping_PID ! pong, pong() end.start() -> Pong_PID = spawn(tut15, pong, ), spawn(tut15, ping, [3, Pong_PID]).

    這看起來(lái)絕對(duì)是對(duì)舊有的RPC機(jī)制的一個(gè)重大提升?,F(xiàn)在你可以推想一下,如果有消息沒(méi)有到達(dá)時(shí)會(huì)發(fā)生什么事情了。Erlang還有附加的超時(shí)消息以及一個(gè)語(yǔ)言內(nèi)建的“超時(shí)”組件,可以使你以一種優(yōu)雅的方式來(lái)處理超時(shí)。

    現(xiàn)在,你選擇了你要采用的策略,選擇了恰當(dāng)?shù)姆植际剿惴ㄒ约昂线m的編程語(yǔ)言,然后就可以開(kāi)干了。你很自信能駕馭分布式編程這頭野獸了,因?yàn)槟阍僖膊皇堑谝患?jí)的水平了。

    哎呀,可惜的是這一路上并非風(fēng)平浪靜。過(guò)了一段時(shí)間,當(dāng)?shù)谝粋€(gè)版本發(fā)布后,你將陷入泥潭之中。人們會(huì)告訴你,你的分布式應(yīng)用有些問(wèn)題。問(wèn)題報(bào)告中的主題全都是和變化有關(guān)的。開(kāi)始時(shí)會(huì)出現(xiàn)“有時(shí)”或者“一次”這樣的表示頻率的詞,之后的描述變成了:系統(tǒng)處于不期望的狀態(tài),卡住不動(dòng)了。如果夠幸運(yùn),你有足夠的log信息,可以開(kāi)始著手檢查這些日志。稍后,你發(fā)現(xiàn)是一系列不幸的事件序列造成了報(bào)告中所描述的情況。確實(shí),這是個(gè)新的問(wèn)題。你從來(lái)沒(méi)有考慮過(guò)這些,而且在你做大量的測(cè)試和模擬時(shí)問(wèn)題從未出現(xiàn)過(guò)。所以,你修改代碼以將這種情況也納入考慮范圍。

    因?yàn)槟阍囍翱紤],你決定構(gòu)建一個(gè)“猴子”組件,它以偽隨機(jī)的方式讓你的分布式系統(tǒng)做些愚蠢的事情?!昂镒印痹诨\子里使勁撲騰著,很快你會(huì)發(fā)現(xiàn)在很多場(chǎng)景下都會(huì)導(dǎo)致出現(xiàn)不期望的情況,比如系統(tǒng)卡住了,或者甚至更糟糕的情況:系統(tǒng)出現(xiàn)不一致的狀態(tài),而這在分布式系統(tǒng)中是永遠(yuǎn)也不應(yīng)該發(fā)生的事情。

    構(gòu)建一個(gè)“猴子”是很棒的主意,而且它確實(shí)能減少遇到那些你從未在這個(gè)領(lǐng)域內(nèi)碰到過(guò)的怪事的幾率。因?yàn)槟阆嘈?,修改一個(gè)bug必須和發(fā)現(xiàn)這個(gè)bug的測(cè)試用例聯(lián)系起來(lái),現(xiàn)在需要回歸測(cè)試這個(gè)用例,以證明bug的消除。你現(xiàn)在只需要再構(gòu)建一次這個(gè)測(cè)試用例就可以了。可是現(xiàn)在的問(wèn)題在于,如果說(shuō)并非不可能的話,要重現(xiàn)這個(gè)錯(cuò)誤的場(chǎng)景起碼是很困難的。你向上帝祈禱,得到的啟示是:當(dāng)心存疑慮時(shí),就使用暴力法吧。因此,你構(gòu)建一個(gè)測(cè)試用例,然后讓它跑上無(wú)數(shù)次,以此來(lái)彌補(bǔ)這極小的失敗概率。這會(huì)使你解決bug的過(guò)程變得緩慢,而且你的測(cè)試套件會(huì)變得笨重。通過(guò)對(duì)你的測(cè)試集做分而治之的處理,你不得不再次做一些補(bǔ)償。無(wú)論如何,經(jīng)過(guò)在時(shí)間和精力上的大量投入之后,你終于設(shè)法得到了一個(gè)較為穩(wěn)定的系統(tǒng)。

    你在第2級(jí)已經(jīng)到頂了,如果沒(méi)有新的啟示,你將永遠(yuǎn)卡在這一級(jí)。

    第3級(jí):分布式算法異步消息傳遞純函數(shù)式

    我們需要花點(diǎn)時(shí)間才能意識(shí)到:長(zhǎng)時(shí)間運(yùn)行“猴子”以此發(fā)現(xiàn)系統(tǒng)中的缺陷然后再結(jié)合暴力法來(lái)重現(xiàn)它們,這種做法并不可取。使用暴力法重現(xiàn)只會(huì)顯示出你的無(wú)知。你需要的關(guān)鍵性的啟示之一是,如果你可以只將等式中的不確定性拿掉的話,你就可以完美的對(duì)每一種場(chǎng)景做重現(xiàn)了。第2級(jí)分布式編程的一個(gè)重大的缺點(diǎn)是:你的并發(fā)模型往往會(huì)成為你代碼庫(kù)中的病毒。你希望有細(xì)粒度的并發(fā)控制,好吧,你得到了,代碼里到處都是。因此是并發(fā)導(dǎo)致了不確定性,而不確定性造成了麻煩。因此必須得把并發(fā)給踢出去??墒悄阌植荒軖仐壊l(fā),你需要它。那么,你一定要禁止把并發(fā)和你的分布式狀態(tài)機(jī)結(jié)合在一起。換句話說(shuō),你的分布式狀態(tài)機(jī)必須成為純函數(shù)式的。沒(méi)有IO操作,沒(méi)有并發(fā),什么都沒(méi)有。你的狀態(tài)機(jī)特征看起來(lái)應(yīng)該是這樣的:

    module type SM = sigtype statetype actiontype msgval step: msg -> state -> action * stateend

    你傳入一個(gè)消息和一個(gè)狀態(tài),你得到一個(gè)操作和一個(gè)結(jié)果狀態(tài)。操作基本上就是任何試著改變外部世界的東西,需要一定的時(shí)間來(lái)完成,嘗試的過(guò)程中可能會(huì)失敗。典型的操作有:

    發(fā)送一個(gè)消息安排一次超時(shí)將數(shù)據(jù)存儲(chǔ)在持久性的存儲(chǔ)介質(zhì)內(nèi)…

    這里要意識(shí)到的重要部分是:你只能通過(guò)一個(gè)新的消息來(lái)得到新的狀態(tài),再無(wú)其他。在這種嚴(yán)格的規(guī)定下所得到的好處是很多的。完美的控制,完美的重現(xiàn)能力以及完美的可追蹤性。為此而得到的開(kāi)銷也同樣存在,你將被迫使所有的操作都變得具體化。而這些基本上就是為了減少程序復(fù)雜性而附加的一層間接。你還需要將每一個(gè)你關(guān)心的外部世界變化都建模為一個(gè)消息。

    相比第2級(jí)的分布式編程,另一個(gè)改變?cè)谟诳刂屏鳌T诘?級(jí)中,客戶端會(huì)嘗試強(qiáng)制更新并動(dòng)態(tài)設(shè)置狀態(tài)。而在這里,分布式狀態(tài)機(jī)假定有完全的控制力,并且只有當(dāng)它準(zhǔn)備就緒,可以做些有用的事情時(shí)才會(huì)考慮客戶端的請(qǐng)求。因此這些必須分離開(kāi)來(lái)。

    如果你把這些道理解釋給一個(gè)2級(jí)的分布式系統(tǒng)架構(gòu)師聽(tīng),他可能或多或少的會(huì)把這個(gè)當(dāng)成一種替代方案。然而,你需要經(jīng)歷足夠多的痛苦之后才會(huì)意識(shí)到這是唯一可行的選擇,我們姑且把這些痛苦稱為經(jīng)驗(yàn)吧。

    第4級(jí)對(duì)分布式系統(tǒng)領(lǐng)域的深刻理解:快樂(lè),好心態(tài),好好睡一覺(jué)

    老實(shí)說(shuō),我現(xiàn)在只是第3級(jí)水平,我也不知道在這一級(jí)里有什么新鮮玩意。我深信,函數(shù)式編程和異步消息傳遞是分布式系統(tǒng)謎題的一部分,但這些還不夠。

    請(qǐng)?jiān)试S我重申我所反對(duì)的東西。首先,我希望我的分布式算法實(shí)現(xiàn)能夠涵蓋到所有的可能情況。這對(duì)我而言是個(gè)大問(wèn)題,我已經(jīng)在系統(tǒng)部署的問(wèn)題上犧牲掉了很多睡眠時(shí)間。大部分問(wèn)題都是PEBKAC類的(Problem Exists Between Keyboard And Chair意指用戶引起的錯(cuò)誤),但有一些確是真正的問(wèn)題,這給我造成了一些挫敗感。知道自己實(shí)現(xiàn)的健壯性程度是很好的。我應(yīng)該試試證明一下那些定理嗎?我應(yīng)該做更詳盡的測(cè)試嗎?我不知道。

    附帶提一下,github上有一個(gè)稱為baardskeerder的僅用于插入操作的B-樹(shù)庫(kù),我們知道可以通過(guò)詳盡的生成插入/刪除排列并斷言它們的正確性之后,我們就可以涵蓋到所有的情況。但這里,并沒(méi)有那么簡(jiǎn)單,而且我對(duì)于要對(duì)整個(gè)代碼庫(kù)做Coqify處理(Coq是一個(gè)正式的證明管理系統(tǒng),它在一種半交互式的環(huán)境下提供了一個(gè)正式的語(yǔ)言用來(lái)編寫數(shù)學(xué)定義、可執(zhí)行的算法和定理,用計(jì)算機(jī)來(lái)做檢查證明,這里作者生造出了Coqify這個(gè)詞)還有些猶豫。

    第二,為了保持清晰和簡(jiǎn)單,我決定不去碰其它一些正交性的需求。比如,服務(wù)發(fā)現(xiàn)、認(rèn)證、授權(quán)、私密性以及性能。

    說(shuō)到性能,我們也許是幸運(yùn)的,至少異步消息傳遞似乎與性能方面并不產(chǎn)生矛盾。安全性則完全是一個(gè)XX(作者真的爆粗口了…),因?yàn)樗鼛缀跚袛嗔怂心闼龅氖虑?。有些人把安全性看成是一種調(diào)味醬汁,你只要把它倒在你的應(yīng)用程序上就可以保證安全了。哎,在這方面我從未取得過(guò)成功,而且現(xiàn)在我也認(rèn)為這個(gè)問(wèn)題需要在設(shè)計(jì)的最初階段從宏觀的角度策略性的去分析解決。

    結(jié)語(yǔ)

    開(kāi)發(fā)出健壯的分布式系統(tǒng)是個(gè)頗為棘手的問(wèn)題,實(shí)際上根本沒(méi)有完美的解決方案,或者說(shuō)至少?zèng)]有讓我覺(jué)得完全滿意的解決方案。我敢肯定分布式系統(tǒng)的重要性將隨著處理器和其它一切事物之間的延遲增加而顯著提高。這一結(jié)果使得這種類型的應(yīng)用程序開(kāi)發(fā)變得愈發(fā)繁榮。

    至于分布式編程的第4級(jí),也許我該去問(wèn)問(wèn)Peter Van Roy。這么些年來(lái),我閱讀了很多他寫的論文,這些論文對(duì)于我自己的一些錯(cuò)誤認(rèn)識(shí)給了很多啟示。關(guān)于這些啟示的缺點(diǎn)嘛,你常常在大部分時(shí)間里看到別人在重復(fù)自己的錯(cuò)誤,但我無(wú)法說(shuō)服他們應(yīng)該換種方式去做。

    也許,這是因?yàn)槲覠o(wú)法提供他們想要的那種靈丹妙藥。他們就想要RPC,而且他們希望這樣能搞定問(wèn)題。這是固執(zhí)的…就像宗教信仰一樣。

以上就是分布式系統(tǒng)原理、應(yīng)用、編程等方面的全部?jī)?nèi)容,如果你覺(jué)得意猶未盡,請(qǐng)閱讀下面幾篇內(nèi)容。

    GFS概念解讀:可擴(kuò)展的分布式文件系統(tǒng)

    HDFS概念解讀:Hadoop分布式文件系統(tǒng)

    解析:分布式文件系統(tǒng)存儲(chǔ)的工作原理

    分布式光伏發(fā)電原理應(yīng)用以及補(bǔ)貼政策全解

責(zé)任編輯:陳卓陽(yáng)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多