原貼在這裏:http://blog.csdn.net/yangcs2009/article/details/39292097。我作了部分修改。mysql
飛天是由阿里雲開發的一個大規模分佈式計算系統,其中包括飛天內核和飛天開放服務。linux
飛天內核負責管理數據中心Linux集羣的物理資源,控制分佈式程序運行, 隱藏下層故障恢復和數據冗餘等細節,有效提供彈性計算和負載均衡。如圖所示,飛天體系架構主要包含四大塊:程序員
一、資源管理、安全、遠程過程調用等構建分佈式系統經常使用的底層服務;sql
二、分佈式文件系統;數據庫
三、任務調度;編程
四、集羣部署和監控。安全
飛天開放服務爲用戶應用程序提供了計算和存儲兩方面的接口和服務,包括:服務器
彈性計算服務(Elastic ComputeService,簡稱ECS)網絡
開放存儲服務(Open Storage Service,簡稱OSS)數據結構
開放結構化數據服務(Open Table Service,簡稱OTS)
關係型數據庫服務(Relational Database Service,簡稱RDS)
開放數據處理服務(Open Data Processing Service,簡稱ODPS)
並基於彈性計算服務提供了雲服務引擎(Aliyun Cloud Engine,簡稱ACE)做爲第三方應用開發和Web 應用運行和託管的平臺。反正左右的這些服務,你本身去阿里雲官網看一下,就會一目瞭然。
飛天平臺內核包含的模塊能夠分爲如下幾部分。
女媧(Nuwa)系統爲飛天提供高可用的協調服務(Coordination Service),是構建各種分佈式應用的核心服務,它的做用是採用相似文件系統的樹形命名空間來讓分佈式進程互相協同工做。例如,當集羣變動致使特定的服務被迫改變物理運行位置時,如服務器或者網絡故障、配置調整或者擴容時,藉助女媧系統可使其餘程序快速定位到該服務新的接入點,從而保證了整個平臺的高可靠性和高可用性。
女媧系統基於類Paxos協議,由多個女媧Server以相似文件系統的樹形結構存儲數據,提供高可用、高併發用戶請求的處理能力。
女媧系統的目錄表示一個包含文件的集合。與UNIX中的文件路徑同樣,女媧中路徑是以「/」分割的,根目錄(Root entry)的名字是「/」,全部目錄的名字都是以「/」結尾的。與UNIX文件路徑不一樣之處在於:女媧系統中全部文件或目錄都必須使用從根目錄開始的絕對路徑。因爲女媧系統的設計目的是提供協調服務,而不是存儲大量數據,因此每一個文件的內容(Value)的大小被限制在1MB之內。在女媧系統中,每一個文件或目錄都保存有建立者的信息。一旦某個路徑被用戶建立,其餘用戶就能夠訪問和修改這個路徑的值(即文件內容或目錄包含的文件名)。
女媧系統支持Publish/Subscribe模式,其中一個發佈者、多個訂閱者(One Publisher/Many Subscriber)的模式提供了基本的訂閱功能;另外,還可用經過多個發佈者、多個訂閱者(Many Publisher/Many Subscriber)的方式提供分佈式選舉(DistributedElection)和分佈式鎖的功能。
再舉一個使用女媧系統來實現負載均衡的例子:提供某一服務的多個節點,在服務啓動的時候在女媧系統的同一目錄下建立文件,例如,server1建立文件「nuwa://cluster/ myservice/server1」,server2在同一目錄下建立「nuwa://cluster/myservice/server2」。當客戶端使用遠程過程調用時,首先列舉女媧系統服務中「nuwa://cluster/myservice」目錄下的文件,這樣就能夠得到server1和server2,客戶端隨後能夠從中選擇一個節點發出本身的請求,從而實現負載均衡。
在分佈式系統中,不一樣計算機之間只能經過消息交換的方式進行通訊。顯式的消息通訊必須經過Socket接口編程,而遠程過程調用(Remote Procedure Call,RPC)能夠隱藏顯式的消息交換,使得程序員能夠像調用本地函數同樣來調用遠程的服務。
夸父(Kuafu)是飛天平臺內核中負責網絡通訊的模塊,它提供了一個RPC的接口,簡化編寫基於網絡的分佈式應用。夸父的設計目標是提供高可用(7×24小時)、大吞吐量(Gigabyte)、高效率、易用(簡明API、多種協議和編程接口)的RPC服務。
RPC客戶端(RPC Client)經過URI指定請求須要發送的RPC服務端(RPC Server)的地址,目前夸父支持兩種協議形式。
與用流(stream)傳輸的TCP通訊相比,夸父通訊是以消息(Message)爲單位的,支持多種類型的消息對象,包括標準字符串std::string和基於std::map實現的若干string鍵值對。
夸父RPC同時支持異步(asynchronous)和同步(synchronous)的遠程過程調用形式。
在夸父的實現中,客戶端程序經過Unix Domain Socket與本機上的一個夸父代理(Kuafu Proxy)鏈接,不一樣計算機之間的夸父代理會創建一個TCP鏈接。這樣作的好處是能夠更高效地使用網絡帶寬,系統能夠支持上千臺計算機之間的互聯需求。此外,夸父利用女媧來實現負載均衡;對大塊數據的傳輸作了優化;與TCP相似,夸父代理之間還實現了發送端和接收端的流控(Flow Control)機制。
鍾馗(Zhongkui)是飛天平臺內核中負責安全管理的模塊,它提供了以用戶爲單位的身份認證和受權,以及對集羣數據資源和服務進行的訪問控制。
Capability是用於訪問控制的一種數據結構,它定義了對一個或多個指定的資源(如目錄、文件、表等)所具備的訪問權限。用戶訪問飛天系統的資源時必須持有Capability,不然即視爲非法。打一個比方,若是把Capability理解爲地鐵票,乘坐地鐵(對地鐵的一種訪問方式)的時候必需要有Capability,即地鐵票。
密鑰對是基於公開密鑰方法的,包括一個私鑰和相對應的公鑰。在飛天平臺系統中,密鑰對用於數字簽名服務,以保證Capability的不可僞造。換句話說,私鑰用於產生數字簽名(如簽發Capability),公鑰用於驗證數字簽名的有效性(如驗證簽發過的Capability的有效性)。
考慮到網絡通訊時任何通訊節點都是不可信的,因此即便是飛天自身模塊內部之間的通訊也一樣是須要認證和受權的,並且驗證的機制也徹底同樣。
盤古(Pangu)是一個分佈式文件系統,盤古系統的設計目標是將大量通用機器的存儲資源聚合在一塊兒,爲用戶提供大規模、高可靠、高可用、高吞吐量和可擴展的存儲服務,是飛天平臺內核中的一個重要組成部分。
同時,盤古系統也能很好地支持在線應用的低延時需求。在盤古系統中,文件系統的元數據存儲在多個主服務器(Master)上,文件內容存儲在大量的塊服務器(Chunk Server)上。客戶端程序在使用盤古系統時,首先從主服務器獲取元數據信息(包括接下來與哪些塊服務器交互),而後在塊服務器上直接進行數據操做。因爲元數據信息很小,大量的數據交互是客戶端直接與塊服務器進行的,所以盤古系統採用少許的主服務器來管理元數據,並使用Paxos協議保證元數據的一致性。此外,塊大小被設置爲64MB,進一步減小了元數據的大小,所以能夠將元數據所有放到內存裏,從而使得主服務器可以處理大量的併發請求。
塊服務器負責存儲大小爲64MB的數據塊。在向文件寫入數據以前,客戶端將創建到3個塊服務器的鏈接,客戶向主副本(Replica)寫入數據之後,由主副本負責向其餘副本發送數據。與直接由客戶端向3個副本寫入數據相比,這樣能夠減小客戶端的網絡帶寬使用。塊副本在放置的時候,爲保證數據可用性和最大化地使用網絡帶寬,會將副本放置在不一樣機架上,並優先考慮磁盤利用率低的機器。當硬件故障或數據不可用形成數據塊的副本數目不滿3份時,數據塊會被從新複製。爲保證數據的完整性,每塊數據在寫入時會同時計算一個校驗值,與數據同時寫入磁盤。當讀取數據塊時,塊服務器會再次計算校驗值與以前存入的值是否相同,若是不一樣就說明數據出現了錯誤,須要從其餘副本從新讀取數據。
在線應用對盤古系統提出了與離線應用不一樣的挑戰:OSS、OTS要求低時延數據讀寫,ECS在要求低時延的同時還須要具有隨機寫的能力。針對這些需求,盤古系統實現了事務日誌文件和隨機訪問文件,用於支撐在線應用。其中,日誌文件經過多種方法對時延進行了優化,包括設置更高的優先級、由客戶端直接寫多份拷貝而不是用傳統的流水線方式、寫入成功不通過Master確認等。隨機訪問文件則容許用戶隨機讀寫,同時也應用了相似日誌文件的時延優化技術。
伏羲(Fuxi)是飛天平臺內核中負責資源管理和任務調度的模塊,同時也爲應用開發提供了一套編程基礎框架。伏羲同時支持強調響應速度的在線服務和強調處理數據吞吐量的離線任務。在伏羲中,這兩類應用分別簡稱爲Service和Job。
在資源管理方面,伏羲主要負責調度和分配集羣的存儲、計算等資源給上層應用;管理運行在集羣節點上任務的生命週期;在多用戶運行環境中,支持計算額度、訪問控制、做業優先級和資源搶佔,在保證公平的前提下,達到有效地共享集羣資源。
在任務調度方面,伏羲面向海量數據處理和大規模計算類型的複雜應用,提供了一個數據驅動的多級流水線並行計算框架,在表述能力上兼容MapReduce、Map-Reduce-Merge等多種編程模式;自動檢測故障和系統熱點,重試失敗任務,保證做業穩定可靠運行完成;具備高可擴展性,可以根據數據分佈優化網絡開銷。
伏羲中應用了「Master/Worker」工做模型。其中,Master負責進行資源申請和調度、爲Worker建立工做計劃(Plan)並監控Worker的生命週期,Worker負責執行具體的工做計劃並及時向Master彙報工做狀態(Status)。此外,Master支持多級模式,即一個Master能夠隸屬於另一個Master之下。
伏羲Master負責整個集羣資源管理和調度,處理Job/Service啓動、中止、Failover等生命週期的維護。同時伏羲Master支持多用戶額度配置、Job/Service的多優先級設置和動態資源搶佔邏輯,能夠說是飛天平臺的「大腦」。伏羲對資源調度是多維度的,能夠根據CPU、內存等系統資源,以及應用自定義的虛擬資源對整個機羣進行資源分配和調度。
土伯(Tubo)是部署在每臺由伏羲管理的機器上的後臺進程,負責收集並向伏羲Master報告本機的狀態,包括系統資源的消耗、Master或Worker進程的運行、等待、完成和失敗事件,並根據伏羲Master或者Job/Service Master的指令,啓動或殺死指定的Master或Worker進程。同時土伯還負責對計算機健康情況進行監控,對異常Worker(好比內存超用)進行及時的清理和彙報。
對於在線服務(Service),由伏羲Master負責ServiceMaster的啓動與狀態監控,處理相應Service Master的資源申請請求。Service Master負責管理Service Worker的任務分配、生命週期管理以及Failover的管理。
對於離線任務(Job),伏羲Master負責Job Master的啓動與狀態監控,處理相應JobMaster的資源申請請求。Job Master根據用戶輸入的Job描述文件,將任務分解成一個或以上的Task,每一個Task的資源申請、Task Worker的調度和生命週期維護由Task Master負責。
在飛天平臺內核中,每一個Service都有一個ServiceMaster和多個不一樣角色(Role)的Service Worker,它們一塊兒協同工做來完成整個服務的功能。Service Master是伏羲Master管理下的子Master(Child Master),它負責這個Service相關的資源申請、狀態維護以及故障恢復,並按期與伏羲Master進行交互,確保整個Service正確、正常地運行。每一個Service Worker的角色和執行的動做,都是由用戶來定義的。
每一個ServiceWorker負責處理一個到多個數據分片(Partition),同一時刻一個分片只會被分配到一個Service Worker處理。將數據分割成爲互不相關的分片,而後將不一樣分片給不一樣Service Worker來處理是構建大規模應用服務的關鍵特性。數據分片是一個抽象的概念,在不一樣的應用中有不一樣的含義。
在服務運行的過程當中,每一個Service的數據分片的數目和內容都是能夠動態變化的,應用程序能夠根據實際須要對數據分片動態地進行加載(Load)、卸載(Unload)、分裂(Split)和遷移(Migrate)等操做。
在飛天平臺中,一個離線任務(Job)的執行過程被抽象爲一個有向無環圖(Directed Acyclic Graph,DAG):圖上每一個頂點對應一個Task,每條邊對應一個Pipeline。一個鏈接兩個Task的Pipeline表示前一個Task的輸出是後一個Task的輸入。
每一個離線任務都有一個JobMaster負責根據用戶輸入的任務描述(Job description)構造DAG和調度DAG中全部Task的執行。每一個Task的Task Master會根據要處理的實例數量、數據在集羣的分佈及處理實例的資源需求,向伏羲Master申請機器資源並分配Task Worker在其上執行。分配到每臺機器上的實例(Instance)是由Task Worker來具體執行完成的。每臺機器上的Task Worker能夠根據須要選擇多線程或者多進程的不一樣運行模式。
在離線Job的容錯方面,除了提供對異常機器的黑名單機制、長尾Instance的後備Worker機制外,伏羲還提供了快照(Snapshot)機制。快照是Task級別的容錯機制。若是一個Task的n個Instance在前一次運行失敗時完成了m個,那麼Task重啓後只會從新調度運行剩餘的n−m個Instance。
神農(Shennong)是飛天平臺內核中負責信息收集、監控和診斷的模塊。它經過在每臺物理機器上部署輕量級的信息採集模塊,獲取各個機器的操做系統與應用軟件運行狀態,監控集羣中的故障,並經過分析引擎對整個飛天的運行狀態進行評估。
神農系統包括Master、Inspector和Agent三個部分。
神農的用戶經過Master來訪問神農系統,以數據訂閱(Subscription)的方式獲取神農系統採集到的信息。
神農的MonitorService和AnalysisService是使用神農系統的兩個應用程序。
大禹(Dayu)是飛天內核中負責提供配置管理和部署的模塊,它包括一套爲集羣的運維人員提供的完整工具集,功能涵蓋了集羣配置信息的集中管理、集羣的自動化部署、集羣的在線升級、集羣擴容、集羣縮容,以及爲其餘模塊提供集羣基本信息等。每一個飛天模塊的發佈包都包含一個部署升級的描述文件,定義了該模塊部署和升級的流程,提供給大禹使用。
在結構上,大禹包含了集羣配置數據庫、節點守護進程、客戶端工具集等部分。
集羣配置數據庫負責存放和管理全部部署了飛天的集羣的配置信息,包括集羣中每一個節點承擔的角色、各個模塊的軟件版本、各個模塊的基本參數配置等。同時,數據庫中還記錄了部署或升級時每一個節點的任務執行狀態,保證了在部署或升級時少許不在線節點能夠在從新連線後進行自動修復。
節點守護進程運行在集羣的每個節點上,負責與集羣配置數據庫同步該節點相關的集羣信息,執行節點相關的具體運維任務,並彙報任務執行狀態。節點守護進程自己是自我升級的,只需部署一次,即能保證運行的是該集羣最適合的版本。在模塊軟件部署和升級的過程當中,節點守護進程還負責軟件的下載分發,爲了保證效率和規避單點故障,軟件的分發採用P2P的方式進行。
客戶端工具集是運維人員實際使用的命令行工具和網頁界面,運維人員經過這些工具對集羣進行部署、升級、擴容、縮容等具體操做。大部分操做都提供了自動化和人機交互執行兩種方式,分別適應簡便操做和精細化控制這兩種場景。在部署和升級的過程當中,客戶端工具負責控制整體的操做順序,維護模塊之間的依賴關係,並根據狀態信息決定是否回滾或中斷當前流程。