【編者按】本文來自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虛擬機上部署和調(diào)配Apache Storm集群。文章系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)。
如何在 Docker Swarm 上部署并調(diào)配Apache Storm集群,這個題目很有意思,Wolfram Wingerath將之描述為“真正有趣”的體驗,在Tech上你很少能聽見這種話。我好奇地問他是什么讓使用容器比使用虛擬機更棒?他回答說:
作為一名Docker和Docker Swarm的新手,我肯定還有很多不知道的事。不過,在我看來,在Docker上部署(及一般操作)比在虛擬機甚至裸機上更有趣,因為Docker剝離了異構(gòu)性和許多問題。一旦運行了Docker,你就可以用一行聲明語句來啟動MongoDB或者Redis的服務器等東西。Docker Swarm集群可以幫你做同樣的事,而且Docker還會幫你把啟動的東西分發(fā)給集群中的某個服務器。Docker甚至會幫你下載正確的鏡像,如果你本地沒有的話。你也不用解決連接問題,因為只要在同一Docker網(wǎng)絡(luò)中,任一臺機器都與所有其他的機器互聯(lián)互通。正如在本教程中所提到的,只要你使用了overlay網(wǎng)絡(luò),分布式安裝也能實現(xiàn)。
你在郵件中引用到了我的一些話,當我在寫它們的時候,我的腦海深處想起了幾個月前,我需要安裝和運行一個擁有超過16個節(jié)點的Apache Storm集群的事。當時有好幾個問題,比如,我對AWS并不太熟悉(以前是用OpenStack的),還有與(Storm使用的)Netty的連接性問題,以及AWS的主機名解析問題。這些問題在我設(shè)置OpenStack的時候從沒出現(xiàn)過。最終我們花費了數(shù)天及數(shù)百美元去解決它們。我真心認為,如果你使用Docker,你就不會遇到這些麻煩,因為你的環(huán)境始終如一:即Docker。
回到教程上來
Bagend Cloud即將支持查詢緩存和連續(xù)查詢的功能,我們將依靠Apache Storm來處理低延遲的數(shù)據(jù)。已經(jīng)有好幾個項目都致力于實現(xiàn)在Docker上部署多服務器Storm (例如wurstmeister/storm-docker或viki-org/storm-docker),但是越過服務器數(shù)量的限制似乎會使事情變得復雜。既然可擴展性和易操作性是我們部署的關(guān)鍵,我們從一開始就使用Dock Swarm,也很高興地看到事情進展的如此順利。我們希望通過這篇教程來分享我們的經(jīng)歷,提升你對即將發(fā)布的Baqend實時API的興趣,最終宣傳一下Dock Swarm(因為它真的很牛?。?-)
如果你是Swarm新手,請看我們的AWS Meetup Docker幻燈片!
接下來的計劃
概述
首先,我們將介紹一個簡單的部署范例,并解釋其中的每一部分。接著,我們會在重點預告中告訴你所需完成的最簡單的準備工作(使用事先準備好的實用腳本程序)。然后,我們會來到本教程的核心部分,一步步向你展示Docker Swarm集群及多節(jié)點Apache Storm集群的部署過程。當然,我們也會做一些與Storm(特別是部署和終止遠程服務器上的拓撲)以及Swarm(例如重啟manager節(jié)點和終止整個Storm集群)都涉及到的常規(guī)工作。
概述:部署
下圖是部署的架構(gòu)圖:

有三臺運行Ubuntu Server 14.04的機器,每臺都會運行一個Docker守護進程,同時每臺都裝有幾個容器。經(jīng)過初始設(shè)置,你只能訪問其中一臺機器(Ubuntu 1),很大程度上來說,會覺得只有一個Docker守護進程。
安裝Swarm之后,你會創(chuàng)建一個覆蓋網(wǎng)絡(luò)(stormnet),這樣不同Swarm節(jié)點間的Docker容器就可以相互通信了。最終,你將建立起一個成熟的Storm集群,這個集群使用現(xiàn)有的 ZooKeeper 共同協(xié)調(diào),并通過stormnet實現(xiàn)節(jié)點間的通信。雖然監(jiān)管容器將每一臺服務器策略分發(fā),Nimbus和UI容器則會安裝在manager節(jié)點上(Ubuntu 1)。
必須允許對Ubuntu 1機器的公共訪問(即分配一個公共IP和開放端口8080!)。否則,你就看不到Storm美麗的UI了。
詳細教程
我們給三個Ubuntu機器的域名分別是zk1.cloud、zk2.cloud和zk3.cloud。由于ZooKeeper服務器和manager節(jié)點從概念上說是兩個不同的角色,我們使用manager.swarm和manager.swarm.baqend.com作為manager節(jié)點的私有IP地址和公共IP地址。盡管本教程中,Ubuntu 1實際上是扮演了ZooKeeper 1和管理者兩個角色,但你可以在自己部署的時候使用不同兩個服務器來完成。在Github上check out這個教程,在readme.me中,根據(jù)你自己的域名,查找并替換我們的原有域名,然后你就可以把我們的大部分語句復制粘貼到我們將要使用的外殼程序中了。
重點預告
對于那些急著看結(jié)果的人來說,我們也準備了一些腳本!這些是部署Swarm和Storm所需的全部腳本了。但是,為了便于理解,后面還是會有一個詳細的步驟描述的。
所以,在討論細節(jié)之前,這有一份快速指南:
1.創(chuàng)建一個Ubuntu 14.04服務器 – 我們稱之為Ubuntu 1 – 然后通過SSH連接它。然后執(zhí)行以下語句check out指南中的腳本來安裝Docker:
sudo apt-get install git -y && \
cd /home/ubuntu/ && \
git clone https://github.com/Baqend/tutorial-swarm-storm.git && \
chmod +x tutorial-swarm-storm/scripts/* && \
cd tutorial-swarm-storm/scripts/ && \
sudo bash installDocker.sh && \
sudo usermod -aG docker ubuntu && \
sudo shutdown -h now
2.機器會自動關(guān)機。關(guān)機的時候,生成快照。
3.啟動兩臺你剛剛快照過的機器(Ubuntu 2和Ubuntu 3),使用一下自定義腳本把它們做成Swarm worker節(jié)點:
#!/bin/bash
cd /home/ubuntu/ && rm -rf tutorial-swarm-storm && \
git clone https://github.com/Baqend/tutorial-swarm-storm.git && \
cd tutorial-swarm-storm/scripts/ && \
chmod +x ./* && \
./init.sh zk1.cloud,zk2.cloud,zk3.cloud
注意:你需要把逗號分隔開的主機名替換成你自己的主機名。
4.對域名服務器做如下設(shè)置:把列表中的第一臺主機zk1.cloud指向Ubuntu1,剩下的zk2.cloud和zk3.cloud分別指向Ubuntu 2和Ubuntu 3。另外要確保manager.swarm.baqend.com和manager.swarm分別被解析為Ubuntu 1的公開IP地址和私有IP地址。
5.確保主機之間可以互相訪問:需要打開端口2181、2888、3888 (ZooKeeper)、2375 (Docker Swarm)和6627 (Storm,遠程拓撲部署)。為了保證能從外部訪問Storm UI,還必須公開manager.swarm.baqend.com:8080。
6.最后,啟動Ubuntu 1同時運行下列代碼,配置ZooKeeper ensemble、Swarm和Storm:
cd /home/ubuntu/tutorial-swarm-storm/scripts/ && \
ZOOKEEPER=zk1.cloud,zk2.cloud,zk3.cloud && \
sudo bash init.sh $ZOOKEEPER manager && \
. swarm.sh $ZOOKEEPER && \
. storm.sh $ZOOKEEPER 3
再次提醒:記得把其中的主機名替換為你自己的。
你現(xiàn)在應該可以訪問http://manager.swarm.baqend.com:8080下的Storm UI了。
另外,當你在manager節(jié)點上輸入docker info 時,你將會看見UI和Nimbus容器在同一臺機器上運行,而Swarm管理器和監(jiān)控容器則在不同的機器上運行。
再做一次:準備一個鏡像
好,現(xiàn)在讓我們來看一遍詳細的步驟。為了避免重復的步驟,我們只在一臺機器上進行這些準備工作,然后關(guān)機并快照。接著我們通過這個快照創(chuàng)建其它機器。
讓我們開始吧:
1.創(chuàng)建Ubuntu 1,作為Ubuntu 14.04服務器,然后通過SSH連接它,執(zhí)行下列語句安裝Docker:
sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates && sudo apt-key adv --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-get update && sudo apt-get purge lxc-docker && sudo apt-cache policy docker-engine \
&& sudo apt-get update -y && sudo apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine git make \
&& sudo usermod -aG docker $(whoami)
(關(guān)于Docker安裝的細則可以看這里)
由于Docker是通過一個key文件去識別不同的docker守護進程的,因此在快照之前,我們要停止docker守護進程,刪掉這個key文件(重啟Docker后會生成一個新的Key文件),關(guān)機之前記得快照。
sudo service docker stop \
&& sudo rm /etc/docker/key.json
注意:如果你不在快照之前刪掉這個Key文件,則所有根據(jù)這個鏡像生成的機器都會擁有同樣的識別符,最終你的Swarm集群一片狼藉。
3.最后,我們只 需要用同一個方法準備一個機器,這個機器在下次boot的時候會成為Swarm worker。為此,我們用文本編輯器,例如nano,創(chuàng)建一個文件 /etc/init.sh。
sudo nano /etc/init.sh
接著,我們復制下列代碼,并保存:
#!/bin/bash
# first script argument: the servers in the ZooKeeper ensemble:
ZOOKEEPER_SERVERS=$1
# second script 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" ]];then LABELS="--label server=manager";else LABELS="";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\"" \
| sudo tee /etc/default/docker
# restart the service to apply new options:
sudo service docker restart
echo "let's wait a little..."
sleep 30
# make this machine join the Docker Swarm cluster:
docker run -d --restart=always swarm join --advertise=$PRIVATE_IP:2375 zk://$ZOOKEEPER_SERVERS
4.現(xiàn)在,我們要關(guān)機了。
sudo shutdown -h now
接著快照一下。
5.現(xiàn)在,通過快照的鏡像,啟動另外兩臺機器(Ubuntu 2和Ubuntu 3)。使用下面的語句作為初始/自定義腳本:
#!/bin/bash
/bin/bash /etc/init.sh \
zk1.cloud,zk2.cloud,zk3.cloud
注意:如果你使用的是OpenStack,上述腳本可以加為自定義腳本。但如果是AWS,則應加為用戶數(shù)據(jù)。
6.重啟已經(jīng)快照過的機器(Ubuntu 1),連接機器,接著執(zhí)行以下代碼:
/bin/bash /etc/init.sh \
zk1.cloud,zk2.cloud,zk3.cloud \
manager
這會在機器上建立一個Swarm worker,并標之為Swarm管理器。
7.對域名服務器做如下設(shè)置:將列表中的第一個域名(zk1…)指向Ubuntu1上的管理器,剩下的兩個域名(zk2…和zk3…)指向另外兩臺剛剛啟動的機器,即Ubuntu 2和Ubuntu 3。另外要確保manager.swarm.baqend.com和manager.swarm分別被解析為Ubuntu的公開IP地址和私有IP地址。
8.最后,完成安全設(shè)置,使端口2181、2888、3888 (ZooKeeper)、2375 (Docker Swarm)和6627 (Storm, 遠程拓撲部署)上的機器可以互相訪問。如果你希望可以實現(xiàn)從外部訪問Storm UI,那么還需要公開manager.swarm.baqend.com:8080。
見證奇跡的時刻到了!
在本文的第二部分,會手把手地介紹如何創(chuàng)建 Swarm 集群,敬請關(guān)注。
OneAPM Cloud Insight 產(chǎn)品集監(jiān)控、管理、計算、協(xié)作、可視化于一身,幫助所有 IT 公司,減少在系統(tǒng)監(jiān)控上的人力和時間成本投入,讓運維工作更加高效、簡單。想閱讀更多技術(shù)文章,請訪問 OneAPM 官方技術(shù)博客。