Mesos 介紹
Mesos 官網是這樣介紹自己的:
Program against your datacenter like it’s a single pool of resources
Apache Mesos abstracts CPU, memory, storage, and other compute resources away from machines (physical or virtual), enabling fault-tolerant and elastic distributed systems to easily be built and run effectively.
翻譯過來就是:
Mesos 使你的數據中心看起來像一個資源池。
Apache Mesos 將CPU、內存、存儲和其他計算資源從機器(物理機或虛擬機)中抽象出來,從而使容錯和彈性的分佈式系統易於構建和有效運行。
通俗來講就是:
Mesos 作爲主機上各種資源的管理者,使你可以在Mesos之上更方便地維護和使用這些資源,進行程序的分佈式運行和管理。
更詳細的介紹可以去官網查看文檔。
Mesos Framework 介紹
Mesos Framework 由兩部分組成:
- Scheduler 框架器
- Executor 執行器
既然Mesos是主機資源的管理者,那麼Framework中的Scheduler就是主機資源的調度者,它負責決定使用哪些資源下發哪些任務,而Executor就是下發任務工作的執行者,它真正地負責執行任務的運行工作。
Mesos 會將主機上的資源抽象成一片片的資源邀約(resources offer),不斷的發給以特定角色(role)註冊在Mesos上的Scheduler,然後Scheduler拿到這些offer後,根據是否是任務所需的將這些offer進行拒絕(decline)或接受(accept),如果可以接受這個offer,就要告訴Mesos Master我要用多少資源,以及下發什麼樣的任務,之後Mesos Master將這些信息經過一系列的流轉,最終通知給每臺主機上運行的Executor,實現任務在主機上的運行工作。
Framework Scheduler 開發
在瞭解了Mesos Framework的大致原理後,就可以嘗試開發Framework了,本文主要介紹Scheduler的開發。
Mesos官網文檔中有對於Framework開發的指導 Framework Development Guide,我提取了其中比較關鍵的地方:
框架開發指南
對於Scheduler開發,有兩種方式:
- 通過實現
SchedulerDriver
C++ 接口,建議Mesos 0.28.0 or 更老的版本 - 通過HTTP API ,建議Mesos 1.0 or 更新的版本
對於第一種方式,Scheduler開發人員通過註冊事件回調方法,來實現自定義的調度邏輯。因爲SchedulerDriver 接口是用C++編寫的,這要求Scheduler開發人員使用C++語言,其他語言使用C++編譯而來的本地庫。
Name | Language |
---|---|
Scheduler Library | C++ |
Scheduler Adapter (depends on native libmesos) | Java |
第二種方式,是新版本Mesos推薦的用法,各種語言現成的的庫也有很多,詳情查看: HTTP API client libraries
隨後會通過示例程序,來介紹這兩種方式的環境搭建。
爲了保證多Scheduler的可擴展性,Mesos給了以下建議:
-
使用 Suppress:調用Suppress後,Mesos就不再給Scheduler發送資源Offer。在沒有任務要下發或沒有其他對offer的操作時,Scheduler必須保持
suppressed
狀態,以確保Mesos更有效地爲其他Scheduler提供offer。 -
不要長時間持有Offers: 如果某些Offers不是Scheduler所需的,請立馬拒絕(
decline
)掉它。否則,這些資源Offers就無法提供給其他的Scheduler,並且本身收到的資源offers也會減少。 -
使用一個較大超時時間拒絕
Decline
資源Offers: 當拒絕一個offer時,設置一個較大的Filters.refuse_seconds
超時 (例如 1 hour)。這可以確保Mesos有時間去嘗試向其他的Scheduler提供資源offers(作者認爲,這個時間需要具體情況具體分析,比如需要任務重試時,這個超時就不能太大) 。但是,如果Scheduler最終無法進入SUPPRESSED
狀態,並且在拒絕後有新的任務要下發時,則在一段時間內,如果沒有接收到足夠的資源Offers,則應考慮使用REVIVE
進行恢復。 -
不要頻繁地調用
REVIVE
: 調用REVIVE
會清除掉所有的filters,並且,如果頻繁地調用REVIVE
,就相當於使用很短的超時時間去拒絕offer。 -
設置
FrameworkInfo.offer_filters
: 在Scheduler的配置中設置這個參數,可以指定全局的filters。目前支持的參數爲OfferFilters.min_allocatable_resources
,在集羣層面也有這個配置(使用--min_allocatable_resources
進行指定),可以前者對每個角色進行配置,去覆蓋掉後者的配置。使用一個想要收到的最小Offer的大小來設置FrameworkInfo.offer_filters
,能夠確保Scheduler能夠更好的收到足夠合適大小的Offer。
在操作上,當有不同的Scheduler共存時,可以做以下事情來確保Scheduler能夠獲取它們所需的資源:
- 不在Schedulers之間共享同一個Role
- 使用quota給角色分配資源
- 設置最小分配資源量
- 考慮啓用隨機排序
Scheduler 開發示例
我在github上放了兩個示例程序,分別使用上面提到的兩種方式。
通過實現SchedulerDriver
接口
github地址:mesos-framework-demo
語言:Java
由於使用了C++本地庫,所以在運行jar包時,要在/usr/local/lib
放入mesoslib.so
文件,也可以通過設置環境變量來改變這個路徑:
MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/mesoslib.so
查看clone下來的代碼,完成的工作有:
1.設置FrameworkInfo
,主要包括:
-
user 指定executor或task的運行用戶
-
name 指定Framework的名字
-
id 指定Framework的唯一標識
-
failoverTimeout 指定等待故障排除的時間,超過這個時間未重新註冊,框架及其下運行的任務將會被移除
-
role 角色名
2.實現org.apache.mesos.Scheduler
接口的方法,主要包括:
- registered() 註冊成功時回調
- resourceOffers() 資源Offers到達時回調
- statusUpdate() 任務狀態有更新時回調
- reregistered() 重新註冊時回調
3.配置Zk地址,用於發現Mesos Master
完成以上配置及實現,即可實現了一個簡單的Framework Scheduler,當註冊成功後,在Mesos的/frameworks
頁面,可以看到你啓動的Framework。
示例項目中,mesos.proto
是數據的結構定義,裏面有各種數據的類型與結構關係。
通過HTTP API
github地址:mesos-framework-go-example
語言:golang
爲了方便,使用了現成的第三方工具 mesos-go
要做的工作相比第一種方式,第三步不再是配置Zk地址,而是配置Mesos的scheduler
接口地址:
Url: "http://localhost:5050/api/v1/scheduler",
開發建議
- 選擇合適的數據存儲中間件,例如:Zookeeper、Etcd、Mysql
- 使用多實例,保證高可用
- 如果在
resourceOffers()
回調方法中存在Http請求或數據訪問,在使用Filters.refuse_seconds
控制resourceOffers()
回調頻率的同時,建議增加緩存機制。