DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)
這篇文章入選CSDN極客頭條
http://geek.csdn.net/news/detail/71572
當(dāng)前,要保證業(yè)務(wù)的市場(chǎng)競(jìng)爭(zhēng)力,僅靠設(shè)計(jì)一個(gè)可用并且好看的產(chǎn)品,已經(jīng)完全不能滿(mǎn)足要求。全球消費(fèi)者都希望產(chǎn)品能夠足夠的智能化,通過(guò)大數(shù)據(jù)分析來(lái)改善他們的用戶(hù)體驗(yàn)。簡(jiǎn)言之,物聯(lián)網(wǎng)和大數(shù)據(jù)終將成為改變生活的技術(shù)驅(qū)動(dòng)力。
近幾年涌現(xiàn)了大量的技術(shù)架構(gòu)與設(shè)計(jì)模式,開(kāi)發(fā)者和科學(xué)家可以利用它們?yōu)榇髷?shù)據(jù)和物聯(lián)網(wǎng)開(kāi)發(fā)實(shí)時(shí)的數(shù)據(jù)分析工作流應(yīng)用。其中批處理架構(gòu),流式處理架構(gòu),lambda架構(gòu),Kappa架構(gòu),都是其中的代表。所有這些架構(gòu),都需要一個(gè)易擴(kuò)展的大數(shù)據(jù)處理平臺(tái)作為基礎(chǔ)。于是2014年底,一組可相互兼容,互相協(xié)作的開(kāi)源組件被整合起來(lái)作為這個(gè)基礎(chǔ)平臺(tái)。SMACK應(yīng)運(yùn)而生。
SMACK包括Spark, Mesos, Akka, Cassandra, 以及Kafka,功能如下:
- 包含廣泛應(yīng)用于大數(shù)據(jù)數(shù)據(jù)處理場(chǎng)景的輕量級(jí)工具包
- 包含被健壯測(cè)試并廣泛應(yīng)用的開(kāi)源軟件,有強(qiáng)大的社區(qū)支持
- 可保證低延時(shí)下的可伸縮性和數(shù)據(jù)備份。
- 統(tǒng)一的集群管理平臺(tái)來(lái)管理多樣的,不同負(fù)載的應(yīng)用。
在部署具體的應(yīng)用的時(shí)候,大數(shù)據(jù)平臺(tái)往往要和普通應(yīng)用一起配合使用,近年來(lái),普通應(yīng)用微服務(wù)化,容器技術(shù)如火如荼,我們需要一個(gè)平臺(tái)技能管理容器,也能管理大數(shù)據(jù)平臺(tái)。
能夠管理容器的框架很多,有Docker陣營(yíng)的,Kubernetes陣營(yíng)的,各有優(yōu)劣。能夠管理大數(shù)據(jù)的平臺(tái)也很多,從Hadoop到Spark。但是部署的時(shí)候,往往需要各個(gè)集群分開(kāi)運(yùn)維,容器應(yīng)用一個(gè)集群,Hadoop一個(gè)集群,Spark一個(gè)集群,增加了運(yùn)維的難度和硬件的開(kāi)銷(xiāo)。DC/OS解決了這個(gè)問(wèn)題,它可以將容器,普通應(yīng)用,大數(shù)據(jù)應(yīng)用在同一個(gè)框架管理起來(lái),共享資源,簡(jiǎn)化運(yùn)維。
本文將帶大家來(lái)領(lǐng)略如何基于DC/OS的SMACK運(yùn)行一個(gè)應(yīng)用,以及SMACK中的各個(gè)組件如何整合。
總體架構(gòu)
下圖是一個(gè)基于SMACK的經(jīng)典應(yīng)用的總體架構(gòu)。此應(yīng)用會(huì)接入大量的數(shù)據(jù),并對(duì)數(shù)據(jù)做分析。具體說(shuō)來(lái),此應(yīng)用從用戶(hù)家里的智能儀表收集能源使用數(shù)據(jù),這些數(shù)據(jù)會(huì)被大數(shù)據(jù)分析,從而生成一個(gè)地區(qū)的能源消耗分布圖??梢员幌嚓P(guān)部門(mén)用于預(yù)估另一個(gè)地區(qū)的能源消耗。
如圖所示,智能儀表的數(shù)據(jù)會(huì)通過(guò)互聯(lián)網(wǎng)調(diào)用計(jì)量服務(wù)的HTTP接口,發(fā)送到數(shù)據(jù)中心。計(jì)量服務(wù)將消息通過(guò)Kafka發(fā)送到模擬器服務(wù)。模擬器服務(wù)獎(jiǎng)數(shù)據(jù)存儲(chǔ)在Cassandra里面。
Spark從Cassandra里面讀取數(shù)據(jù)進(jìn)行分析,將分析的結(jié)果存入Cassandra。
模擬器服務(wù)可以將Cassandra中的分析結(jié)果讀出。
當(dāng)用戶(hù)從手機(jī)和電腦上打開(kāi)網(wǎng)頁(yè)的時(shí)候,網(wǎng)頁(yè)訪(fǎng)問(wèn)計(jì)量服務(wù)的HTTP接口,計(jì)量服務(wù)從模擬器服務(wù)讀取分析結(jié)果,展示給用戶(hù)。
詳細(xì)設(shè)計(jì)
前提條件
- 安裝一個(gè)DC/OS集群
- 部署一個(gè)DC/OS命令行工具
DC/OS服務(wù)
接下來(lái),我們要保證所有必需的DC/OS的服務(wù)都處于正常狀態(tài)。下面列表中的某些服務(wù)是DC/OS的核心組件,我們把他們列在這里,是因?yàn)槲覀兊膽?yīng)用十分依賴(lài)于這些組件。
Marathon
Marathon是DC/OS的核心組件,DC/OS安裝好后就自帶Marathon。在使用他之前,我們最好查看一下他的狀態(tài)。
dcos marathon about | jq ".elected == true"Marathon LB - external (用于外部訪(fǎng)問(wèn)的Marathon負(fù)載均衡器)
默認(rèn)的Marathon負(fù)載均衡器框架會(huì)創(chuàng)建一個(gè)用于外部訪(fǎng)問(wèn)的負(fù)載均衡器實(shí)例。
如需詳細(xì)了解DC/OS如何使用Marathon負(fù)載均衡器框架,可訪(fǎng)問(wèn)此鏈接。
快速安裝:
dcos package install marathon-lbMarathon負(fù)載均衡器是基于haproxy的,可用過(guò)下面的URL訪(fǎng)問(wèn)http://p1.dcos:9090/haproxy?stats。Mesos DNS作為DC/OS內(nèi)部的DNS會(huì)記錄Marathon負(fù)載均衡器的域名為marathon-lb.marathon.mesos。Mesos DNS也是DC/OS的核心組件。Marathon負(fù)載均衡器會(huì)被安裝在任一DC/OS的公網(wǎng)節(jié)點(diǎn)上,例如p1是一個(gè)公網(wǎng)節(jié)點(diǎn)的域名,可以通過(guò)http://p1.dcos訪(fǎng)問(wèn)Marathon負(fù)載均衡器。
Marathon LB - internal (用于內(nèi)部訪(fǎng)問(wèn)的Marathon負(fù)載均衡器)
需要?jiǎng)?chuàng)建另一個(gè)Marathon的負(fù)載均衡器,用于內(nèi)部組件的相互訪(fǎng)問(wèn),而不需要內(nèi)部組件之間的網(wǎng)絡(luò)流量也經(jīng)過(guò)公網(wǎng)。
快速安裝:
cat < marathon-internal-lb-options.json { "marathon-lb":{ "name":"marathon-lb-internal", "haproxy-group":"internal", "bind-http-https":false, "role":"" } } EOF dcos package install --options=marathon-internal-lb-options.json marathon-lb內(nèi)部的Marathon負(fù)載均衡器在Mesos DNS中的域名為marathon-lb-internal.marathon.mesos。
Kafka
Kafka已經(jīng)在DC/OS的服務(wù)庫(kù)中,所以我們可以直接拿過(guò)來(lái)用,而不需要自己管理和維護(hù)一個(gè)Kafka集群
快速安裝:
dcos package install --yes kafka只需要運(yùn)行下面的命令就可以驗(yàn)證服務(wù)的狀態(tài)。
dcos package list kafka; dcos kafka helpKafka服務(wù)作為Marathon的一個(gè)Job運(yùn)行,從而可以實(shí)現(xiàn)長(zhǎng)期運(yùn)行,高可用,彈性伸縮。安裝Kafka需要幾分鐘的時(shí)間,可以通過(guò)Marathon查看進(jìn)度。
Kafka默認(rèn)有三個(gè)Broker實(shí)例。你可以定制化Kafka服務(wù),根據(jù)所需要處理的負(fù)載情況,創(chuàng)建更多的Broker。Kafka中的Topic的創(chuàng)建以及消息的消費(fèi)都是由應(yīng)用層進(jìn)行處理。
Cassandra
作為大數(shù)據(jù)基礎(chǔ)架構(gòu),把Cassandra運(yùn)行在DC/OS上也是必須的。Cassandra已經(jīng)放在了DC/OS的服務(wù)庫(kù)中了。
快速安裝:
$ dcos package install cassandra Installing Marathon app for package [cassandra] version [1.0.0-2.2.5] Installing CLI subcommand for package [cassandra] version [1.0.0-2.2.5] New command available: dcos cassandra DC/OS Cassandra Service is being installed.安裝Cassandra需要幾分鐘的時(shí)間。默認(rèn)情況下,Cassandra會(huì)安裝3個(gè)節(jié)點(diǎn),其中2個(gè)是種子節(jié)點(diǎn)。
ssh到Cassandra集群
Cassandra集群已經(jīng)運(yùn)行起來(lái)了,下面需要連接到這個(gè)集群。讓我們通過(guò)下面的命令先得到連接信息。
$ dcos cassandra connection {"nodes": ["192.168.65.111:9042","192.168.65.121:9042", "192.168.65.131:9042" ] }因?yàn)镮P都是私有IP,因此我們首先要ssh到DC/OS集群中,然后才能練到Cassandra集群。
$ dcos node ssh --master-proxy --leader現(xiàn)在我們進(jìn)入到了DC/OS集群內(nèi)部,可以直接連接Cassandra集群了。我們使用cqlsh客戶(hù)端,選取一個(gè)Cassandra的節(jié)點(diǎn)進(jìn)行連接。運(yùn)行下面的命令。
$ docker run -ti cassandra:2.2.5 cqlsh 10.0.2.136 cqlsh>創(chuàng)建keyspace
我們已經(jīng)連接到了Cassandra集群,創(chuàng)建一個(gè)名為iot_demo的keyspace.
cqlsh> CREATE KEYSPACE iot_demo WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };創(chuàng)建好了keyspace,我們可以添加一些表及模擬數(shù)據(jù)到keyspace里面,從而我們的應(yīng)用可以使用Cassandra.
服務(wù)發(fā)現(xiàn)
基于DC/OS命令行的服務(wù)發(fā)現(xiàn)
我們可以使用DC/OS的工具進(jìn)行服務(wù)發(fā)現(xiàn)。在Docker的Entrypoint里面,可以嵌入腳本,通過(guò)DC/OS的命令行發(fā)現(xiàn)服務(wù),并export在環(huán)境變量里面。
Akka的服務(wù)發(fā)現(xiàn)
為了發(fā)現(xiàn)Akka節(jié)點(diǎn),在Docker的entrypoint腳本docker-entrypoint.sh中,嵌入下面的命令:
export AKKA_SEED_NODES=`dcos marathon app show | jq -r ".tasks[].host" | tr '\n' ',' | sed 's/,$//g'`應(yīng)用的配置可以使用這個(gè)環(huán)境變量。如果自己是Akka集群的第一個(gè)節(jié)點(diǎn),則創(chuàng)建一個(gè)Akka集群,如果已經(jīng)存在一個(gè)Akka集群,則可以發(fā)現(xiàn)并加入這個(gè)集群。
我們考慮了下面這個(gè)特殊的場(chǎng)景:
當(dāng)前容器中的Akka節(jié)點(diǎn)是第一個(gè)節(jié)點(diǎn),在這種特殊情況下,服務(wù)發(fā)現(xiàn)這一步的結(jié)果是發(fā)現(xiàn)了自己,此結(jié)果是正確的,做默認(rèn)處理即可。
Kafka的服務(wù)發(fā)現(xiàn)
類(lèi)似,我們同樣可以在Docker的entrypoint里面嵌入下面的腳本發(fā)現(xiàn)Kafka的所有的broker。
export KAFKA_BROKERS_LIST=`dcos kafka connection --dns | jq -r ".names[]" | tr '\n' ',' | sed 's/,$//g'`基于Marathon負(fù)載均衡器的服務(wù)發(fā)現(xiàn)
可以使用內(nèi)部的和外部的Marathon負(fù)載均衡器作為服務(wù)發(fā)現(xiàn)的另一種方式。
應(yīng)用層的部署
我們已經(jīng)部署完了DC/OS的服務(wù),并且配置了服務(wù)發(fā)現(xiàn)。接下來(lái),我們來(lái)部署應(yīng)用,使用這些DC/OS服務(wù)。
我們將使用Marathon部署應(yīng)用層,從而達(dá)到應(yīng)用的長(zhǎng)時(shí)間運(yùn)行。應(yīng)用的組件會(huì)作為Marathon的任務(wù)運(yùn)行在Docker里面。組件之間的相互配置和依賴(lài)關(guān)系,都可以通過(guò)Marathon來(lái)實(shí)現(xiàn)。
應(yīng)用層保護(hù)兩個(gè)微服務(wù),計(jì)量服務(wù)和模擬器服務(wù),另外還有一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)做展示。
計(jì)量服務(wù)
計(jì)量服務(wù)構(gòu)成一個(gè)Akka集群,暴露REST接口被模擬器服務(wù)和網(wǎng)頁(yè)訪(fǎng)問(wèn)。
計(jì)量服務(wù)定義為下面的json,發(fā)送給Marathon進(jìn)行部署
{"id": "meter","container": { "type": "DOCKER", "docker": { "image": "cakesolutions/iot-demo-meter" } }, "labels":{ "HAPROXY_GROUP":"external,internal" } … }Marathon的任務(wù)定義包含一個(gè)特殊的標(biāo)簽HAPROXY_GROUP,通過(guò)這個(gè)標(biāo)簽,Marathon負(fù)載均衡器知道是否暴露這個(gè)應(yīng)用?!眅xternal”是默認(rèn)的用于外部訪(fǎng)問(wèn)的Marathon負(fù)載均衡器,說(shuō)明外部可以訪(fǎng)問(wèn)這個(gè)服務(wù)。
“internal”是用于內(nèi)部訪(fǎng)問(wèn)的Marathon負(fù)載均衡器,說(shuō)明此服務(wù)可以通過(guò)下面的DNS,被內(nèi)部的其他組件訪(fǎng)問(wèn):marathon-lb-internal.marathon.mesos:1900。模擬器服務(wù)就可以使用這個(gè)DNS訪(fǎng)問(wèn)計(jì)量服務(wù)的REST API。
用于外部訪(fǎng)問(wèn)的Marathon負(fù)載均衡器需要保證內(nèi)部的DNS marathon-lb.marathon.mesos:19002可以在外網(wǎng)上被解析為p1.dcos:19002。
網(wǎng)頁(yè)就需要使用這個(gè)外網(wǎng)可訪(fǎng)問(wèn)的域名,因?yàn)榫W(wǎng)頁(yè)是運(yùn)行在瀏覽器里面的,在數(shù)據(jù)中心外,無(wú)法使用內(nèi)部DNS.
接下來(lái),我們調(diào)用下面的命令部署計(jì)量服務(wù)。
dcos marathon app add meter.json The Marathon jobs can be redeployed by using either Marathon API, either DC/OS CLI. Traditionally now we’ve been using the Marathon API, directly or with the Python driver.模擬器服務(wù)
模擬器服務(wù)的Marathon的json如下:
{"id": "simulator","container": { "type": "DOCKER", "docker": { "image": "cakesolutions/iot-demo-simulator" } }, "env": { "METER_HOST": "marathon-lb-internal.marathon.mesos", "METER_PORT": "19002" }, "labels":{ "HAPROXY_GROUP":"external" } }類(lèi)似,我們通過(guò)下面的命令將模擬器服務(wù)作為Marathon的任務(wù)運(yùn)行,從而實(shí)現(xiàn)長(zhǎng)時(shí)間運(yùn)行。
dcos marathon app add simulator.json模擬器服務(wù)需要知道計(jì)量服務(wù)的API,所以我們將計(jì)量服務(wù)的DNS作為環(huán)境變量傳給了模擬器服務(wù)。
用于外部訪(fǎng)問(wèn)的Marathon負(fù)載均衡器需要保證內(nèi)部的DNS marathon-lb.marathon.mesos:19001可以在外網(wǎng)上被解析為p1.dcos:19001。從而可以被網(wǎng)頁(yè)訪(fǎng)問(wèn)。
網(wǎng)頁(yè)客戶(hù)端
網(wǎng)頁(yè)也使用Marathon的json如下:
{"id": "web","container": { "type": "DOCKER", "docker": { "image": "cakesolutions/iot-demo-web", } }, "env": { "METER_HOST": "p1.dcos", "METER_PORT": "19002", "METER_HOST": "p1.dcos", "METER_PORT": "19001" }, "labels":{ "HAPROXY_GROUP":"external" } }將網(wǎng)頁(yè)運(yùn)行為Marathon的任務(wù)。
dcos marathon app add web.json網(wǎng)頁(yè)需要能夠在瀏覽器中訪(fǎng)問(wèn)計(jì)量服務(wù)和模擬器服務(wù),因而兩個(gè)服務(wù)的DNS都作為環(huán)境變量傳給了網(wǎng)頁(yè)的Docker.
P1.dcos是DC/OS公網(wǎng)節(jié)點(diǎn)的DNS域名,Marathon的負(fù)載均衡器會(huì)運(yùn)行在這個(gè)公網(wǎng)節(jié)點(diǎn)上。
METER_HOST=p1.dcos METER_PORT=19002 SIMULATOR_HOST=p1.dcos SIMULATOR_PORT=19001總結(jié)
到此,我們看到了SMACK中的框架如何運(yùn)行在DC/OS上,例如Kafka, Cassandra這些復(fù)雜的組件如何被方便的安裝和配置,如何基于這些框架構(gòu)建自己的服務(wù)。
因而我們可以得出結(jié)論,DC/OS的確是:
- 在生產(chǎn)環(huán)境部署容器應(yīng)用的最方便的方式
- 充分高效率利用我們的基礎(chǔ)架構(gòu)的最方便的方式
- 非常方便的將不同的框架安裝在同一個(gè)集群環(huán)境中。
- 提供了一種非常方便的方式對(duì)服務(wù)進(jìn)行彈性伸縮。
總而言之,DC/OS是能夠解決您數(shù)據(jù)中心問(wèn)題的完整解決方案。誠(chéng)如大家所知,DC/OS是基于Mesos的,是高可靠的,是被生產(chǎn)環(huán)境驗(yàn)證過(guò)的。
http://www.cnblogs.com/popsuper1982/p/5585437.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/softidea/p/7003126.html
總結(jié)
以上是生活随笔為你收集整理的DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vue重要特性
- 下一篇: POJ-1050 To the Max