您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

關(guān)于Swarm和Mesos資源利用率優(yōu)化實(shí)踐分析

大?。?/span>0.3 MB 人氣: 2017-10-10 需要積分:1
【編者按】Apache Mesos作為一個非常優(yōu)秀的分布式資源管理和調(diào)度系統(tǒng),如何高效的管理和分配資源,必然成為它研究和努力的主要方向之一。本文是基于IBM Platform DCOS Team在資源調(diào)度領(lǐng)域的優(yōu)秀經(jīng)驗(yàn),以及他們在Mesos社區(qū)為提升Mesos資源利用率而正在進(jìn)行的實(shí)踐活動,深度剖析了Mesos資源的收集和調(diào)度原理,以及如何在Mesos中提供Revocable資源來提高M(jìn)esos數(shù)據(jù)中心的資源利用率。最后,作者結(jié)合自己在Docker Swarm社區(qū)的貢獻(xiàn)經(jīng)驗(yàn),重點(diǎn)講解了在Docker Swarm如何支持Mesos的Revocable資源。來自IBM Platform軟件工程師王勇橋?qū)怼癝warm和Mesos集成指南”系列文章,帶大家了解Swarm和Mesos集成的架構(gòu)和原理,Swarm基于Mesos集群的實(shí)戰(zhàn)部署和配置,以及基于IBM Platform自身在資源調(diào)度、分布式計(jì)算領(lǐng)域方面的實(shí)踐經(jīng)驗(yàn),向大家介紹IBM Platform對Mesos在資源調(diào)度方面的策略優(yōu)化,以及以Swarm為例向大家介紹這些優(yōu)化將對Mesos上層的framework和企業(yè)級用戶帶來哪些增強(qiáng)性的體驗(yàn)。本文為第三篇:資源利用率優(yōu)化實(shí)踐。
  Mesos集群資源收集
  Apache Mesos是一種分布式的資源管理和調(diào)度框架,它被稱為是分布式系統(tǒng)的內(nèi)核。那么Mesos是怎么在這個分布式的異質(zhì)的環(huán)境中收集資源的呢?官方給出的架構(gòu)圖如下所示:
  關(guān)于Swarm和Mesos資源利用率優(yōu)化實(shí)踐分析
  默認(rèn)情況下每一個Mesos Slave會主動采集它所在機(jī)器上的實(shí)際資源量, 現(xiàn)在默認(rèn)情況下主要收集以下四種資源:
  CPU: 默認(rèn)調(diào)用系統(tǒng)函數(shù)os::cpus()來獲取系統(tǒng)CPU的個數(shù),如果在某些特殊的平臺或者系統(tǒng)上獲取失敗,將采用默認(rèn)值1。Memory:默認(rèn)調(diào)用系統(tǒng)函數(shù)os::memory()來獲取系統(tǒng)內(nèi)存的大小,如果在某些特殊的平臺或者系統(tǒng)上獲取失敗,將采用默認(rèn)值1GB。Disk:注意,每一個Slave它不是獲取整個機(jī)器的硬盤的大小,它默認(rèn)調(diào)用系統(tǒng)函數(shù)fs::size(flags.work_dir)來獲取Mesos Slave指定的工作目錄(Mesos Slave默認(rèn)的工作目錄為/tmp/mesos,你可以通過在啟動Mesos slave的時候指定–work_dir參數(shù)來修改這個值)的文件系統(tǒng)的硬盤的大小。如果在某些特殊的平臺或者系統(tǒng)上獲取失敗,將采用默認(rèn)值10GB;在獲取成功的情況下,如果獲取的值大于默認(rèn)值10GB,則預(yù)留5GB留給Mesos slave本身使用,剩下的當(dāng)作此計(jì)算節(jié)點(diǎn)的存儲資源交給其他framework使用,如果小于默認(rèn)值10GB,則將獲取值的一半預(yù)留,剩下的一半下的當(dāng)作此計(jì)算節(jié)點(diǎn)的存儲資源交給其他framework使用。Ports:默認(rèn)使用默認(rèn)值”[31000-32000]”。
  當(dāng)然了你可以通過以下兩種方式改變默認(rèn)的行為:
  1.通過在啟動Mesos Slave時指定–resources參數(shù)來定義每個計(jì)算節(jié)點(diǎn)上可以消費(fèi)的資源量。它的值有兩種格式:
  第一種是分號分割的鍵值對字符串列表:“name(role):value;name:value…”。name表示資源的名稱,例如可以是cpus,mem,disk和ports以及用戶自定義資源類型名稱等,role表示資源預(yù)留的角色(就是Mesos中的static reservation),如果不指定,則表示此資源預(yù)留給默認(rèn)的role(通過—default-role參數(shù)指定,如果不指定,則表示Mesos默認(rèn)的role(*)),value表示此資源的值,現(xiàn)在支持的類型有主要有三種SCALAR數(shù)字類型,RANGES范圍類型,比如端口,SET離散枚舉值。
  第二種是一個文件的路徑,如(file:///path/to/file or /path/to/file),這個文件的格式是一個JSON 文件,例如:
  [ { “name”: “cpus”, “type”: “SCALAR”, “scalar”: { “value”: 24} }, { “name”: “mem”, “type”: “SCALAR”, “scalar”: { “value”: 24576} } ]
  注意:如果你指定–resources這個參數(shù)它不會完全覆蓋默認(rèn)的行為,也就是說只有你指定了某種具體的資源,它才會覆蓋這種具體資源的收集方式。例如你指定:–resources=”cpus(role1):1;cpus(*):2”,則表示,此計(jì)算節(jié)點(diǎn)總共有三個CPU,一個預(yù)留給role1,另兩個預(yù)留給默認(rèn)的role(*),其他的三種資源memory,disk,ports仍然按照默認(rèn)的方式收集。
  2.由于通過–resources的方式來指定某種資源,它需要你在啟動對應(yīng)的Mesos Salve的時候就知道具體的資源量,但是對于有些集成的系統(tǒng),它的資源是由某些第三方的資源收集服務(wù)獲取的,比如Collectd。對于這種需求,Mesos同時提供了一種 hook的機(jī)制,來讓用戶實(shí)現(xiàn)自己的Moudle,定制他們收集資源的策略。
  綜上所述,Mesos集群中的每一個Slave節(jié)點(diǎn),通過以上的資源收集方式,將所有的資源在它注冊的時候上報(bào)給Master節(jié)點(diǎn),Master將會利用它的資源調(diào)度策略,把這些資源以“Offer”的形式動態(tài)的分配給上層的framework,framework可以根據(jù)自身任務(wù)對資源的要求來選擇是否接收這個Offer,一旦這個Offer被接受,framework將通過Mesos Master的任務(wù)調(diào)度機(jī)制,將任務(wù)運(yùn)行在數(shù)據(jù)中心的指定的Slave節(jié)點(diǎn)上。
  Mesos集群資源調(diào)度策略
  Apache Mesos能夠成為數(shù)據(jù)中心資源調(diào)度的內(nèi)核,一個非常重要的原因就是它能夠支持大多數(shù)framework的接入,那么Mesos要考慮的一個主要的問題就是如何為眾多的framework分配資源。在mesos中,這個功能是由Master中的一個單獨(dú)的模塊(Allocation module)來實(shí)現(xiàn)的,因?yàn)镸esos設(shè)計(jì)用來管理異構(gòu)環(huán)境中的資源,所以它實(shí)現(xiàn)了一個可插拔的資源分配模塊架構(gòu),用戶可以根據(jù)自己的需求來實(shí)現(xiàn)定制化的分配策略和算法。
  本章節(jié)將主要介紹Mesos默認(rèn)的資源調(diào)度模塊DRF Allocator。官方默認(rèn)給出了一個資源調(diào)度的流程圖,如下所示:
  關(guān)于Swarm和Mesos資源利用率優(yōu)化實(shí)踐分析
  DRF(Dominant Resource Fairness) Allocator,它的目標(biāo)是確保每一個上層的Framework能夠接收到它最需資源的公平份額。下邊我們先簡單介紹一下DRF算法。在DRF中一個很重要的概念就是主導(dǎo)資源(dominant resource),例如對于運(yùn)行計(jì)算密集型任務(wù)的framework,它的主導(dǎo)資源是CPU,對于運(yùn)行大量依賴內(nèi)存的任務(wù)的framework,它的主導(dǎo)資源是內(nèi)存。DRF Allocator在分配資源之前,首先會按照資源類型計(jì)算每個framework占有(已經(jīng)使用的資源+已經(jīng)以offer的形式發(fā)給framework但是還沒有使用的資源)份額百分比,占有比最高的為這個framework的主導(dǎo)資源,然后比較每個framework主導(dǎo)資源的百分比,哪個值小,則將這個機(jī)器上資源發(fā)給對應(yīng)的framework。你可以參考Benjamin Hindman的這篇論文https://www.cs.berkeley.edu/~alig/papers/drf.pdf來了解DRF算法的詳細(xì)說明。
  另外,Mesos集群管理員可以通過以下幾種方式提供更多的資源分配策略:
  給某個framework設(shè)置權(quán)重(weight)來使某個framework獲取更多的資源??梢允褂胹tatic/dynamic reservation指定將某一個Slave節(jié)點(diǎn)上的資源發(fā)送給特定role下的framework??梢詾槟硞€role配置quota來保證這個role下的framework在整個Mesos集群中獲取資源的最小份額。Framework收到資源之后,可以創(chuàng)建持久化存貯卷,保證這些存儲資源不能被其他的framework使用。
  使用Revocable資源來提高資源利用率
  對于DRF的Allocator,在資源分配方面可能存在以下幾個方面的問題:
  1.資源碎片的問題。由于DRF總是追求公平,它會把剩余資源公平的分配給所有的framework,但是這種公平分配可能會導(dǎo)致所有的framework在一個分配的周期中都沒有足夠的資源來運(yùn)行它的任務(wù)。
  2.本性貪婪的framework為了提高它自身的性能,有時候總試圖去hold offer,即便是它當(dāng)時沒有需要執(zhí)行的任務(wù),那么這個時候,這些resource也不能分配給另外的framework使用。
  3.對于gang-scheduing(同時申請一組資源)類型的應(yīng)用,由于Mesos在一個時刻只能提供集群的部分資源,那么這種類型的應(yīng)用可能需要等待比較長的時間才可以運(yùn)行。
  為了適當(dāng)?shù)奶岣進(jìn)esos的資源利用率,Mesos社區(qū)現(xiàn)在引入了Revocable類型的資源。這種資源是一種可以被Mesos自行回收的資源,也就是說如果上層的framework使用這種資源來運(yùn)行的它們的任務(wù),那么這些任務(wù)就有隨時被殺掉的可能。它被設(shè)計(jì)主要用來運(yùn)行一些可靠性要求比較低,無狀態(tài)的的任務(wù)。也就是說現(xiàn)在Mesos主要為上層的framework提供兩種資源:
  ? Non-revocable resources: Mesos提供的最常見的資源類型,一旦這種資源offer發(fā)給某個framework,那么這些資源永遠(yuǎn)可以保證對這個framework可用,F(xiàn)ramework一旦用這種資源運(yùn)行它的任務(wù),那么這個任務(wù)所占用的資源不能被Mesos收回,除非framework主動殺掉任務(wù)或者任務(wù)結(jié)束。
  ? Revocable resources:這種資源是framework沒有充分利用的資源,Mesos會把這部分資源再發(fā)送給其他的framework使用,如果其他framework用這種resource運(yùn)行任務(wù),那么這個任務(wù)有可能在某個時候被Mesos殺掉來回收對應(yīng)的資源。這種資源主要運(yùn)來執(zhí)行best-effort任務(wù),例如后臺分析,視頻圖像處理,芯片模擬等一些低優(yōu)先級的任務(wù)。
  首先Mesos在MESOS-354項(xiàng)目中初次引入了Revocable類型的資源,它是我們所說的其中一種Revocable類型的資源,它主要考慮的應(yīng)用場景是:在Mesos集群中,Mesos對資源的分配率一般可以達(dá)到80%以上,但實(shí)際的資源利用率卻低于20%。在這個項(xiàng)目中,它提供了一種資源的再分配機(jī)制,就是把臨時沒有使用的資源(這些資源已經(jīng)在之前分配給了某些任務(wù),而且這些任務(wù)正在運(yùn)行,但是它們沒有完全使用已經(jīng)分配給它們的資源)再分配給其他的任務(wù)。這種類型的revocable資源被稱為Usage Slack的資源,下邊我們來主要分析一下這種資源的生命周期:
  第一步首先要確定哪些資源是Usage slack的revocable resource。每個Mesos Salve節(jié)點(diǎn)上的Resource estimator會定期和Resource Monitor模塊交互來計(jì)算Usage slack,如果前后兩次計(jì)算的值不同,則它會把這些revocable的資源上報(bào)給Mesos master。Mesos allocator會收到每個Slave上報(bào)的Usage slack的revocable resource,然后把這些revocable resource 發(fā)送給上層的framework。注:默認(rèn)情況下framework是不接收revocable resource的,如果framework在注冊時候指定REVOCABLE_RESOURCES capability,那么它將可以收到revocable resource。Framework可以選擇使用這些revocable resource運(yùn)行任務(wù),這些revocable任務(wù)會像正常的任務(wù)一樣被運(yùn)行在對應(yīng)的節(jié)點(diǎn)上。每個Slave上的Monitor會監(jiān)視原來task的運(yùn)行狀況,如果它的運(yùn)行負(fù)載提高,則Qos controller模塊會殺掉對應(yīng)的revocable task來釋放資源。
  另外的一種Revocable資源則在MESOS-4967項(xiàng)目中引入,它主要由IBM Platform DCOS Team的工程師主導(dǎo)設(shè)計(jì)開發(fā),目前基本的設(shè)計(jì)和編碼已經(jīng)完成,正在review階段,很快會在最近的Mesos版本中支持。它主要是考慮到在Mesos中有些資源某些role reserve,但是沒有被使用的情況(Allocation Slack),我們在后續(xù)的文章中會對其詳細(xì)介紹。
  對于Revocable類型的資源,需要注意以下幾點(diǎn):
  Revocable資源不能動態(tài)的reserve;Revocable資源不能用來創(chuàng)建存儲卷;運(yùn)行任務(wù)的時候,對同一種資源,revocable資源和non-revocable資源不能混用,但是不同類型的資源可以混用。比如CPU用revocable resource,Memory可以使用non-revocable資源。如果一個task使用了revocable資源或者它對應(yīng)的executor使用了revocable資源,則整個container都被視為revocable task,可以被Qos controller殺掉。
  在Swarm中使用Mesos的Revocable資源
  在Docker Swarm目前的版本(v1.1.3)中,它不支持接收Mesos的revocable resource。IBM Platform DCOS Team對Swarm做了改進(jìn),使Swarm可以接收revocable resource,并且Swarm 的終端用戶可以選擇使用revocable 資源來運(yùn)行他們低優(yōu)先級的任務(wù),或者使用non-revocable 資源來運(yùn)行他們的高優(yōu)先級任務(wù)。這樣的話,如果Swarm和其他的framework共享Mesos集群資源的時候,其他framework的未充分利用的資源將可以被Swarm使用,這樣的話Mesos集群整體的資源利用率將得到提升。注:這個新的改進(jìn)可能會在Swarm的v1.1.3之后的某個版本release,如果哪位讀者需要嘗試這個新的特性,可以關(guān)注這個https://github.com/docker/swarm/pull/1946pull request。
  這個特性主要支持以下幾種使用場景:
  Swarm集群的管理員可以配置Swarm集群來接收Mesos的revocable resource。Swarm的終端用戶可以只選擇非revocable資源來運(yùn)行他們的高優(yōu)先級任務(wù)。Swarm的終端用戶可以優(yōu)先考慮選擇非revocable資源來運(yùn)行他們的中優(yōu)先級任務(wù),如果沒有非revocable資源可用,那么這些任務(wù)也可以選擇revocable資源來運(yùn)行。Swarm的終端用戶可以只選擇revocable資源來運(yùn)行他們的低優(yōu)先級任務(wù)。Swarm的終端用戶可以優(yōu)先考慮選擇revocable資源來運(yùn)行他們的低優(yōu)先級任務(wù)。如果沒有revocable資源可用,那么這些任務(wù)也可以選擇非revocable資源來運(yùn)行。Swarm的終端用戶可以查看他們的container使用什么資源來運(yùn)行的。
  Swarm支持Revocable resource主要做了以下幾個方面的改進(jìn):
  在Swarm manage命令中新增一個cluster參數(shù)選項(xiàng)mesos.enablerevocable,通過將這個參數(shù)設(shè)置為true來使Swarm可以接收Mesos發(fā)送的revocable資源。當(dāng)然按照Swarm之前的設(shè)計(jì)原則,你可以export SWARM_MESOS_ENABLE_REVOCABLE環(huán)境變量來替代那個參數(shù)選項(xiàng)。Mesos會定期的發(fā)送offer給Swarm,當(dāng)Swarm接收到這些offer之后,需要修改對應(yīng)Docker engine的資源類型,現(xiàn)在支持的有三種類型:Regular(表示這個節(jié)點(diǎn)上只有非revocable資源),Revocable(表示這個節(jié)點(diǎn)上只有revocable資源),Any(表示這個節(jié)點(diǎn)上即有非revocable資源,也有revocable資源),Unknown(表示這個節(jié)點(diǎn)的資源類型不確定,也就是這個節(jié)點(diǎn)上暫時沒有可用的資源,這類節(jié)點(diǎn)如果沒有正在運(yùn)行的任務(wù),它默認(rèn)會被Swarm很快地刪除)。根據(jù)Swarm所提供的constraint來使用revocable或者非revocable資源來創(chuàng)建任務(wù)。最常見的constraint寫法有四種:
  constraint:res-type==regular: 表示只使用非revocable資源來運(yùn)行任務(wù),如果沒有非revocable資源,那么這個任務(wù)將會被放到任務(wù)隊(duì)列中等待更多的非revocable資源,直到超時。constraint:res-type==~regular: 表示優(yōu)先使用非revocable資源來運(yùn)行任務(wù),如果沒有非revocable資源,那么選擇使用revocable資源來執(zhí)行。如果這兩種資源都不夠,這個任務(wù)將會被放到任務(wù)隊(duì)列中等待Mesos發(fā)送更多的offer,直到超時。constraint:res-type==revocable: 表示只使用revocable資源來運(yùn)行任務(wù),如果沒有revocable資源,那么這個任務(wù)將會被放到任務(wù)隊(duì)列中等待更多的revocable資源,直到超時。constraint:res-type==~revocable: 表示優(yōu)先使用revocable資源來運(yùn)行任務(wù),如果沒有revocable資源,那么選擇使用非revocable資源來執(zhí)行。如果這兩種資源都不夠,這個任務(wù)將會被放到任務(wù)隊(duì)列中等待Mesos發(fā)送更多的offer,直到超時。constraint:res-type==*: 表示可以使用任何類型的資源來運(yùn)行任務(wù),如果revocable資源和非revocable資源都不夠,那么這個任務(wù)將會被放到任務(wù)隊(duì)列中等待Mesos發(fā)送更多的offer,直到超時。
  幾個細(xì)節(jié)需要特別注意:
  由于Swarm的constraint支持正則表達(dá)式,所以當(dāng)指定的正則表達(dá)式同時滿足使用revocable和非revocable的資源,那么我們默認(rèn)優(yōu)先使用非revocable的資源來運(yùn)行任務(wù),如果非revocable的資源不夠用,我們才會使用revocable資源運(yùn)行任務(wù)。在Swarm對使用revocable資源的設(shè)計(jì)中,同一個任務(wù)不支持即使用revocable資源又使用非revocable資源。但是Mesos的這種限制只是局限于同一類型的資源,也就是說在Mesos中,不同類型的資源是可以混用的。個人認(rèn)為Mesos的這種設(shè)計(jì)不是很合理,原因是,主要某個任務(wù)使用了revocable資源,那么它就會被當(dāng)作revocable任務(wù),可以被Qos控制器殺掉,根本就不會考慮它所使用的非revocable資源。在Swarm中創(chuàng)建container的時候,同一個constraint是可以指定多次的,Swarm會把它當(dāng)作各自不同的constraint來對待,一個一個進(jìn)行過濾。但是在此設(shè)計(jì)中,我們不允許Swarm用戶指定多個res-type,如果指定多個,創(chuàng)建container將會失敗。Mesos現(xiàn)在的設(shè)計(jì)是將非revocable資源和revocable資源放在了同一個offer中發(fā)給上層framework的,也就是說當(dāng)Swarm收到offer之后,需要遍歷offer中的每個資源來查看它的類型,來更新對應(yīng)Docker engine的資源類型。在創(chuàng)建容器的時候,需要遍歷某個節(jié)點(diǎn)上的所有的offer來計(jì)算所需要的資源,這可能會帶來性能上的問題。比較慶幸的是,Mesos正在考慮對這個行為作出改進(jìn),也就是把revocable資源和非revocable資源用不同的offer來發(fā)送,也就說到時候framework收到的offer要么全是revocable資源,要么全是非revocable資源,這樣的話就可以提高Swarm計(jì)算資源的性能。順便說一下,Mesos做這個改進(jìn)的出發(fā)點(diǎn)是考慮到rescind offer的機(jī)制,因?yàn)閞escind offer是以整個offer為單位回收資源的,如果我們把revocable資源和非revocable資源放到一個offer進(jìn)行發(fā)送,那么回收revocable資源的時候,不可避免的會同時回收非revocable資源。
  下邊我將帶領(lǐng)大家進(jìn)行實(shí)戰(zhàn),用Swarm使用Mesos的revocable資源。在進(jìn)行之前,我建議讀者先看看和這篇文章相關(guān)的前兩篇《Swarm和Mesos集成指南-原理剖析》和 《Swarm和Mesos集成指南-實(shí)戰(zhàn)部署》。
  為了簡化環(huán)境部署的復(fù)雜度,使讀者可以輕松地在自己的環(huán)境上體驗(yàn)以下這個新的特性,我提供了三個Docker Image,讀者可以很輕松的使用這三個Image 搭建起體驗(yàn)環(huán)境。
  1.準(zhǔn)備三臺機(jī)器,配置好網(wǎng)絡(luò)和DNS服務(wù),如果沒有DNS服務(wù),可以直接配置/etc/hosts,使這三臺機(jī)器可以使用機(jī)器名相互訪問。我使用的是三臺Ubuntu 14.04的機(jī)器:
  wangyongqiao-master.grady.com
  wangyongqiao-slave1.grady.com
  wangyongqiao-slave2.grady.com
  2.在wangyongqiao-master.grady.com上執(zhí)行以下Docker Run命令啟動Zookeeper節(jié)點(diǎn),用作Mesos集群的服務(wù)發(fā)現(xiàn),在這里我們直接使用mesoscloud提供的zookeeper鏡像。
 ?。?docker run –privileged –net=host -d mesoscloud/zookeeper
  其實(shí)這一步不是必須的,但是如果你的Mesos集群不使用Zookeeper,在Swarm使用的依賴庫mesos-go有一個問題會導(dǎo)致Mesos Master重啟或者failover之后,Swarm manage不會向Mesos重新注冊(re-register),需要用戶重新啟動swarm manage節(jié)點(diǎn),這會導(dǎo)致它之前運(yùn)行的所有任務(wù)都變成了孤兒任務(wù)。我在Swarm社區(qū)已經(jīng)創(chuàng)建了一個issue來跟蹤這個問題,具體的情況和重現(xiàn)步驟你可以參考:https://github.com/docker/swarm/issues/1730。
  3.在wangyongqiao-master.grady.com上執(zhí)行以下Docker Run命令啟動Mesos Master服務(wù)。這里使用我提供了一個Mesos Master的Image:
  # docker run -d \ -v /opt/mesosinstall:/opt/mesosinstall \ --privileged \ --name mesos-master --net host gradywang/mesos-master \ --zk=zk://wangyongqiao-master.grady.com:2181/mesos
  因?yàn)閷τ趶氖翸esos開發(fā)的人來說,經(jīng)常性的修改Mesos的代碼是不可避免的事情,所以為了避免每次改完代碼都要重新build Docker鏡像,在我提供的鏡像中,其實(shí)并不包含Mesos的bin包,你在使用這個鏡像之前必須先在本地build你的Mesos,然后執(zhí)行make install把你的Mesos按照到某個空的目錄,然后把這個目錄mount到你的Mesos master容器中的/opt/mesosinstall目錄。 具體的步驟你可以參考網(wǎng)上的這篇文章《Swarm和Mesos集成指南-實(shí)戰(zhàn)部署》。
  本例中,我把Mesos build完成之后安裝在了本地的/opt/mesosinstall目錄:
  # make install DESTDIR=/opt/mesosinstall# ll /opt/mesosinstall/usr/local/total 36drwxr-xr-x 9root root 4096Jan 1520:02./ drwxr-xr-x 3root root 4096Jan 1519:44.。/ drwxr-xr-x 2root root 4096Mar 1813:30bin/ drwxr-xr-x 3root root 4096Jan 1520:02etc/ drwxr-xr-x 5root root 4096Mar 1813:30include/ drwxr-xr-x 5root root 4096Mar 1813:31lib/ drwxr-xr-x 3root root 4096Jan 1520:02libexec/ drwxr-xr-x 2root root 4096Mar 1813:31sbin/ drwxr-xr-x 3root root 4096Jan 1520:02share/
  4.在wangyongqiao-slave1.grady.com和wangyongqiao-slave2.grady.com上執(zhí)行以下命令,啟動Mesos Salve服務(wù)。這里使用我提供了一個Mesos Slave的Image:
  # docker run -d \-v /opt/mesosinstall:/opt/mesosinstall \ --privileged \-v /var/run/docker.sock:/var/run/docker.sock \ --name mesos-slave --net host gradywang/mesos-slave \--master=zk://wangyongqiao-master.grady.com:2181/mesos \--resource_estimator=“org_apache_mesos_FixedResourceEstimator” \--modules=‘{“l(fā)ibraries”: { “file”: “/opt/mesosinstall/usr/local/lib/libfixed_resource_estimator-0.29.0.so”, “modules”: { “name”: “org_apache_mesos_FixedResourceEstimator”, “parameters”: { “key”: “resources”, “value”: “cpus:4”} } } }’
  在使用gradywang/mesos-slave這個鏡像之前,必須注意以下這幾點(diǎn):
  a.像上一步一樣,我們假設(shè)你已經(jīng)手動build,并安裝了你的Mesos在/opt/mesosinstall目錄下,當(dāng)然你可以只需要在wangyongqiao-master.grady.com這個機(jī)器上構(gòu)建你的Mesos,然后在wangyongqiao-master.grady.com機(jī)器上按照NFS服務(wù),把安裝目錄/opt/mesosinstall掛載到其他的兩個計(jì)算節(jié)點(diǎn)上,具體的步驟你可以參考網(wǎng)上的這片文章《Swarm和Mesos集成指南-實(shí)戰(zhàn)部署》。
  b.因?yàn)槲覀円菔驹趺从迷赟warm上使用Mesos提供的revocable資源,所以我們使用了Mesos默認(rèn)提供的Fixed estimator,它是Mesos提供用來模擬計(jì)算revocable資源的一個工具,可以配置系統(tǒng)中固定提供的revocable資源。上例中我們默認(rèn)在每個機(jī)器上配置4個CPU作為這個機(jī)器的revocable資源。
  5.在wangyongqiao-master.grady.com上執(zhí)行以下Docker Run命令啟動Docker Swarm mange服務(wù)。這里使用我提供了一個Swarm的Image:
  # docker run -d \ --net=host gradywang/swarm-mesos \ --debug manage \ -c mesos-experimental \ --cluster-opt mesos.address=192.168.0.2\ --cluster-opt mesos.tasktimeout=10s \ --cluster-opt mesos.user=root \ --cluster-opt mesos.offertimeout=10m \ --cluster-opt mesos.port=3375\ --cluster-opt mesos.enablerevocable=true\ --host=0.0.0.0:4375zk://wangyongqiao-master.grady.com:2181/mesos
  注意:
  在啟動Swarm Manage的時候,我們使用了mesos.enablerevocable=true cluster 選項(xiàng),這個選項(xiàng)是在這個patch中新增的,設(shè)置為true,表示Swarm愿意使用mesos的revocable資源。為了考慮向后的兼容性,如果你不指定這個選項(xiàng),像往常一樣啟動Docker Swarm的時候,Swarm將默認(rèn)不會接收Mesos的revocable資源。當(dāng)然了,你可以像其他的參數(shù)一樣,通過export這個變量SWARM_MESOS_ENABLE_REVOCABLE來設(shè)置。
  192.168.0.2是wangyongqiao-master.grady.com機(jī)器的IP地址,Swarm會檢查mesos.address是不是一個合法的IP地址,所以不能使用機(jī)器名。
  gradywang/swarm-mesos這個鏡像在Docker Swarm v1.1.3版本之上主要包含了四個新的特性:
  支持了Mesos rescind Offer機(jī)制,相關(guān)的pull request是:https://github.com/docker/swarm/pull/1866。這個添加的特性有助于,在Mesos集群中的某個計(jì)算節(jié)點(diǎn)宕機(jī)之后,它上邊的offer在Swarm中立即會被刪除,不會在Swarm info中顯示不可用的offer信息。支持Swarm用一個特定的role來注冊Mesos。在之前的版本中,Swarm只能使用Mesos默認(rèn)的role(*)來注冊。相關(guān)的pull request是:https://github.com/docker/swarm/pull/1890。支持Swarm使用reserved資源來創(chuàng)建容器。在Swarm支持了用特定的role注冊之后,我們就可以使用Mesos的static/dynamic reservation來給Swarm提前預(yù)定一些資源。這些資源只能給Swarm使用?,F(xiàn)在的行為是,當(dāng)Swarm的用戶創(chuàng)建容器的時候,我們會默認(rèn)的優(yōu)先使用reserved資源,當(dāng)reserved資源不夠的時候,我們會用部分的unreserved資源彌補(bǔ)。相關(guān)的pull request是:https://github.com/docker/swarm/pull/1890。支持Swarm使用revocable資源。這將是本文重點(diǎn)演示的特性。相關(guān)的pull request是:https://github.com/docker/swarm/pull/1946。
  6.查看Docker Info:
  # docker -H wangyongqiao-master.grady.com:4375 infoContainers:0Running: 0Paused: 0Stopped: 0Images:6Server Version: swarm/1.1.3Role:primary Strategy:spread Filters:health, port, dependency, affinity, constraint Offers:2Offer: eba7f1e4-36ca-4a2f-9e24-e8cffce7393a-S0》》eba7f1e4-36ca-4a2f-9e24-e8cffce7393a-O0 └ cpus: 2└ mem: 2.851GiB └ disk: 29.79GiB └ ports: 31000-32000└ cpus(Revocable): 4└ Labels: executiondriver=native-0.2, kernelversion=3.13.0-32-generic, operatingsystem=Ubuntu 14.04.1LTS, res-type=any, storagedriver=aufs Offer: eba7f1e4-36ca-4a2f-9e24-e8cffce7393a-S1》》eba7f1e4-36ca-4a2f-9e24-e8cffce7393a-O1 └ cpus: 2└ mem: 2.851GiB └ disk: 29.79GiB └ ports: 31000-32000└ cpus(Revocable): 4└ Labels: executiondriver=native-0.2, kernelversion=3.13.0-32-generic, operatingsystem=Ubuntu 14.04.1LTS, res-type=any, storagedriver=aufs Plugins:Volume: Network: Kernel Version: 3.13.0-32-generic Operating System: linux Architecture:amd64 CPUs:12Total Memory: 5.701GiB Name:wangyongqiao-master.grady.com
  從上邊的信息我們可以觀察到,每個機(jī)器上都收到了四個revocable的CPU,每個機(jī)器的res-type都是any,它代表他們上邊既有regular資源,又有revocable資源。
  7.下邊我們演示上邊所提到的那幾個user casees。
  Swarm的用戶可以只選擇regular的資源來運(yùn)行他們的高優(yōu)先級的任務(wù):
 ?。?docker -H wangyongqiao-master.grady.com:4375 run -d -e constraint:res-type==regular –cpu-shares 2 ubuntu:14.04 sleep 100
  可以用以上的命令連續(xù)創(chuàng)建三個contianer,每個container使用兩個regular的CPU,當(dāng)創(chuàng)建第三個的時候,由于所有的regular CPU資源都被前兩個使用,所以第三個會因?yàn)槿狈捎玫膔egular資源而失?。▓?zhí)行超時)。
  Swarm的用戶可以優(yōu)先選擇regular的資源來運(yùn)行他們的中優(yōu)先級的任務(wù),如果沒有足夠的regular資源,也可以用revocable資源來運(yùn)行這個任務(wù):
  # docker -Hwangyongqiao-master.grady.com:4375run -d-econstraint:res-type==~regular --cpu-shares2ubuntu:14.04sleep 100
  可以用以上的命令連續(xù)創(chuàng)建三個contianer,每個container使用兩個regular的CPU,當(dāng)創(chuàng)建第三個的時候,由于所有的regular CPU資源都被前兩個使用,所以第三個任務(wù)會使用revocable資源來創(chuàng)建。
  ? Swarm的用戶可以只選擇revocable的資源來運(yùn)行他們的低優(yōu)先級的任務(wù),把regular的資源預(yù)留來執(zhí)行后續(xù)的高優(yōu)先級任務(wù):
 ?。?docker -Hwangyongqiao-master.grady.com:4375run -d-econstraint:res-type==revocable --cpu-shares2ubuntu:14.04sleep 100
  可以用以上的命令連續(xù)創(chuàng)建五個contianer,每個container使用兩個regular的CPU,當(dāng)創(chuàng)建第五個的時候,由于所有的revocable CPU資源都被前四個使用,所以第五個會因?yàn)槿狈捎玫膔evocable資源而失?。▓?zhí)行超時)。
  Swarm的用戶可以優(yōu)先選擇revocable的資源來運(yùn)行他們的中優(yōu)先級的任務(wù),如果沒有足夠的revocable資源,也可以用regular資源來運(yùn)行這個任務(wù):
 ?。?docker -Hwangyongqiao-master.grady.com:4375run -d-econstraint:res-type==~revocable --cpu-shares2ubuntu:14.04sleep 100
  可以用以上的命令連續(xù)創(chuàng)建五個contianer,每個container使用兩個regular的CPU,當(dāng)創(chuàng)建第五個的時候,由于所有的revocable CPU資源都被前四個使用,所以第五個會使用regular的資源來創(chuàng)建。
  Swarm的終端用戶可以通過docker inspect來查看他們之前運(yùn)行的contianer使用的是revocable資源還是regular資源:
  # docker -H gradyhost1.eng.platformlab.ibm.com:4375inspect --format “{{json .Config.Labels}}”22a8a06ccf5e {“com.docker.swarm.constraints”:“[\”res-type==revocable\“]”,“com.docker.swarm.mesos.detach”:“true”,“com.docker.swarm.mesos.name”:“”,“com.docker.swarm.mesos.resourceType”:“Revocable”,“com.docker.swarm.mesos.task”:“e93593367025”}
  此文出自我個人的見解,非常期待讀者的校正和啟示。
  IBM Platform DCOS作為Mesos社區(qū)的主要貢獻(xiàn)組織,結(jié)合自身在資源調(diào)度方面豐富的實(shí)踐應(yīng)驗(yàn),正在對Mesos資源的調(diào)度模塊(Mesos Allocator)進(jìn)行不斷的優(yōu)化,而且通過將自己的資源調(diào)度組件EGO與Mesos集成,為Mesos上層framework提供了更多的調(diào)度策略和更加友好的策略配置界面,同時,結(jié)合EGO豐富的資源調(diào)度策略,IBM platform DCOS豐富了Mesos的Revocable類型的資源,進(jìn)一步提高了Mesos的資源利用率,通過Mesos-EGO,上層的framework基本可以看到整個集群的資源全貌,通過EGO界面的配置調(diào)度策略,合理高效的解決了資源申請沖突的問題,這些改進(jìn)會對企業(yè)級用戶帶來新的Mesos體驗(yàn)。
?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

關(guān)于Swarm和Mesos資源利用率優(yōu)化實(shí)踐分析下載

相關(guān)電子資料下載

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?