乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Mesos:Docker容器農(nóng)場

       LZS2851 2016-03-14

      這是一篇“溫和有趣”的技術(shù)文章,如果你初識Docker,對微服務(wù)充滿興趣,不妨一讀?;蛟S你的第一次微服務(wù)體驗,就從本文開始……

      在本文中,Mesos、Zookeeper、Marathon、Bamboo + HaProxy、Logstash、MesosDns、ElasticSearch和Kibana + Nginx等紛紛亮相,并配有詳細(xì)的代碼說明。本文旨在從最初的安裝和環(huán)境基礎(chǔ)建立開始,一步步指引你搭建自己的集群,實現(xiàn)你的目標(biāo)架構(gòu),并在其上運行分布式服務(wù)。

      小數(shù)友情提示:本文篇幅很長,干貨多多,值得收藏。

      當(dāng)開發(fā)者開始構(gòu)建自己的第一款微服務(wù)應(yīng)用程序時,大家通常不會過多考慮編排之類的問題。這時我們掌握的有兩到四臺服務(wù)器,而Ansible腳本已經(jīng)能夠解決大部分問題。不過一旦大家的應(yīng)用程序規(guī)模更大,或者各位決定使用一套環(huán)境承載多個不同項目,那么必然需要更多服務(wù)器……還有一款用于管理各服務(wù)器之上運行的服務(wù)。

      不過剛剛我們已經(jīng)提到了Ansible,難道它還不足以解決問題?這個嘛……答案是否定的。Ansible只能解決一項難題——部署。利用它,大家仍然需要搞定其它多種與微服務(wù)相關(guān)的問題:我們必須記得每臺服務(wù)器中還有多少剩余資源、手動管理各清單文件以匹配服務(wù)器容量、監(jiān)控應(yīng)用程序是否正常運行、當(dāng)節(jié)點出現(xiàn)故障時進行服務(wù)回彈以及控制端口號沖突等等。如果大家擁有四臺服務(wù)器與十項服務(wù),那么這些問題就變得比較明顯了。

      而以此為基礎(chǔ),我們就需要求助于Mesos了。Mesos是什么?這是一款集群管理器,其能夠幫助大家在分布式環(huán)境之下運行應(yīng)用程序。Mesos的關(guān)鍵優(yōu)勢包括:

      *資源管理與使用效率;

      *應(yīng)用程序生命周期控制;

      *Docker容器支持能力。

      最后一點也使得Mesos成為我們最為完美的解決方案選項。

      安裝

      由于找到七臺無需使用的服務(wù)器對于任何企業(yè)都是一項難題,因此我們在這里使用Vagrant(這是一款管理虛擬化流程的完美工具)在一臺本地設(shè)備(惠普Z230,i7-4770 3.40 GHz,16 GB內(nèi)存)上構(gòu)建自己的集群。另外,我們也提到了Ansible是一種便捷的部署方式,因此我們完全可以將整個安裝流程拆分成多個Ansible角色,從而封裝其內(nèi)部所需要使用的標(biāo)準(zhǔn)Linux命令。

      環(huán)境

      首先,我們需要建立Mesos集群基礎(chǔ)——這是一系列虛擬機系統(tǒng),供我們在以下步驟中使用。這項工作利用Vagrant能夠輕松完成。 以下為來自Vargantfile的部分代碼:

      Mesos:Docker容器農(nóng)場

      如大家所見,我們可以使用一點Ruby代碼執(zhí)行以下步驟:

      *基于CentOS 7.1鏡像構(gòu)建虛擬機;

      *設(shè)置各虛擬機的資源上限(CPU與內(nèi)存);

      *將其與一套網(wǎng)絡(luò)相結(jié)合;

      *利用每臺主機上的一組預(yù)定義變量啟動一套Ansible劇本(ansible/master.yml)。

      簡單來講,Vagrant文件負(fù)責(zé)描述如何構(gòu)建7套虛擬機系統(tǒng):3套主虛擬機、3套從虛擬機與1套日志存儲(從技術(shù)層面講,這部分也應(yīng)該進行分布處理,不過主機設(shè)備的資源較為有限)。大家需要做的是利用下面這條簡單命令將其投入運行:

      `vagrant up`
      初始集群狀態(tài)

      前三步都是由Vagrant實現(xiàn)的,也不屬于我們今天的討論重點。接下來讓我們正式進入主題,通過Ansible設(shè)置集群。

      集群

      正如大家在Vagrantfile當(dāng)中所見,這里有3套主劇本及其各自角色:

      主角色- 主機包含: Mesos主實例;

      Zookeeper實例;

      Marathon實例;

      Bamboo + HaProxy實例;

      節(jié)點- 主機包含: Mesos從實例;

      Docker服務(wù);

      Logstash實例;

      MesosDns實例;

      日志- 主機包含: ElasticSearch實例; Kibana + Nginx實例。

      接下來,我們將分別考慮各個角色,但這里需要首先強調(diào)一點:每個角色都取決于“OS”角色。該角色與本地網(wǎng)絡(luò)及YUM repo的DNS配置設(shè)置相關(guān)。嚴(yán)格地講,我們應(yīng)當(dāng)將這種關(guān)聯(lián)性從劇本層級中剝離出來,但為了簡單起見,這里我們先讓其保持原狀。

      Zookeeper

      Zookeeper屬于我們系統(tǒng)中的一大重要組成部分。它將幫助我們構(gòu)建集群并允許來自Mesos生態(tài)系統(tǒng)中的其它應(yīng)用程序(例如Bambbo、MesosDns)與之進行通信。

      Zookeeper的安裝過程非常簡單,而且不需要什么技巧——從RPM軟件包中獲取一套repo即可。我發(fā)現(xiàn)很多朋友傾向于利用現(xiàn)有源代碼構(gòu)建應(yīng)用,但在這里我們將使用基于供應(yīng)商的Mesosphere軟件包。

      大家需要的就是安裝該軟件包,設(shè)置節(jié)點ID,更新配置并啟動該服務(wù)。

      下面來看Zookeeper安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      在這里,我們需要回顧一下前面提到過的Vagrantfile——大家還記得下面這部分內(nèi)容嗎?

      Mesos:Docker容器農(nóng)場

      Vagrant將全部必要的變量傳遞至Ansible,因此我們可以輕松在角色中對其加以利用。

      正如Zookeeper的配置一樣,我們只需要對其中的主機IP進行配置:

      Mesos:Docker容器農(nóng)場

      以下為我們集群最終狀態(tài)下的簡單Zookeeper UI(簡稱ZK UI)屏幕:

      Mesos:Docker容器農(nóng)場

      該步驟后的集群狀態(tài)

      Mesos:Docker容器農(nóng)場

      Mesos

      正如之前所提到,MesoSphere的工作人員非常貼心地把Mesos軟件包加以整合,因此整個安裝流程也將變得更加輕松。

      其中惟一需要注意的是,Mesos實際上由兩部分構(gòu)成:

      主節(jié)點(負(fù)責(zé)全部管理邏輯);

      從節(jié)點(負(fù)責(zé)運行應(yīng)用并收集與主機資源相關(guān)的信息);

      換句話來說,我們需要為主節(jié)點與從節(jié)點實現(xiàn)不同的安裝邏輯。幸運的是,Ansible能夠非常輕松地完成這項任務(wù)。

      以下為Mesos安裝任務(wù)的代碼片段:

      Mesos:Docker容器農(nóng)場

      面向這二者,我們需要安裝“mesos”軟件包(請記住,相關(guān)repo由“OS”角色提供)與Zookeeper URL。

      下一站是進行設(shè)定。在這里,我們只提供諸如主節(jié)點quorum size與從節(jié)點docker支持等強制性設(shè)定。如果大家希望了解更多與特定配置相關(guān)的內(nèi)容,不妨閱讀Mesos官方說明文檔。

      由于MesoSphere軟件包同時提供主與從服務(wù),因此我們需要根據(jù)當(dāng)前角色(主/從)禁用其中的冗余部分。

      為實現(xiàn)這一目標(biāo),大家應(yīng)當(dāng)使用Ansible的“conditional”機制。如果大家曾經(jīng)認(rèn)真閱讀過“master”劇本,就會發(fā)現(xiàn)我們已經(jīng)傳遞了一條特殊的mesos_type變量:

      在Mesos安裝完成后,大家可以審視其Web UI并嘗試點擊其中的按鈕:http://192.168.99.11:5050。需要注意的是,如果當(dāng)前主機并非Mesos Master的集群主節(jié)點,那么UI會將大家重新定向至主節(jié)點主機。另外,由于我們在虛擬機當(dāng)中使用了DNS快捷方式(例如“master1”),因此大家也應(yīng)當(dāng)在自己的主機設(shè)備上使用同樣的快捷方式。 好了,就是這樣——我們的集群已經(jīng)構(gòu)建完成了。

      Mesos:Docker容器農(nóng)場

      Mesos:Docker容器農(nóng)場

      在痛飲慶功酒之前,我們還需要回顧其中一些有趣的細(xì)節(jié)。

      首先,大家需要記住——每個任務(wù)都擁有自己的背景信息,我們將其稱為“sandbox”。大家可以將其打開并分析全部輸出結(jié)果(可參閱Marathon部分的截屏內(nèi)容)。需要注意的是,Docker容器必須首先進行pull——因此,如果大家沒有分配足夠的時間用于容器啟動,那么任務(wù)可能無法在UI中w/o任何消息(大家仍然能夠在相關(guān)節(jié)點的/var/logs/messages中看到消息內(nèi)容):

      Mesos:Docker容器農(nóng)場

      要對其進行修復(fù),需要如以上片段所示配置其中的

      另外,也不要忘記設(shè)置運行狀態(tài)檢查的寬限時長(Java應(yīng)用往往會長時間處于活動狀態(tài))。否則大家的應(yīng)用很可能被關(guān)閉,并在其重新啟動前進行回彈(運行狀態(tài)檢查設(shè)定問題稍后我們再繼續(xù)討論):

      Mesos:Docker容器農(nóng)場

      此步驟后的集群狀態(tài):

      Mesos:Docker容器農(nóng)場

      Docker

      由于我們需要在自己的從主機上運行Docker容器,因此在這些主機上安裝Docker本體就成了必要任務(wù)。幸運的是,其安裝過程非常簡單:

      下面來看Docker安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      該步驟后的集群狀態(tài):

      Mesos:Docker容器農(nóng)場

      Marathon

      盡管我們的Mesos集群已經(jīng)上線并開始運行,但我們?nèi)匀粺o法在其上運行自己的Docker容器。嚴(yán)格地講,這時我們能夠在Mesos上直接運行的只有一套Mesos框架。當(dāng)然,我們還擁有另一個更符合需求的選項——Marathon。

      從技術(shù)角度來看,Marathon只是一款簡單的Java軟件包,且能夠通過jar命令進行啟動。但好在我們還擁有一套RPM軟件包,因此我們不需要擔(dān)心其“后臺化”、配置與控制等問題。此外,由于我們的軟件包由MesoSphere負(fù)責(zé)提供,因此其使用的是同樣的配置文件(Zookeeper URL),所以我們不需要對其另行設(shè)置。 Marathon安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      Marathon還擁有一套Web UI,大家可以通過URL: http://master1:8080

      進行訪問。

      Mesos:Docker容器農(nóng)場

      下面讓咱們找點樂子,部署一項簡單的REST服務(wù)(該服務(wù)及部署設(shè)定稍后另行討論):

      Mesos:Docker容器農(nóng)場

      Mesos:Docker容器農(nóng)場

      現(xiàn)在我們已經(jīng)可以監(jiān)控其狀態(tài)以及分配端口:

      Mesos:Docker容器農(nóng)場

      因此,我們可以對其進行調(diào)用并檢查其是否正常工作(當(dāng)然,結(jié)果一切正常)。 我們甚至可以對服務(wù)進行規(guī)模擴展——如果有必要的話(目前規(guī)模擴展還沒有任何意義):

      Mesos:Docker容器農(nóng)場

      另外,通過“sandbox”分析其日志(通過Mesos UI):

      Mesos:Docker容器農(nóng)場

      該步驟后的集群狀態(tài):

      Mesos:Docker容器農(nóng)場

      Bamboo與HaProxy

      在以上示例當(dāng)中,我們只部署了一個服務(wù)實例。不過如果我們希望在其中使用大量實例與負(fù)載均衡機制,又該如何處理?這個嘛,作為答案的一部分,我們將采用HaProxy。這確實是一款非常出色的負(fù)載均衡器。不過如何對其進行配置?很簡單,交給Bamboo項目處理即可——它能夠與Zookeeper相對接,讀取Mesos狀態(tài)并生成HaProxy配置(利用每款Mesos應(yīng)用的用戶定義角色)。

      其安裝過程本來非常簡單,不過遺憾的是目前還沒有任何集成有Bamboo軟件包的公共RPM repo。大家可以對其進行手動構(gòu)建,并通過本地文件實現(xiàn)安裝,但整個過程其實有點復(fù)雜。

      以下為Bamboo安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      在Bamboo安裝完成之后,大家可以通過其Web UI進行設(shè)置: http://master1:8000

      另外也可以通過HaProxy訪問我們的服務(wù): http://master1/services/fibonacci/1

      請注意,我們在Bamboo安裝中使用了單獨的Ansible劇本(master_bamboo.yml)。之所以這樣處理,是因為我們需要借此保證其RPM軟件包在于劇本內(nèi)運行之前被上傳至虛擬主機當(dāng)中。

      由于Vagrant會在虛擬機初始化過程中自動執(zhí)行Ansible配置任務(wù),因此惟一的解決辦法就是將Bamboo相關(guān)內(nèi)容提取至單獨的劇本當(dāng)中,并執(zhí)行以下算法:

      利用vagrant up啟動虛擬機;

      將RPM文件通過SCP上傳至虛擬機當(dāng)中;

      對Vagrantfile中的ansible.playbook進行變更;

      運行vagrant provision master1命令。

      如大家所見,Bamboo是整套生態(tài)系統(tǒng)中最為雜亂的部分。所以我們不妨了解其替代方案——例如Marathon負(fù)載均衡器。

      該步驟后的集群狀態(tài):

      Mesos:Docker容器農(nóng)場

      MesosDns

      我們一直沒有談到一個重要的問題——如果我們的服務(wù)需要彼此進行通信,該如何加以實現(xiàn)?我們是否能夠立足于單一Mesos集群內(nèi)部實現(xiàn)服務(wù)發(fā)現(xiàn)?是的,答案是肯定的!相關(guān)方案也非常明確——MesosDns。這里我們的解決思路非常明確——讀取Mesos集群狀態(tài)并通過DNS(A與SRV記錄)及HTTP API進行發(fā)布。后一點非常重要,因為這將幫助我們輕松構(gòu)建客戶端負(fù)載均衡w/o【1,2】。

      整個安裝過程稍有些麻煩,不過沒什么特別之處需要注意。

      以下為MesosDns安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      Config文件中也沒有什么值得一提的內(nèi)容:

      Mesos:Docker容器農(nóng)場

      大家可以通過以下SRV記錄請求檢查已安裝的實例:

      http://172.17.42.1:8123/v1/services/fibonacci-service.tcp.marathon.mesos.

      Mesos:Docker容器農(nóng)場

      此步驟完成后的集群狀態(tài):

      Mesos:Docker容器農(nóng)場

      日志記錄

      歡呼!我們距離成功已經(jīng)很近了!必須承認(rèn),如果大家已經(jīng)耐著性子讀到這里,那么這個議題肯定非常有趣。

      值得慶幸的是,這部分并沒有太多內(nèi)容可談。日志記錄就是日志記錄。我們只需要將Logstash安裝在全部Mesos從節(jié)點當(dāng)中即可……

      以下為LogStash安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      另外對其config文件進行配置,確保將數(shù)據(jù)發(fā)布至日志節(jié)點當(dāng)中:

      Mesos:Docker容器農(nóng)場

      與此同時,我們還需要在這些節(jié)點上安裝ElasticSearch與Kibana。 ELK安裝任務(wù)中的代碼片段:

      Mesos:Docker容器農(nóng)場

      這里使用Docker的惟一理解就是其更為簡便。當(dāng)然,我們也不需要也不應(yīng)該將日志數(shù)據(jù)保存在容器當(dāng)中。

      在安裝完成之后,大家就可以通過Kibana的Web界面分析ES當(dāng)中的日志了:http://log1:5601

      目標(biāo)架構(gòu)

      下面就是我們的目標(biāo)架構(gòu),或者說我們的最終構(gòu)建成果??雌饋聿诲e,對吧? 圖十八 在我們的腳本當(dāng)中,惟一的單點故障來源就是HaProxy/Bamboo。不過大家可以將二者部署至全部主節(jié)點當(dāng)中并面向用戶使用基于DNS的輪循機制,從而輕松解決這個問題。

      分布式服務(wù)

      到這里我們已經(jīng)擁有了自己的集群?,F(xiàn)在,是時候考慮我們計劃運行于其上的分布式服務(wù)了(運行簡單應(yīng)用太過無聊,這里不再贅述)。

      我已經(jīng)開發(fā)出了一套基于REST服務(wù)的小巧SpringBoot,其能夠計算斐波那契序列中的第N個數(shù)字。這項服務(wù)的核心功能在于,其可以調(diào)用自身其它實例以計算該序列中的前一個值。

      Mesos:Docker容器農(nóng)場

      我知道,這種實現(xiàn)方式效率極低而且很容易導(dǎo)致死鎖(大家不妨想想這是為什么),但我在這里主要是借此對跨服務(wù)通信進行說明。 該服務(wù)利用MesosDns HTTP API進行服務(wù)發(fā)現(xiàn):

      Mesos:Docker容器農(nóng)場

      另外還有一套客戶端負(fù)載均衡機制(我們當(dāng)然需要盡可能減少故障點數(shù)量,對吧?):

      Mesos:Docker容器農(nóng)場

      部署

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多