【編者按】本文來自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虛擬機(jī)上部署和調(diào)配Apache Storm集群。文章系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。
點(diǎn)此查看《在Docker Swarm上部署Apache Storm:第1部分》
創(chuàng)建Swarm集群
如果一切順利,那么你現(xiàn)在已經(jīng)有了三臺(tái)Ubuntu服務(wù)器,每個(gè)上面都運(yùn)行了一個(gè)Docker守護(hù)進(jìn)程。可以通過私有網(wǎng)絡(luò)中的zk1.cloud和manager.swarm訪問Ubuntu 1,或者也可以從外部通過manager.swarm.baqend.com(至少在8080端口)訪問。我們一直在這臺(tái)機(jī)器上折騰,并且,從現(xiàn)在開始,這是我們唯一需要訪問的機(jī)器。為了保證Swarm節(jié)點(diǎn)之間的協(xié)調(diào)通暢,我們需要配置ZooKeeper ensemble和Swarm管理器。
1.通過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 -H tcp://zk1.cloud:2375 run -d --restart=always \
-p 2181:2181 \
-p 2888:2888 \
-p 3888: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 1
docker -H tcp://zk2.cloud:2375 run -d --restart=always \
-p 2181:2181 \
-p 2888:2888 \
-p 3888: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 2
docker -H tcp://zk3.cloud:2375 run -d --restart=always \
-p 2181:2181 \
-p 2888:2888 \
-p 3888: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
通過明確說明-H……參數(shù),我們可以在不同的主機(jī)上啟動(dòng)ZooKeeper容器。-p命令打開ZooKeeper默認(rèn)需要的那些端口。兩個(gè)-v命令通過將ZooKeeper使用的文件夾映射到對(duì)應(yīng)的主機(jī)文件夾,可以在發(fā)生容器錯(cuò)誤的情況仍然保持連貫性。以逗號(hào)分隔的主機(jī)名列表通知ZooKeeper這一集合中有哪些服務(wù)器。集合中的每個(gè)節(jié)點(diǎn)都不例外。唯一的變量就是ZooKeeper的ID(第二個(gè)參數(shù)),因?yàn)樗鼘?duì)每個(gè)容器都是不一樣的。
你可以使用以下命令行來檢查ZooKeeper是否一切正常:
docker -H tcp://zk1.cloud:2375 exec -it zk1 bin/zkServer.sh status && \
docker -H tcp://zk2.cloud:2375 exec -it zk2 bin/zkServer.sh status && \
docker -H tcp://zk3.cloud:2375 exec -it zk3 bin/zkServer.sh status
如果你的集群一切正常,每個(gè)節(jié)點(diǎn)都會(huì)匯報(bào)它們是主節(jié)點(diǎn)還是從節(jié)點(diǎn)。
3.現(xiàn)在,開啟Swarm管理器:
docker run -d --restart=always \
--label role=manager \
-p 2376:2375 \
swarm manage zk://zk1.cloud,zk2.cloud,zk3.cloud
4.現(xiàn)在Swarm集群正在運(yùn)行。但是我們必須把這一點(diǎn)告訴Docker客戶端。最后你只須保證之后所有的Docker運(yùn)行語句都指向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:2376
EOF
export DOCKER_HOST=tcp://127.0.0.1:2376
上面這段會(huì)立即執(zhí)行,并且保證下次我們登錄機(jī)器的時(shí)候被再次執(zhí)行。
健康度檢查
現(xiàn)在一切都被啟動(dòng)運(yùn)行了。鍵入docker info
檢查一下manager節(jié)點(diǎn)上的集群狀態(tài)。你會(huì)看到3個(gè)運(yùn)行中的worker,類似這樣:
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)沒有顯示出來,那么即使其它地方還沒有報(bào)錯(cuò),也應(yīng)該用以下命令試著重啟管理容器,
docker restart $(docker ps -a --no-trunc --filter "label=role=manager"
然后再檢查一次(這個(gè)操作可能會(huì)引發(fā)一個(gè)錯(cuò)誤信息;無視它)。
配置Storm集群
現(xiàn)在Swarm已經(jīng)運(yùn)行起來了,你將要?jiǎng)?chuàng)建一個(gè)覆蓋網(wǎng)絡(luò)來跨越所有的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:
docker network create --driver overlay stormnet
然后通過Docker來檢查stormnet是否存在:
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
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
接下來是Nimbus:
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)在可以訪問Storm UI了,就好像它是在manager節(jié)點(diǎn)上運(yùn)行一樣:假如你的manager節(jié)點(diǎn)有個(gè)公開IP并且其端口8080開放,你就可以用鏈接http://manager.swarm.baqend.com:8080通過瀏覽器來訪問Storm集群。但是目前還沒有運(yùn)行任何supervisor節(jié)點(diǎn)。
4.運(yùn)行以下語句三次,來啟動(dòng)三個(gè)supervisor:
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所謂具體啟動(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)行。
(遠(yuǎn)程)拓?fù)洳渴?/h2>
可以通過與manager主機(jī)在同一網(wǎng)絡(luò)中的任意一臺(tái)裝有Docker守護(hù)進(jìn)程的服務(wù)器來部署拓?fù)渚W(wǎng)絡(luò)。在下面的代碼中,假設(shè)你目前使用的目錄中,拓?fù)鋐atjar是一個(gè)名為topology.jar的文件。
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除容器。我們用-H tcp://127.0.0.1:2375參數(shù)來確保容器是在你當(dāng)前使用的機(jī)器上啟動(dòng)的。如果讓Docker Swarm自己來編排,部署就可能會(huì)失敗,因?yàn)樵谏扇萜鞯闹鳈C(jī)上可能找不到必要的拓?fù)湮募?/p>
另外,readlink -m topology.jar會(huì)為topology.jar生成一個(gè)絕對(duì)路徑,因?yàn)椴⒉恢С窒鄬?duì)路徑。但是你也可以直接提供一個(gè)絕對(duì)路徑。
終止一個(gè)拓?fù)?/h2>
可以通過與Storm web UI交互從而終止一個(gè)拓?fù)洌蛘咭部梢酝ㄟ^下面的方式,假設(shè)正在運(yùn)行的拓?fù)浣凶鰎unningTopology:
docker run \
-it \
--rm \
baqend/storm \
-c nimbus.host=manager.swarm \
kill runningTopology
此處并不需要主機(jī)參數(shù)-H …,因?yàn)樯鲜雒钍仟?dú)立的,并不依賴任何文件。
關(guān)掉Storm集群
由于每個(gè)與Storm相關(guān)的容器都有一個(gè)cluster=storm標(biāo)簽,你可以用下述語句終止所有的容器:
docker rm -f $(docker ps -a --no-trunc --filter "label=cluster=storm"
不要忘記安全性!
我們?cè)诖私坛讨惺痉读巳绾卧贒ocker上用多節(jié)點(diǎn)的ZooKeeper集為了高可用性和容錯(cuò)性運(yùn)行一個(gè)分布式Storm集群。為了不讓這個(gè)教程過分復(fù)雜,我們跳過了針對(duì)TLS配置Docker Swarm的部分。如果你打算把Docker Swarm用于關(guān)鍵的業(yè)務(wù)應(yīng)用中,你必須在這個(gè)方面多下些功夫。
Baqend是怎樣使用Apache Storm的?
我們利用Storm的能力來提供低延遲的流查詢和查詢緩存:
連續(xù)查詢
如果你的APP允許連續(xù)查詢,Apache Storm能接受你的連續(xù)查詢和所有你的寫入操作,并且將它們相比對(duì):每當(dāng)寫一個(gè)對(duì)象時(shí),所有注冊(cè)的連續(xù)查詢都與之比對(duì)。既然Storm一直在跟蹤所有查詢的結(jié)果,它就能發(fā)現(xiàn)新的主機(jī)或者新的匹配或不匹配的情況,并且在變更剛發(fā)生的時(shí)候通知你。
查詢緩存
對(duì)于查詢緩存來說,我們用這些通知來主動(dòng)讓緩存失效:Baqend Cloud用一段合理長度的TTL來緩存一個(gè)查詢結(jié)果,一旦發(fā)生變更就自動(dòng)讓緩存的查詢結(jié)果無效。得益于Storm,我們的匹配網(wǎng)絡(luò)延遲僅為幾毫秒,相較以往,數(shù)據(jù)的獲取速度顯著提高。
Baqend Cloud將很快發(fā)布這兩大功能,近期,我們也會(huì)在Baqend Tech博客發(fā)表更多有關(guān)架構(gòu)的細(xì)則和標(biāo)桿性測試結(jié)果。敬請(qǐng)期待!
結(jié)束語
本教程是為1.10.3版本的Docker和1.1.3的Swarm所做,并在OpenStack和AWS上測試。本教程及我們的Storm和ZooKeeper Docker鏡像文件都在Chicken Dance License v0.2的保護(hù)下有效。
- 在GitHub獲取教程
- 在Docker Hub和GitHub獲取baqend/storm Docker鏡像文件
- 在Docker Hub和GitHub獲取baqend/zookeeper Docker鏡像文件
你可以在GitHub上復(fù)制我們的項(xiàng)目,如有任何改進(jìn),也歡迎發(fā)起pull請(qǐng)求!
OneAPM Cloud Insight 產(chǎn)品集監(jiān)控、管理、計(jì)算、協(xié)作、可視化于一身,幫助所有 IT 公司,減少在系統(tǒng)監(jiān)控上的人力和時(shí)間成本投入,讓運(yùn)維工作更加高效、簡單。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客。
本文轉(zhuǎn)自 OneAPM 官方博客
原文地址:http://highscalability.com/blog/2016/4/25/the-joy-of-deploying-apache-storm-on-docker-swarm.html