1. 程式人生 > >阿裏飛天雲平臺架構簡介

阿裏飛天雲平臺架構簡介

remote 訪問權限 客戶端程序 std clust ado 將不 多維 文件訪問

飛天是由阿裏雲開發的一個大規模分布式計算系統,其中包括飛天內核和飛天開放服務。

飛天內核負責管理數據中心Linux集群的物理資源,控制分布式程序運行, 隱藏下層故障恢復和數據冗余等細節,有效提供彈性計算和負載均衡。如圖所示,飛天體系架構主要包含四大塊:1、資源管理、安全、遠程過程調用等構建分布式系統常用的底層服務;2、分布式文件系統;3、任務調度;4、集群部署和監控。

技術分享圖片

飛天開放服務為用戶應用程序提供了計算和存儲兩方面的接口和服務,包括彈性計算服務(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 應用運行和托管的平臺。

  阿裏雲計算有限公司(簡稱“阿裏雲”)成立於2009年9月10日,致力於打造雲計算的基礎服務平臺,註重為中小企業提供大規模、低成本、高可靠的雲計算應用及服務。飛天開放平臺(簡稱“飛天平臺”或者“飛天”)是由阿裏雲自主研發完成的公共雲計算平臺,該平臺所提供的服務於2011年7月28日在www.aliyun.com正式上線,推出了第一個雲服務——彈性計算服務。截至本書出版時,阿裏雲已經推出了包括彈性計算服務、開放存儲服務、關系型數據庫服務、開放結構化數據服務在內的一系列服務和產品。

  飛天平臺內核包含的模塊可以分為以下幾部分。

  • 分布式系統底層服務:提供分布式環境下所需要的協調服務、遠程過程調用、安全管理和資源管理的服務。這些底層服務為上層的分布式文件系統、任務調度等模塊提供支持。
  • 分布式文件系統:提供一個海量的、可靠的、可擴展的數據存儲服務,將集群中各個節點的存儲能力聚集起來,並能夠自動屏蔽軟硬件故障,為用戶提供不間斷的數據訪問服務;支持增量擴容和數據的自動平衡,提供類似於POSIX的用戶空間文件訪問API,支持隨機讀寫和追加寫的操作。
  • 任務調度:為集群系統中的任務提供調度服務,同時支持強調響應速度的在線服務(Online Service)和強調處理數據吞吐量的離線任務(Batch Processing Job);自動檢測系統中故障和熱點,通過錯誤重試、針對長尾作業並發備份作業等方式,保證作業穩定可靠地完成。
  • 集群監控和部署:對集群的狀態和上層應用服務的運行狀態和性能指標進行監控,對異常事件產生警報和記錄;為運維人員提供整個飛天平臺以及上層應用的部署和配置管理,支持在線集群擴容、縮容和應用服務的在線升級。

  分布式系統底層服務

  1. 協調服務(女媧)

  女媧(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,客戶端隨後可以從中選擇一個節點發出自己的請求,從而實現負載均衡。

  2. 遠程過程調用(誇父)

  在分布式系統中,不同計算機之間只能通過消息交換的方式進行通信。顯式的消息通信必須通過Socket接口編程,而遠程過程調用(Remote Procedure Call,RPC)可以隱藏顯式的消息交換,使得程序員可以像調用本地函數一樣來調用遠程的服務。

  誇父(Kuafu)是飛天平臺內核中負責網絡通信的模塊,它提供了一個RPC的接口,簡化編寫基於網絡的分布式應用。誇父的設計目標是提供高可用(7×24小時)、大吞吐量(Gigabyte)、高效率、易用(簡明API、多種協議和編程接口)的RPC服務。

  RPC客戶端(RPC Client)通過URI指定請求需要發送的RPC服務端(RPC Server)的地址,目前誇父支持兩種協議形式。

  • TCP:例如,tcp://fooserver01:9000
  • Nuwa:例如,nuwa://nuwa01/FooServer

  與用流(stream)傳輸的TCP通信相比,誇父通信是以消息(Message)為單位的,支持多種類型的消息對象,包括標準字符串std::string和基於std::map實現的若幹string鍵值對。

  誇父RPC同時支持異步(asynchronous)和同步(synchronous)的遠程過程調用形式。

  • 異步調用:RPC函數調用時不等接收到結果就會立即返回;用戶必須通過顯式調用接收函數取得請求結果。
  • 同步調用:RPC函數調用時會等待,直到接收到結果才返回。在實現中,同步調用是通過封裝異步調用來實現的。

  在誇父的實現中,客戶端程序通過Unix Domain Socket與本機上的一個誇父代理(Kuafu Proxy)連接,不同計算機之間的誇父代理會建立一個TCP連接。這樣做的好處是可以更高效地使用網絡帶寬,系統可以支持上千臺計算機之間的互聯需求。此外,誇父利用女媧來實現負載均衡;對大塊數據的傳輸做了優化;與TCP類似,誇父代理之間還實現了發送端和接收端的流控(Flow Control)機制。

  3. 安全管理(鐘馗)

  鐘馗(Zhongkui)是飛天平臺內核中負責安全管理的模塊,它提供了以用戶為單位的身份認證和授權,以及對集群數據資源和服務進行的訪問控制。

  • 用戶的身份認證(Authentication)是基於密鑰機制的。
  • 用戶對資源的訪問控制是基於權能(Capability)機制進行授權(Authorization)的。

  Capability是用於訪問控制的一種數據結構,它定義了對一個或多個指定的資源(如目錄、文件、表等)所具有的訪問權限。用戶訪問飛天系統的資源時必須持有Capability,否則即視為非法。打一個比方,如果把Capability理解為地鐵票,乘坐地鐵(對地鐵的一種訪問方式)的時候必須要有Capability,即地鐵票。

  密鑰對是基於公開密鑰方法的,包括一個私鑰和相對應的公鑰。在飛天平臺系統中,密鑰對用於數字簽名服務,以保證Capability的不可偽造。換句話說,私鑰用於產生數字簽名(如簽發Capability),公鑰用於驗證數字簽名的有效性(如驗證簽發過的Capability的有效性)。

  考慮到網絡通信時任何通信節點都是不可信的,所以即使是飛天自身模塊內部之間的通信也同樣是需要認證和授權的,而且驗證的機制也完全一樣。

  分布式文件系統(盤古)

  盤古(Pangu)是一個分布式文件系統,盤古系統的設計目標是將大量通用機器的存儲資源聚合在一起,為用戶提供大規模、高可靠、高可用、高吞吐量和可擴展的存儲服務,是飛天平臺內核中的一個重要組成部分。

  • 大規模:能夠支持數十PB量級的存儲大小(1PB=1000TB),總文件數量達到億量級。
  • 數據高可靠性:保證數據和元數據(Metadata)是持久保存並能夠正確訪問的,保證所有數據存儲在處於不同機架的多個節點上面(通常設置為3)。即使集群中的部分節點出現硬件和軟件故障,系統能夠檢測到故障並自動進行數據的備份和遷移,保證數據的安全存在。
  • 服務高可用性:保證用戶能夠不中斷地訪問數據,降低系統的不可服務時間。即使出現軟硬件的故障、異常和系統升級等情況,服務仍可正常訪問。
  • 高吞吐量:運行時系統I/O吞吐量能夠隨機器規模線性增長,保證響應時間。
  • 高可擴展性:保證系統的容量能夠通過增加機器的方式得到自動擴展,下線機器存儲的數據能夠自動遷移到新加入的節點上。

  同時,盤古系統也能很好地支持在線應用的低延時需求。在盤古系統中,文件系統的元數據存儲在多個主服務器(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負責。

  1. 在線服務調度

  在飛天平臺內核中,每個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)等操作。

  2. 離線任務調度

  在飛天平臺中,一個離線任務(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。

  集群監控和部署

  1. 集群監控(神農)

  神農(Shennong)是飛天平臺內核中負責信息收集、監控和診斷的模塊。它通過在每臺物理機器上部署輕量級的信息采集模塊,獲取各個機器的操作系統與應用軟件運行狀態,監控集群中的故障,並通過分析引擎對整個飛天的運行狀態進行評估。

  神農系統包括Master、Inspector和Agent三個部分。

  • Master:負責管理所有神農Agent,並對外提供統一的接口來處理神農用戶的訂閱(Subscription)請求,在集群中只有一個Master。
  • Inspector:是部署在每一臺機器上的進程,負責采集當前機器和進程的通用信息,並實時發送給該機器上的神農Agent。
  • Agent:是部署在每臺物理機器的後臺程序。Agent負責接受來自應用和Inspector寫入的信息。Agent啟動後,會立刻向Master註冊自己,並根據Master發來的訂閱(Subscription)命令執行相應的信息采集、過濾、聚合和處理操作。目前神農Agent處理的數據分為兩類:事件類數據(如應用程序故障和報警)和數值類數據(如當前應用的性能計數、機器I/O吞吐量等)。

  神農的用戶通過Master來訪問神農系統,以數據訂閱(Subscription)的方式獲取神農系統采集到的信息。

  神農的MonitorService和AnalysisService是使用神農系統的兩個應用程序。

  • MonitorService在集群中的一臺機器上部署,通過向各個Agent發送特定的監控請求,並根據配置設定的規則,實現對集群的狀態和事件的監控,以及報警和記錄。
  • AnalysisService也是部署在集群中的一臺機器上,通過訪問神農來獲得主要性能數據,然後聚合數據並計算出系統的總體資源情況(例如,集群的總資源消耗、總I/O吞吐量等),並且向外提供計算結果供查詢。

  2. 集群部署(大禹)

  大禹(Dayu)是飛天內核中負責提供配置管理和部署的模塊,它包括一套為集群的運維人員提供的完整工具集,功能涵蓋了集群配置信息的集中管理、集群的自動化部署、集群的在線升級、集群擴容、集群縮容,以及為其他模塊提供集群基本信息等。每個飛天模塊的發布包都包含一個部署升級的描述文件,定義了該模塊部署和升級的流程,提供給大禹使用。

  在結構上,大禹包含了集群配置數據庫、節點守護進程、客戶端工具集等部分。

  集群配置數據庫負責存放和管理所有部署了飛天的集群的配置信息,包括集群中每個節點承擔的角色、各個模塊的軟件版本、各個模塊的基本參數配置等。同時,數據庫中還記錄了部署或升級時每個節點的任務執行狀態,保證了在部署或升級時少量不在線節點可以在重新連線後進行自動修復。

  節點守護進程運行在集群的每一個節點上,負責與集群配置數據庫同步該節點相關的集群信息,執行節點相關的具體運維任務,並匯報任務執行狀態。節點守護進程本身是自我升級的,只需部署一次,即能保證運行的是該集群最適合的版本。在模塊軟件部署和升級的過程中,節點守護進程還負責軟件的下載分發,為了保證效率和規避單點故障,軟件的分發采用P2P的方式進行。

  客戶端工具集是運維人員實際使用的命令行工具和網頁界面,運維人員通過這些工具對集群進行部署、升級、擴容、縮容等具體操作。大部分操作都提供了自動化和人機交互執行兩種方式,分別適應簡便操作和精細化控制這兩種場景。在部署和升級的過程中,客戶端工具負責控制總體的操作順序,維護模塊之間的依賴關系,並根據狀態信息決定是否回滾或中斷當前流程。

阿裏飛天雲平臺架構簡介