在Docker Swarm上部署Apache Storm:第1部分

OneAPM官方技術部落格發表於2016-05-31

【編者按】本文來自 Baqend Tech Blog,描述瞭如何在 Docker Swarm,而不是在虛擬機器上部署和調配Apache Storm叢集。文章系國內 ITOM 管理平臺 OneAPM 編譯呈現。

如何在 Docker Swarm 上部署並調配Apache Storm叢集,這個題目很有意思,Wolfram Wingerath將之描述為“真正有趣”的體驗,在Tech上你很少能聽見這種話。我好奇地問他是什麼讓使用容器比使用虛擬機器更棒?他回答說:

作為一名Docker和Docker Swarm的新手,我肯定還有很多不知道的事。不過,在我看來,在Docker上部署(及一般操作)比在虛擬機器甚至裸機上更有趣,因為Docker剝離了異構性和許多問題。一旦執行了Docker,你就可以用一行宣告語句來啟動MongoDB或者Redis的伺服器等東西。Docker Swarm叢集可以幫你做同樣的事,而且Docker還會幫你把啟動的東西分發給叢集中的某個伺服器。Docker甚至會幫你下載正確的映象,如果你本地沒有的話。你也不用解決連線問題,因為只要在同一Docker網路中,任一臺機器都與所有其他的機器互聯互通。正如在本教程中所提到的,只要你使用了overlay網路,分散式安裝也能實現。

你在郵件中引用到了我的一些話,當我在寫它們的時候,我的腦海深處想起了幾個月前,我需要安裝和執行一個擁有超過16個節點的Apache Storm叢集的事。當時有好幾個問題,比如,我對AWS並不太熟悉(以前是用OpenStack的),還有與(Storm使用的)Netty的連線性問題,以及AWS的主機名解析問題。這些問題在我設定OpenStack的時候從沒出現過。最終我們花費了數天及數百美元去解決它們。我真心認為,如果你使用Docker,你就不會遇到這些麻煩,因為你的環境始終如一:即Docker。

回到教程上來

Bagend Cloud即將支援查詢快取和連續查詢的功能,我們將依靠Apache Storm來處理低延遲的資料。已經有好幾個專案都致力於實現在Docker上部署多伺服器Storm (例如wurstmeister/storm-docker或viki-org/storm-docker),但是越過伺服器數量的限制似乎會使事情變得複雜。既然可擴充套件性和易操作性是我們部署的關鍵,我們從一開始就使用Dock Swarm,也很高興地看到事情進展的如此順利。我們希望通過這篇教程來分享我們的經歷,提升你對即將釋出的Baqend實時API的興趣,最終宣傳一下Dock Swarm(因為它真的很牛!):-)

如果你是Swarm新手,請看我們的AWS Meetup Docker幻燈片

接下來的計劃

概述

首先,我們將介紹一個簡單的部署範例,並解釋其中的每一部分。接著,我們會在重點預告中告訴你所需完成的最簡單的準備工作(使用事先準備好的實用指令碼程式)。然後,我們會來到本教程的核心部分,一步步向你展示Docker Swarm叢集及多節點Apache Storm叢集的部署過程。當然,我們也會做一些與Storm(特別是部署和終止遠端伺服器上的拓撲)以及Swarm(例如重啟manager節點和終止整個Storm叢集)都涉及到的常規工作。

概述:部署

下圖是部署的架構圖:

在Docker Swarm上部署Apache Storm:第1部分

有三臺執行Ubuntu Server 14.04的機器,每臺都會執行一個Docker守護程式,同時每臺都裝有幾個容器。經過初始設定,你只能訪問其中一臺機器(Ubuntu 1),很大程度上來說,會覺得只有一個Docker守護程式。

安裝Swarm之後,你會建立一個覆蓋網路(stormnet),這樣不同Swarm節點間的Docker容器就可以相互通訊了。最終,你將建立起一個成熟的Storm叢集,這個叢集使用現有的 ZooKeeper 共同協調,並通過stormnet實現節點間的通訊。雖然監管容器將每一臺伺服器策略分發,Nimbus和UI容器則會安裝在manager節點上(Ubuntu 1)。

必須允許對Ubuntu 1機器的公共訪問(即分配一個公共IP和開放埠8080!)。否則,你就看不到Storm美麗的UI了。

詳細教程

我們給三個Ubuntu機器的域名分別是zk1.cloud、zk2.cloud和zk3.cloud。由於ZooKeeper伺服器和manager節點從概念上說是兩個不同的角色,我們使用manager.swarm和manager.swarm.baqend.com作為manager節點的私有IP地址和公共IP地址。儘管本教程中,Ubuntu 1實際上是扮演了ZooKeeper 1和管理者兩個角色,但你可以在自己部署的時候使用不同兩個伺服器來完成。在Github上check out這個教程,在readme.me中,根據你自己的域名,查詢並替換我們的原有域名,然後你就可以把我們的大部分語句複製貼上到我們將要使用的外殼程式中了。

重點預告

對於那些急著看結果的人來說,我們也準備了一些指令碼!這些是部署Swarm和Storm所需的全部指令碼了。但是,為了便於理解,後面還是會有一個詳細的步驟描述的。

所以,在討論細節之前,這有一份快速指南:

1.建立一個Ubuntu 14.04伺服器 – 我們稱之為Ubuntu 1 – 然後通過SSH連線它。然後執行以下語句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.機器會自動關機。關機的時候,生成快照。

3.啟動兩臺你剛剛快照過的機器(Ubuntu 2和Ubuntu 3),使用一下自定義指令碼把它們做成Swarm worker節點:

#!/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.對域名伺服器做如下設定:把列表中的第一臺主機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

再次提醒:記得把其中的主機名替換為你自己的。

你現在應該可以訪問http://manager.swarm.baqend.com:8080下的Storm UI了。

另外,當你在manager節點上輸入docker info 時,你將會看見UI和Nimbus容器在同一臺機器上執行,而Swarm管理器和監控容器則在不同的機器上執行。

再做一次:準備一個映象

好,現在讓我們來看一遍詳細的步驟。為了避免重複的步驟,我們只在一臺機器上進行這些準備工作,然後關機並快照。接著我們通過這個快照建立其它機器。

讓我們開始吧:

1.建立Ubuntu 1,作為Ubuntu 14.04伺服器,然後通過SSH連線它,執行下列語句安裝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)

(關於Docker安裝的細則可以看這裡

由於Docker是通過一個key檔案去識別不同的docker守護程式的,因此在快照之前,我們要停止docker守護程式,刪掉這個key檔案(重啟Docker後會生成一個新的Key檔案),關機之前記得快照。

sudo service docker stop \
&& sudo rm /etc/docker/key.json

注意:如果你不在快照之前刪掉這個Key檔案,則所有根據這個映象生成的機器都會擁有同樣的識別符,最終你的Swarm叢集一片狼藉。

3.最後,我們只 需要用同一個方法準備一個機器,這個機器在下次boot的時候會成為Swarm worker。為此,我們用文字編輯器,例如nano,建立一個檔案 /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.現在,我們要關機了。

sudo shutdown -h now

接著快照一下。

5.現在,通過快照的映象,啟動另外兩臺機器(Ubuntu 2和Ubuntu 3)。使用下面的語句作為初始/自定義指令碼:

#!/bin/bash
/bin/bash /etc/init.sh \
    zk1.cloud,zk2.cloud,zk3.cloud

注意:如果你使用的是OpenStack,上述指令碼可以加為自定義指令碼。但如果是AWS,則應加為使用者資料。

6.重啟已經快照過的機器(Ubuntu 1),連線機器,接著執行以下程式碼:

/bin/bash /etc/init.sh \
    zk1.cloud,zk2.cloud,zk3.cloud \
    manager

這會在機器上建立一個Swarm worker,並標之為Swarm管理器。

7.對域名伺服器做如下設定:將列表中的第一個域名(zk1…)指向Ubuntu1上的管理器,剩下的兩個域名(zk2…和zk3…)指向另外兩臺剛剛啟動的機器,即Ubuntu 2和Ubuntu 3。另外要確保manager.swarm.baqend.com和manager.swarm分別被解析為Ubuntu的公開IP地址和私有IP地址。

8.最後,完成安全設定,使埠2181、2888、3888 (ZooKeeper)、2375 (Docker Swarm)和6627 (Storm, 遠端拓撲部署)上的機器可以互相訪問。如果你希望可以實現從外部訪問Storm UI,那麼還需要公開manager.swarm.baqend.com:8080。

見證奇蹟的時刻到了!

在本文的第二部分,會手把手地介紹如何建立 Swarm 叢集,敬請關注。

OneAPM Cloud Insight 產品集監控、管理、計算、協作、視覺化於一身,幫助所有 IT 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格

相關文章