Ambari源碼架構及原理分析

1、Ambari project

1.1、基本概念

  1. Resource:Ambari把可以被管理的資源的抽象爲一個Resource實例,資源可以包括服務、組件、主機節點等,一個resource實例中包含了一系列該資源的屬性;

  2. Property:服務組件的指標名稱;

  3. ResourceProvider和PropertyProvider分別對應Resource和Property的提供方,獲取指標需要先獲取Resource,然後獲取Property對應的metric;

  4. Query:Query是Resource的內部對象,代表了對該資源的操作;

  5. Request:一個Request代表了對Resource的操作請求,包含http信息及要操作的Resource的實例,Request按照http的請求方式分爲四種:GET、PUT、DELETE、POST;

  6. Predicate:一個Predicate代表了一系列表達式,如and、or等;

1.2、源碼項目模塊

module description
ambari-server Ambari的Server程序,主要管理部署在每個節點上的管理監控程序
Ambari-agent 部署在監控節點上運行的管理監控程序
Contrib 自定義第三方庫
ambari-web Ambari頁面UI的代碼,作爲用戶與Ambari server交互的。
ambari-views 用於擴展Ambari Web UI中的框架
Docs 文檔
ambari-common Ambari-server 和Ambari-agent 共用的代碼

2、Ambari Modules

2.1、Ambari-Server

2.1.1、架構

  1. 對外,Ambarii-Server提供ambari web,rest api,ambari shell三大方式操作機羣;

  2. ambari將集羣的配置、各個服務的配置等信息存在ambari server端的DB中(比如可以是postgresql);

  3. ambari server與ambari agent的交流走RPC,即agent向server報告心跳,server將command通過respons發回給agent,agent本地執行命令,比如:agent端執行相應的python腳本;

  4. ambari有自己的一套監控、告警、鏡像服務,以可插拔的形式供上層服務調用;

在這裏插入圖片描述

Ambari-Server是一個WEB Server,提供統一的REST API接口,同時向web和agent開放了兩個不同的端口(默認前者是8080, 後者是8440或者8441)。它是由Jetty Server容器構建起來的,通過Spring Framework構建出來的WEB服務器,其中大量採用了google提供的Guice註解完成spring框架所需要的注入功能(想一想,之前spring框架需要加載一個applicationcontext.xml文件來把bean注入進來,現在可以用Guice註解的方式就可以輕鬆完成)。 REST框架由JAX-RS標準來構建

如下圖所示,server端主要維護三類狀態:

  1. Live Cluster State:集羣現有狀態,各個節點彙報上來的狀態信息會更改該狀態;

  2. Desired State:用戶希望該節點所處狀態,是用戶在頁面進行了一系列的操作,需要更改某些服務的狀態,這些狀態還沒有在節點上產生作用;

  3. Action State:操作狀態,是狀態改變時的請求狀態,也可以看作是一種中間狀態,這種狀態可以輔助Live Cluster State向Desired State狀態轉變。

在這裏插入圖片描述
Ambari-server的Heartbeat Handler模塊用於接收各個agent的心跳請求(心跳請求裏面主要包含兩類信息:節點狀態信息和返回的操作結果),把節點狀態信息傳遞給FSM狀態機去維護着該節點的狀態,並且把返回的操作結果信息返回給Action Manager去做進一步的處理。

Coordinator模塊又可以稱爲API handler,主要在接收WEB端操作請求後,會檢查它是否符合要求,stage planner分解成一組操作,最後提供給Action Manager去完成執行操作

因此,從上圖就可以看出,Ambari-Server的所有狀態信息的維護和變更都會記錄在數據庫中,用戶做一些更改服務的操作都會在數據庫上做一些相應的記錄,同時,agent通過心跳來獲得數據庫的變更歷史。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BfqBG1t7-1591944915685)(Ambari%E6%BA%90%E7%A0%81%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90.assets/image-20200612143814816.png)]

Ambari Server 會讀取 Stack 和 Service 的配置文件。當用 Ambari 創建集羣的時候,Ambari Server 傳送 Stack 和 Service 的配置文件以及 Service 生命週期的控制腳本到 Ambari Agent。Agent 拿到配置文件後,會下載安裝公共源裏軟件包(Redhat,就是使用 yum 服務)。安裝完成後,Ambari Server 會通知 Agent 去啓動 Service。之後 Ambari Server 會定期發送命令到 Agent 檢查 Service 的狀態,Agent 上報給 Server,並呈現在 Ambari 的 GUI 上。

Ambari Server 支持 Rest API,這樣可以很容易的擴展和定製化 Ambari。甚至於不用登陸 Ambari 的 GUI,只需要在命令行通過 curl 就可以控制 Ambari,以及控制 Hadoop 的 cluster。

2.1.2、目錄

目錄 描述
org.apache.ambari.server.api.services 對web接口的入口方法,處理/api/v1/* 的請求
org.apache.ambari.server.controller 對Ambari中cluster的管理處理,如新增host,更service、刪除component等
org.apache.ambari.server.controller.internal 主要存放ResourceProvider和PropertyProvider;
org.apache.ambari.service.orm.* 對數據庫的操作
org.apache.ambari.server.agent.rest 處理與Agent的接口的入口方法
org.apache.ambari.security 使用Spring Security來做權限管理

其中,每一種Resource都對應一個ResourceProvider,對應關係如下

Resource.Type ResourceProvider
Workflow WorkflowResourceProvider
Job JobResourceProvider
TaskAttempt TaskAttemptResourceProvider
View ViewResourceProvider
ViewInstance ViewInstanceResourceProvider
Blueprint BlueprintResourceProvider
Cluster ClusterResourceProvider
Service ServiceResourceProvider
Component ComponentResourceProvider
Host HostResourceProvider
HostComponent HostComponentResourceProvider
Configuration ConfigurationResourceProvider
Action ActionResourceProvider
Request RequestResourceProvider
Task TaskResourceProvider
User UserResourceProvider
Stack StackResourceProvider
StackVersion StackVersionResourceProvider
StackService StackServiceResourceProvider
StackServiceComponent StackServiceComponentResourceProvider
StackConfiguration StackConfigurationResourceProvider
OperatingSystem OperatingSystemResourceProvider
Repository RepositoryResourceProvider
RootService RootServiceResourceProvider
RootServiceComponent RootServiceComponentResourceProvider
RootServiceHostComponent RootServiceHostComponentResourceProvider
ConfigGroup ConfigGroupResourceProvider
RequestSchedule RequestScheduleResourceProvider

2.1.3、ambari-server技術棧

Server code: Java 1.7 / 1.8
Agent scripts: Python
Database: Postgres, Oracle, MySQL
ORM: EclipseLink
Security: Spring Security with remote LDAP integration and local database
REST server: Jersey (JAX-RS)
Dependency Injection: Guice
Unit Testing: JUnit
Mocks: EasyMock
Configuration management: Python

2.2、Ambari-Agent

2.2.1、Ambari-agent功能劃分

ambari-agent是一個無狀態的。其功能主要分兩部分:

  • 採集所在節點的信息並且彙總發心跳彙報給ambari-server;
  • 處理ambari-server的執行請求。

因此它有兩種隊列:

  • 消息隊列MessageQueue,或爲ResultQueue。包括節點狀態信息(包括註冊信息)和執行結果信息,並且彙總後通過心跳發送給ambari-server;
  • 操作隊列ActionQueue。用於接收ambari-server返回過來的狀態操作,然後能過執行器按序調用puppet或python腳本等模塊完成任務。

在這裏插入圖片描述

2.2.2、Ambari-agent引導流程

分別是用SSH和人工手動的非SSH
步驟:

  1. Ambari Server通過調用bootstrap.py來初始化整個bootstrap進程
  2. Server端通過SSH Keys在Agent上配置Ambari Repo:利用Ambari Server上的ambari.repo文件,並且scp到Agent Host上。
  3. 複製Ambari Agent Setup script:利用scp命令將setupAgent.py腳本複製到Agent host上。
  4. 在各個Agent上執行Ambari Agent Setup script:SSH到各個Agent Host上然後執行setupAgent.py。
  5. 在Agent上安裝epel-release:用apt-get/yum/zypper工具來安裝epel-release包
  6. 在Agent上安裝Ambari-agent:用apt-get/yum/zypper工具來安裝Ambari-Agent包
  7. 配置Ambari-agent.ini:修改/etc/ambari-agent/conf/ambari-agent.ini,並設置agent host上的hostname
  8. 啓動Ambari-agent:啓動Ambari-agent進程
  9. 開始Ambari Agent註冊:agent開始registration進程
    在這裏插入圖片描述

在這裏插入圖片描述

2.2.3、Agent註冊流程

步驟

  1. 連接握手端口8441:Ambari Agent連接到Ambari Server的握手端口8441。
  2. 下載Server Certification:Ambari Agent下載Server Certification。
  3. 請求籤署Agent Certification:Ambari Agent請求Ambari Server來簽署Agent證書。
  4. 簽署Agent Cert:Ambari Server通過密碼簽署Agent證書。
  5. 下載Agent Cert並斷掉連接:Ambari Agent下載Agent證書,然後斷掉之前的連接。
  6. 連接註冊端口8440:Ambari Agent連接到Ambari Server的註冊端口8441
  7. 用Agent Cert執行2WAY auth:在Agent和Server之間完成2WAY權限認證。
  8. 獲取FQDN:Ambari Agent host獲取Fully Qualified Domain Name(FQDN)
  9. 註冊Host:利用FQDN,host向Ambari Server提出註冊。
  10. 完成Host註冊:Ambari Server完成host的註冊過程,把host加入到Ambari數據庫
  11. Agent心跳程序啓動:Ambari Agent向Ambari Server開啓心跳程序,確認各種命令的執行
    在這裏插入圖片描述

這裏寫圖片描述

2.3、Ambari-Web

2.3.1、技術棧

Ambari-web使用了一個流行的前端Embar.js MVC框架實現,Embar.js是一個TodoMVC框架,它涵蓋了現今典型的單頁面應用(single page application)幾乎所有的行爲。

使用了nodejs

使用brunch 作爲項目的構建管理工具

Brunch ,是一個超快的HTML5構建工具。它有如下功能:

(1)、編譯你的腳本、模板、樣式、鏈接它們。

(2)、將腳本和模板封裝進common.js/AMD模塊裏,鏈接腳本和樣式。

(3)、爲鏈接文件生成源地圖,複製資源和靜態文件。

(4)、通過縮減代碼和優化圖片來收縮輸出,看管你的文件更改。

(5)、並通過控制檯和系統提示通知你錯誤。

Nodejs 是一個基於Chrome JavaScript運行時建立的一個平臺,用來方便的搭建快速的易於擴展的網絡應用,NodeJS藉助事件驅動,非阻塞I/O模型變得輕量和高效,非常適合運行在分佈式設備的數據密集型的實時應用。

2.3.2、Ambari-web 目錄結構

目錄或文件 描述
app/ 主要應用程序代碼。包括Ember中的view、templates、controllers、models、routes
config.coffee Brunch應用程序生成器的配置文件
package.json Npm包管理配置文件
test/ 測試文件
vendor/ Javascript庫和樣式表適用第三方庫。

Ambari-web/app/

目錄或文件 描述
assets/ 靜態文件
controllers/ 控制器
data/ 數據
mappers/ JSON數據到Client的Ember實體的映射
models MVC中的Model
routes/ 路由器
styles 樣式文件
views 試圖文件
templates/ 頁面模板
app.js Ember主程序文件
config.js 配置文件

2.4、Ambari-Common等其他

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章