怎樣在Docker Swarm上部署Apache Storm
大?。?/span>0.9 MB 人氣: 2017-10-10 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶(hù)評(píng)論(0)
標(biāo)簽:apachestorm(1704)
本文是一篇來(lái)源于Baqend Tech博客的客座轉(zhuǎn)貼,描述了如何在Docker Swarm,而不是在虛擬機(jī)上部署和調(diào)配Apache Storm集群。這個(gè)題目很有意思,Wolfram Wingerath將之描述為“真正有趣”的體驗(yàn),在Tech上你很少能聽(tīng)見(jiàn)這種話(huà)。我好奇地問(wèn)他是什么讓使用容器比使用虛擬機(jī)更棒?他回答說(shuō):作為一名Docker和Docker Swarm的新手,我肯定還有很多不知道的事。不過(guò),在我看來(lái),在Docker上部署(及一般操作)比在虛擬機(jī)甚至裸機(jī)上更有趣,因?yàn)镈ocker提取自從異構(gòu)性和許多問(wèn)題中。一旦運(yùn)行了Docker,你就可以用一行聲明語(yǔ)句來(lái)啟動(dòng)MongoDB或者Redis的服務(wù)器等東西。Docker Swarm集群可以幫你做同樣的事,而且Docker還會(huì)幫你把啟動(dòng)的東西分發(fā)給集群中的某個(gè)服務(wù)器。Docker甚至?xí)湍?a href='http://ttokpm.com/soft/special/' target='_blank' class='arckwlink_none'>下載正確的鏡像,如果你本地沒(méi)有的話(huà)。你也不用解決連接問(wèn)題,因?yàn)橹灰谕籇ocker網(wǎng)絡(luò)中,任一臺(tái)機(jī)器都與所有其他的機(jī)器互聯(lián)互通。正如在本教程中所提到的,只要你使用了overlay網(wǎng)絡(luò),分布式安裝也能實(shí)現(xiàn)。
你在郵件中引用到了我的一些話(huà),當(dāng)我在寫(xiě)它們的時(shí)候,我的腦海深處想起了幾個(gè)月前,我需要安裝和運(yùn)行一個(gè)擁有超過(guò)16個(gè)節(jié)點(diǎn)的Apache Storm集群的事。當(dāng)時(shí)有好幾個(gè)問(wèn)題,比如,我對(duì)AWS并不太熟悉(以前是用OpenStack的),還有與(Storm使用的)Netty的連接性問(wèn)題,以及AWS的主機(jī)名解析問(wèn)題。這些問(wèn)題在我設(shè)置OpenStack的時(shí)候從沒(méi)出現(xiàn)過(guò)。最終我們花費(fèi)了數(shù)天及數(shù)百美元去解決它們。我真心認(rèn)為,如果你使用Docker,你就不會(huì)遇到這些麻煩,因?yàn)槟愕沫h(huán)境始終如一:即Docker。
回到教程上來(lái)
Bagend Cloud即將支持查詢(xún)緩存和連續(xù)查詢(xún)的功能,我們將依靠Apache Storm來(lái)處理低延遲的數(shù)據(jù)。已經(jīng)有好幾個(gè)項(xiàng)目都致力于實(shí)現(xiàn)在Docker上部署多服務(wù)器Storm (例如wurstmeister/storm-docker或viki-org/storm-docker),但是越過(guò)服務(wù)器數(shù)量的限制似乎會(huì)使事情變得復(fù)雜。既然可擴(kuò)展性和易操作性是我們部署的關(guān)鍵,我們從一開(kāi)始就使用Dock Swarm,也很高興地看到事情進(jìn)展的如此順利。我們希望通過(guò)這篇教程來(lái)分享我們的經(jīng)歷,提升你對(duì)即將發(fā)布的Baqend實(shí)時(shí)API的興趣,最終宣傳一下Dock Swarm(因?yàn)樗娴暮芘#。?)
如果你是Swarm新手,請(qǐng)看我們的AWS Meetup Docker幻燈片!
接下來(lái)的計(jì)劃
概述
首先,我們將介紹一個(gè)簡(jiǎn)單的部署范例,并解釋其中的每一部分。接著,我們會(huì)告訴你在TL;DR中所需做的最簡(jiǎn)單的準(zhǔn)備工作(使用事先準(zhǔn)備好的實(shí)用腳本程序)。然后,我們會(huì)來(lái)到本教程的核心部分,一步步向你展示Docker Swarm集群及多節(jié)點(diǎn)Apache Storm集群的部署過(guò)程。當(dāng)然,我們也會(huì)做一些與Storm(特別是部署和終止遠(yuǎn)程服務(wù)器上的拓?fù)洌┮约癝warm(例如重啟manager節(jié)點(diǎn)和終止整個(gè)Storm集群)都涉及到的常規(guī)工作。
概述:部署
下圖是部署的架構(gòu)圖:
有三臺(tái)運(yùn)行Ubuntu Server 14.04的機(jī)器,每臺(tái)都會(huì)運(yùn)行一個(gè)Docker守護(hù)進(jìn)程,同時(shí)每臺(tái)都裝有幾個(gè)容器。經(jīng)過(guò)初始設(shè)置,你只能訪問(wèn)其中一臺(tái)機(jī)器(Ubuntu 1),很大程度上來(lái)說(shuō),會(huì)覺(jué)得只有一個(gè)Docker守護(hù)進(jìn)程。
安裝Swarm之后,你會(huì)創(chuàng)建一個(gè)覆蓋網(wǎng)絡(luò)(stormnet),這樣不同Swarm節(jié)點(diǎn)間的Docker容器就可以相互通信了。最終,你將建立起一個(gè)成熟的Storm集群,這個(gè)集群使用現(xiàn)有的 ZooKeeper 共同協(xié)調(diào),并通過(guò)stormnet實(shí)現(xiàn)節(jié)點(diǎn)間的通信。雖然監(jiān)管容器將每一臺(tái)服務(wù)器策略分發(fā),Nimbus和UI容器則會(huì)安裝在manager節(jié)點(diǎn)上(Ubuntu 1)。
必須允許對(duì)Ubuntu 1機(jī)器的公共訪問(wèn)(即分配一個(gè)公共IP和開(kāi)放端口8080?。7駝t,你就看不到Storm美麗的UI了。
詳細(xì)教程
我們給三個(gè)Ubuntu機(jī)器的域名分別是zk1.cloud、zk2.cloud和zk3.cloud。由于ZooKeeper服務(wù)器和manager節(jié)點(diǎn)從概念上說(shuō)是兩個(gè)不同的角色,我們使用manager.swarm和manager.swarm.baqend.com作為manager節(jié)點(diǎn)的私有IP地址和公共IP地址。盡管本教程中,Ubuntu 1實(shí)際上是扮演了ZooKeeper 1和管理者兩個(gè)角色,但你可以在自己部署的時(shí)候使用不同兩個(gè)服務(wù)器來(lái)完成。在Github上check out這個(gè)教程,在readme.me中,根據(jù)你自己的域名,查找并替換我們的原有域名,然后你就可以把我們的大部分語(yǔ)句復(fù)制粘貼到我們將要使用的外殼程序中了。
太長(zhǎng)不看?
對(duì)于那些急著看結(jié)果的人來(lái)說(shuō),我們也準(zhǔn)備了一些腳本!這些是部署Swarm和Storm所需的全部腳本了。但是,為了便于理解,后面還是會(huì)有一個(gè)詳細(xì)的步驟描述的。
所以,在討論細(xì)節(jié)之前,這有一份快速指南:
1.創(chuàng)建一個(gè)Ubuntu 14.04服務(wù)器 – 我們稱(chēng)之為Ubuntu 1 – 然后通過(guò)SSH連接它。然后執(zhí)行以下語(yǔ)句check out指南中的腳本來(lái)安裝Docker:
sudoapt-get install git -y && \ cd/home/ubuntu/ && \ git clone https://github.com/Baqend/tutorial-swarm-storm.git && \ chmod +x tutorial-swarm-storm/s/* && \ cdtutorial-swarm-storm/s/ && \ sudobash installDocker.sh && \ sudousermod -aG docker ubuntu && \ sudoshutdown -h now
2.機(jī)器會(huì)自動(dòng)關(guān)機(jī)。關(guān)機(jī)的時(shí)候,生成快照。
3.啟動(dòng)兩臺(tái)你剛剛快照過(guò)的機(jī)器(Ubuntu 2和Ubuntu 3),使用一下自定義腳本把它們做成Swarm worker節(jié)點(diǎn):
#!/bin/bash cd /home/ubuntu/ &&rm -rf tutorial-swarm-storm &&\ git clone https://github.com/Baqend/tutorial-swarm-storm.git &&\ cd tutorial-swarm-storm/s/ &&\ chmod +x 。/* &&\ 。/init.sh zk1.cloud,zk2.cloud,zk3.cloud
注意:你需要把逗號(hào)分隔開(kāi)的主機(jī)名替換成你自己的主機(jī)名。
4.對(duì)域名服務(wù)器做如下設(shè)置:把列表中的第一臺(tái)主機(jī)zk1.cloud指向Ubuntu1,剩下的zk2.cloud和zk3.cloud分別指向Ubuntu 2和Ubuntu 3。另外要確保manager.swarm.baqend.com和manager.swarm分別被解析為Ubuntu 1的公開(kāi)IP地址和私有IP地址。
5.確保主機(jī)之間可以互相訪問(wèn):需要打開(kāi)端口2181、2888、3888 (ZooKeeper)、2375 (Docker Swarm)和6627 (Storm,遠(yuǎn)程拓?fù)洳渴穑?。為了保證能從外部訪問(wèn)Storm UI,還必須公開(kāi)manager.swarm.baqend.com:8080。
6.最后,啟動(dòng)Ubuntu 1同時(shí)運(yùn)行下列代碼,配置ZooKeeper ensemble、Swarm和Storm:
cd /home/ubuntu/tutorial-swarm-storm/s/ && \ ZOOKEEPER=zk1.cloud,zk2.cloud,zk3.cloud&& \ sudo bash init.sh$ZOOKEEPER manager && \ 。 swarm.sh$ZOOKEEPER && \ 。 storm.sh$ZOOKEEPER 3
再次提醒:記得把其中的主機(jī)名替換為你自己的。
你現(xiàn)在應(yīng)該可以訪問(wèn)http://manager.swarm.baqend.com:8080下的Storm UI了。
另外,當(dāng)你在manager節(jié)點(diǎn)上輸入
dockerinfo
時(shí),你將會(huì)看見(jiàn)UI和Nimbus容器在同一臺(tái)機(jī)器上運(yùn)行,而Swarm管理器和監(jiān)控容器則在不同的機(jī)器上運(yùn)行。
再做一次:準(zhǔn)備一個(gè)鏡像
好,現(xiàn)在讓我們來(lái)看一遍詳細(xì)的步驟。為了避免重復(fù)的步驟,我們只在一臺(tái)機(jī)器上進(jìn)行這些準(zhǔn)備工作,然后關(guān)機(jī)并快照。接著我們通過(guò)這個(gè)快照創(chuàng)建其它機(jī)器。
讓我們開(kāi)始吧:
1.創(chuàng)建Ubuntu 1,作為Ubuntu 14.04服務(wù)器,然后通過(guò)SSH連接它,執(zhí)行下列語(yǔ)句安裝Docker:
sudo apt-getupdate &&sudo apt-getinstall apt-transport-httpsca-certificates&&sudo apt-keyadv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D \&&echo “deb https://apt.dockerproject.org/repo ubuntu-trusty main”|sudo tee -a/etc/apt/sources.list.d/docker.list\&&sudo apt-getupdate &&sudo apt-getpurge lxc-docker&&sudo apt-cachepolicy docker-engine\&&sudo apt-getupdate -y&&sudo apt-getinstall -ylinux-image-extra-$(uname -r) apparmor docker-enginegit make \&&sudo usermod -aGdocker $(whoami)
?。P(guān)于Docker安裝的細(xì)則可以看這里)
由于Docker是通過(guò)一個(gè)key文件去識(shí)別不同的docker守護(hù)進(jìn)程的,因此在快照之前,我們要停止docker守護(hù)進(jìn)程,刪掉這個(gè)key文件(重啟Docker后會(huì)生成一個(gè)新的Key文件),關(guān)機(jī)之前記得快照。
sudoservice docker stop \ && sudorm /etc/docker/key.json
注意:如果你不在快照之前刪掉這個(gè)Key文件,則所有根據(jù)這個(gè)鏡像生成的機(jī)器都會(huì)擁有同樣的識(shí)別符,最終你的Swarm集群一片狼藉。
3.最后,我們只 需要用同一個(gè)方法準(zhǔn)備一個(gè)機(jī)器,這個(gè)機(jī)器在下次boot的時(shí)候會(huì)成為Swarm worker。為此,我們用文本編輯器,例如nano,創(chuàng)建一個(gè)文件 /etc/init.sh。
sudonano /etc/init.sh
接著,我們復(fù)制下列代碼,并保存:
#!/bin/bash# first argument: the servers in the ZooKeeper ensemble:ZOOKEEPER_SERVERS=$1# second argument: the role of this node:# (“manager” for the Swarm manager node; leave empty else)ROLE=$2# the IP address of this machine:PRIVATE_IP=$(/sbin/ifconfig eth0 | grep ‘inet addr:’| cut -d: -f2 | awk ‘{ print $1}’) # define label for the manager node:if[[ $ROLE== “manager”]];thenLABELS=“--label server=manager”;elseLABELS=“”;fi# define default options for Docker Swarm:echo“DOCKER_OPTS=\”-H tcp://0.0.0.0:2375 \ -H unix:///var/run/docker.sock \ --cluster-advertise eth0:2375 \ $LABELS\ --cluster-store \ zk://$ZOOKEEPER_SERVERS\“”\ | sudotee /etc/default/docker # restart the service to apply new options:sudoservice docker restart echo“l(fā)et‘s wait a little.。.”sleep 30# make this machine join the Docker Swarm cluster:docker run -d--restart=always swarm join --advertise=$PRIVATE_IP:2375zk://$ZOOKEEPER_SERVERS
4.現(xiàn)在,我們要關(guān)機(jī)了。
sudoshutdown -h now
接著快照一下。
5.現(xiàn)在,通過(guò)快照的鏡像,啟動(dòng)另外兩臺(tái)機(jī)器(Ubuntu 2和Ubuntu 3)。使用下面的語(yǔ)句作為初始/自定義腳本:
#!/bin/bash/bin/bash /etc/init.sh\ zk1.cloud,zk2.cloud,zk3.cloud
注意:如果你使用的是OpenStack,上述腳本可以加為自定義腳本。但如果是AWS,則應(yīng)加為用戶(hù)數(shù)據(jù)。
6.重啟已經(jīng)快照過(guò)的機(jī)器(Ubuntu 1),連接機(jī)器,接著執(zhí)行以下代碼:
/bin/bash /etc/init.sh\ zk1.cloud,zk2.cloud,zk3.cloud\ manager
這會(huì)在機(jī)器上建立一個(gè)Swarm worker,并標(biāo)之為Swarm管理器。
7.對(duì)域名服務(wù)器做如下設(shè)置:將列表中的第一個(gè)域名(zk1…)指向Ubuntu1上的管理器,剩下的兩個(gè)域名(zk2…和zk3…)指向另外兩臺(tái)剛剛啟動(dòng)的機(jī)器,即Ubuntu 2和Ubuntu 3。另外要確保manager.swarm.baqend.com和manager.swarm分別被解析為Ubuntu的公開(kāi)IP地址和私有IP地址。
8.最后,完成安全設(shè)置,使端口2181、2888、3888 (ZooKeeper)、2375 (Docker Swarm)和6627 (Storm, 遠(yuǎn)程拓?fù)洳渴穑┥系臋C(jī)器可以互相訪問(wèn)。如果你希望可以實(shí)現(xiàn)從外部訪問(wèn)Storm UI,那么還需要公開(kāi)manager.swarm.baqend.com:8080。
見(jiàn)證奇跡的時(shí)刻到了!
創(chuàng)建Swarm集群
如果一切順利,那么你現(xiàn)在已經(jīng)有了三臺(tái)Ubuntu服務(wù)器,每個(gè)上面都運(yùn)行了一個(gè)Docker守護(hù)進(jìn)程??梢酝ㄟ^(guò)私有網(wǎng)絡(luò)中的zk1.cloud和manager.swarm訪問(wèn)Ubuntu 1,或者也可以從外部通過(guò)manager.swarm.baqend.com(至少在8080端口)訪問(wèn)。我們一直在這臺(tái)機(jī)器上折騰,并且,從現(xiàn)在開(kāi)始,這是我們唯一需要訪問(wèn)的機(jī)器。為了保證Swarm節(jié)點(diǎn)之間的協(xié)調(diào)通暢,我們需要配置ZooKeeper ensemble和Swarm管理器。
1.通過(guò)SSH連接Ubuntu1,接著快速檢查一遍。如果Docker安裝正確,運(yùn)行下列代碼可以顯示出一個(gè)所有運(yùn)行中的Docker容器的列表(只有針對(duì)Swarm的):
docker ps
2.現(xiàn)在我們可以按下面的方法在每臺(tái)機(jī)器上啟動(dòng)一個(gè)ZooKeeper節(jié)點(diǎn):
docker -Htcp://zk1.cloud:2375 run -d --restart=always \-p2181:2181\-p2888:2888\-p3888:3888\-v/var/lib/zookeeper:/var/lib/zookeeper \-v/var/log/zookeeper:/var/log/zookeeper \--name zk1 \baqend/zookeeper zk1.cloud,zk2.cloud,zk3.cloud 1docker -Htcp://zk2.cloud:2375 run -d --restart=always \-p2181:2181\-p2888:2888\-p3888:3888\-v/var/lib/zookeeper:/var/lib/zookeeper \-v/var/log/zookeeper:/var/log/zookeeper \--name zk2 \baqend/zookeeper zk1.cloud,zk2.cloud,zk3.cloud 2docker -Htcp://zk3.cloud:2375 run -d --restart=always \-p2181:2181\-p2888:2888\-p3888:3888\-v/var/lib/zookeeper:/var/lib/zookeeper \-v/var/log/zookeeper:/var/log/zookeeper \--name zk3 \baqend/zookeeper zk1.cloud,zk2.cloud,zk3.cloud 3
通過(guò)明確說(shuō)明-H……參數(shù),我們可以在不同的主機(jī)上啟動(dòng)ZooKeeper容器。-p命令打開(kāi)ZooKeeper默認(rèn)需要的那些端口。兩個(gè)-v命令通過(guò)將ZooKeeper使用的文件夾映射到對(duì)應(yīng)的主機(jī)文件夾,可以在發(fā)生容器錯(cuò)誤的情況仍然保持連貫性。以逗號(hào)分隔的主機(jī)名列表通知ZooKeeper這一集合中有哪些服務(wù)器。集合中的每個(gè)節(jié)點(diǎn)都不例外。唯一的變量就是ZooKeeper的ID(第二個(gè)參數(shù)),因?yàn)樗鼘?duì)每個(gè)容器都是不一樣的。
你可以使用以下命令行來(lái)檢查ZooKeeper是否一切正常:
docker -H tcp://zk1.cloud:2375exec -it zk1 bin/zkServer.shstatus && \ docker -H tcp://zk2.cloud:2375exec -it zk2 bin/zkServer.shstatus && \ docker -H tcp://zk3.cloud:2375exec -it zk3 bin/zkServer.shstatus
如果你的集群一切正常,每個(gè)節(jié)點(diǎn)都會(huì)匯報(bào)它們是主節(jié)點(diǎn)還是從節(jié)點(diǎn)。
Now it’s time to start the Swarm manager:
現(xiàn)在是開(kāi)啟Swarm管理器的時(shí)候了:
docker run -d --restart=always \ --label role=manager \ -p 2376:2375\ swarm manage zk://zk1.cloud,zk2.cloud,zk3.cloud
現(xiàn)在Swarm集群正在運(yùn)行。但是我們必須把這一點(diǎn)告訴Docker客戶(hù)端。最后你只須保證之后所有的Docker運(yùn)行語(yǔ)句都指向Swarm管理器的容器(它會(huì)負(fù)責(zé)排程),并且不違反本地Docker守護(hù)進(jìn)程。
cat 《《 EOF| tee -a~/.bash_profile # this node is the master and therefore should be able to talk to the Swarm cluster:export DOCKER_HOST=tcp://127.0.0.1:2376EOF``` export DOCKER_HOST=tcp://127.0.0.1:2376上面這段會(huì)立即執(zhí)行,并且保證下次我們登錄機(jī)器的時(shí)候被再次執(zhí)行。 《divclass=“se-preview-section-delimiter”》《/div》 ##健康度檢查現(xiàn)在一切都被啟動(dòng)運(yùn)行了。鍵入 《divclass=“se-preview-section-delimiter”》《/div》
docker info
檢查一下manager節(jié)點(diǎn)上的集群狀態(tài)。你會(huì)看到3個(gè)運(yùn)行中的worker,類(lèi)似這樣: 《divclass=“se-preview-section-delimiter”》《/div》
Nodes: 3 docker1: zk1.cloud:2375 └ Status: Healthy └ Containers: 3 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 2.053 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-40-generic, operatingsystem=Ubuntu 14.04.1 LTS, server=manager, storagedriver=devicemapper └ Error: (none) └ UpdatedAt: 2016-04-03T15:39:59Z docker2: zk2.cloud:2375 └ Status: Healthy └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 2.053 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-40-generic, operatingsystem=Ubuntu 14.04.1 LTS, storagedriver=devicemapper └ Error: (none) └ UpdatedAt: 2016-04-03T15:39:45Z docker3: zk3.cloud:2375 └ Status: Healthy └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 2.053 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-40-generic, operatingsystem=Ubuntu 14.04.1 LTS, storagedriver=devicemapper └ Error: (none) └ UpdatedAt: 2016-04-03T15:40:15Z
最重要的是每個(gè)節(jié)點(diǎn)的Status: Healthy那一行。如果你發(fā)現(xiàn)出現(xiàn)了其它的狀態(tài),例如Status: Pending,或者有的節(jié)點(diǎn)沒(méi)有顯示出來(lái),那么即使其它地方還沒(méi)有報(bào)錯(cuò),也應(yīng)該用以下命令試著重啟管理容器, 《divclass=“se-preview-section-delimiter”》《/div》
docker restart $(docker ps -a --no-trunc --filter “l(fā)abel=role=manager” | awk ’{if(NR》1)print $1;}‘)
然后再檢查一次(這個(gè)操作可能會(huì)引發(fā)一個(gè)錯(cuò)誤信息;無(wú)視它)。 《divclass=“se-preview-section-delimiter”》《/div》 ##創(chuàng)建Storm集群現(xiàn)在Swarm已經(jīng)運(yùn)行起來(lái)了,你將要?jiǎng)?chuàng)建一個(gè)覆蓋網(wǎng)絡(luò)來(lái)跨越所有的Swarm節(jié)點(diǎn),為單獨(dú)的Storm組建運(yùn)轉(zhuǎn)多個(gè)容器。盡管Supervisor節(jié)點(diǎn)(即Storm workers)散布于Swarm集群中的所有節(jié)點(diǎn),Nimbus和UI會(huì)在manager節(jié)點(diǎn)上,每臺(tái)服務(wù)器上一個(gè)。 1.先創(chuàng)建覆蓋網(wǎng)絡(luò)stormnet: 《divclass=“se-preview-section-delimiter”》《/div》
docker network create --driver overlay stormnet
然后通過(guò)Docker來(lái)檢查stormnet是否存在: 《divclass=“se-preview-section-delimiter”》《/div》
docker network ls
2.現(xiàn)在一個(gè)一個(gè)地啟動(dòng)Storm組件。每個(gè)Storm相關(guān)的容器會(huì)有一個(gè)cluster=storm標(biāo)記,這樣你在后面殺死整個(gè)Storm集群時(shí),不會(huì)錯(cuò)殺其它容器。 首先,啟動(dòng)UI 《divclass=“se-preview-section-delimiter”》《/div》
docker run \ -d \ --label cluster=storm \ --label role=ui \ -e constraint:server==manager \ -e STORM_ZOOKEEPER_SERVERS=zk1.cloud,zk2.cloud,zk3.cloud \ --net stormnet \ --restart=always \ --name ui \ -p 8080:8080 \ baqend/storm ui \ -c nimbus.host=nimbus
接下來(lái)是Nimbus: 《divclass=“se-preview-section-delimiter”》《/div》
docker run \ -d \ --label cluster=storm \ --label role=nimbus \ -e constraint:server==manager \ -e STORM_ZOOKEEPER_SERVERS=zk1.cloud,zk2.cloud,zk3.cloud \ --net stormnet \ --restart=always \ --name nimbus \ -p 6627:6627 \ baqend/storm nimbus \ -c nimbus.host=nimbus
為了確保這些在manager節(jié)點(diǎn)上運(yùn)行,我們加入一個(gè)限制條件:constraint:server==manager。 3.你現(xiàn)在可以訪問(wèn)Storm UI了,就好像它是在manager節(jié)點(diǎn)上運(yùn)行一樣:假如你的manager節(jié)點(diǎn)有個(gè)公開(kāi)IP并且其端口8080開(kāi)放,你就可以用鏈接[http://manager.swarm.baqend.com:8080](http://t.umblr.com/redirect?z=http://manager.swarm.baqend.com:8080&t=YWFkOTgxYWRjYzIwYTllYTJkNjA0NTcxYjU4MWZmMWY4NzExMGNmMSxoVEVjU3FkZA==)通過(guò)瀏覽器來(lái)訪問(wèn)Storm集群。但是目前還沒(méi)有運(yùn)行任何supervisor節(jié)點(diǎn)。 4.運(yùn)行以下語(yǔ)句三次,來(lái)啟動(dòng)三個(gè)supervisor: 《divclass=“se-preview-section-delimiter”》《/div》
docker run \ -d \ --label cluster=storm \ --label role=supervisor \ -e affinity:role!=supervisor \ -e STORM_ZOOKEEPER_SERVERS=zk1.cloud,zk2.cloud,zk3.cloud \ --net stormnet \ --restart=always \ baqend/storm supervisor \ -c nimbus.host=nimbus \ -c supervisor.slots.ports=[6700,6701,6702,6703]
因?yàn)槲覀儫o(wú)所謂具體啟動(dòng)哪里的supervisor節(jié)點(diǎn),這里我們不用加入任何限制條件或容器名。但是,為了防止同一臺(tái)機(jī)器上的有兩個(gè)supervisor被啟動(dòng),我們用了一個(gè)**affinity標(biāo)記**:affinity:role!=supervisor。如果你要用更多的supervior容器,就得添加更多的Swarm worker節(jié)點(diǎn)(Ubuntu 4、Ubuntu 5等等)。 5.看一眼Storm UI,確保有三個(gè)Supervisor在運(yùn)行。 《divclass=“se-preview-section-delimiter”》《/div》 ##(遠(yuǎn)程)拓?fù)洳渴鹂梢酝ㄟ^(guò)與manager主機(jī)在同一網(wǎng)絡(luò)中的任意一臺(tái)裝有Docker守護(hù)進(jìn)程的服務(wù)器來(lái)部署拓?fù)渚W(wǎng)絡(luò)。在下面的代碼中,假設(shè)你目前使用的目錄中,拓?fù)鋐atjar是一個(gè)名為topology.jar的文件。 《divclass=“se-preview-section-delimiter”》《/div》
docker -H tcp://127.0.0.1:2375 run \ -it \ --rm \ -v $(readlink -m topology.jar):/topology.jar \ baqend/storm \ -c nimbus.host=manager.swarm \ jar /topology.jar \ main.class \ topologyArgument1 \ topologyArgument2
**注意:**這個(gè)命令會(huì)生出一個(gè)Docker容器,部署拓?fù)?,接著刪除容器。我們用-H tcp://127.0.0.1:2375參數(shù)來(lái)確保容器是在你當(dāng)前使用的機(jī)器上啟動(dòng)的。如果讓Docker Swarm自己來(lái)編排,部署就可能會(huì)失敗,因?yàn)樵谏扇萜鞯闹鳈C(jī)上可能找不到必要的拓?fù)湮募?另外,readlink -m topology.jar會(huì)為topology.jar生成一個(gè)絕對(duì)路徑,因?yàn)椴⒉恢С窒鄬?duì)路徑。但是你也可以直接提供一個(gè)絕對(duì)路徑。 《divclass=“se-preview-section-delimiter”》《/div》 ##Killing A Topology《divclass=“se-preview-section-delimiter”》《/div》 ##終止一個(gè)拓?fù)淇梢酝ㄟ^(guò)與Storm web UI交互從而終止一個(gè)拓?fù)?,或者也可以通過(guò)下面的方式,假設(shè)正在運(yùn)行的拓?fù)浣凶鰎unningTopology: 《divclass=“se-preview-section-delimiter”》《/div》
docker run \ -it \ --rm \ baqend/storm \ -c nimbus.host=manager.swarm \ kill runningTopology
此處并不需要主機(jī)參數(shù)-H 。..,因?yàn)樯鲜雒钍仟?dú)立的,并不依賴(lài)任何文件。 《div class=“se-preview-section-delimiter”》《/div》 ##關(guān)掉Storm集群由于每個(gè)與Storm相關(guān)的容器都有一個(gè)cluster=storm標(biāo)簽,你可以用下述語(yǔ)句終止所有的容器: 《div class=“se-preview-section-delimiter”》《/div》
docker rm -f $(docker ps -a --no-trunc --filter “l(fā)abel=cluster=storm” | awk ’{if(NR》1)print $1;}‘)
“`
不要忘記安全性!
我們?cè)诖私坛讨惺痉读巳绾卧贒ocker上用多節(jié)點(diǎn)的ZooKeeper集為了高可用性和容錯(cuò)性運(yùn)行一個(gè)分布式Storm集群。為了不讓這個(gè)教程過(guò)分復(fù)雜,我們跳過(guò)了針對(duì)TLS配置Docker Swarm的部分。如果你打算把Docker Swarm用于關(guān)鍵的業(yè)務(wù)應(yīng)用中,你必須在這個(gè)方面多下些功夫。
Baqend是怎樣使用Apache Storm的?
我們利用Storm的能力來(lái)提供低延遲的流查詢(xún)和查詢(xún)緩存:
連續(xù)查詢(xún)
如果你的APP允許連續(xù)查詢(xún),Apache Storm能接受你的連續(xù)查詢(xún)和所有你的寫(xiě)入操作,并且將它們相比對(duì):每當(dāng)寫(xiě)一個(gè)對(duì)象時(shí),所有注冊(cè)的連續(xù)查詢(xún)都與之比對(duì)。既然Storm一直在跟蹤所有查詢(xún)的結(jié)果,它就能發(fā)現(xiàn)新的主機(jī)或者新的匹配或不匹配的情況,并且在變更剛發(fā)生的時(shí)候通知你。
查詢(xún)緩存
對(duì)于查詢(xún)緩存來(lái)說(shuō),我們用這些通知來(lái)主動(dòng)讓緩存失效:Baqend Cloud用一段合理長(zhǎng)度的TTL來(lái)緩存一個(gè)查詢(xún)結(jié)果,一旦發(fā)生變更就自動(dòng)讓緩存的查詢(xún)結(jié)果無(wú)效。得益于Storm,我們的匹配網(wǎng)絡(luò)延遲僅為幾毫秒,相較以往,數(shù)據(jù)的獲取速度顯著提高。
Baqend Cloud將很快發(fā)布這兩大功能,近期,我們也會(huì)在Baqend Tech博客發(fā)表更多有關(guān)架構(gòu)的細(xì)則和標(biāo)桿性測(cè)試結(jié)果。敬請(qǐng)期待!
結(jié)束語(yǔ)
本教程是為1.10.3版本的Docker和1.1.3的Swarm所做,并在OpenStack和AWS上測(cè)試。本教程及我們的Storm和ZooKeeper Docker鏡像文件都在Chicken Dance License v0.2的保護(hù)下有效。
tutorial at GitHub baqend/storm Docker image at Docker Hub and GitHubbaqend/zookeeper Docker image at Docker Hub and GitHub
在Github獲取教程
在Docker Hub和GitHub獲取baqend/storm Docker鏡像文件在Docker Hub和GitHub獲取baqend/zookeeper Docker鏡像文件
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%