【编者按】本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群。文章系国内 ITOM 管理平台 OneAPM 编译呈现。

点此查看《在Docker Swarm上部署Apache Storm:第1部分》

创建Swarm集群

如果一切顺利,那么你现在已经有了三台Ubuntu服务器,每个上面都运行了一个Docker守护进程。可以通过私有网络中的zk1.cloud和manager.swarm访问Ubuntu 1,或者也可以从外部通过manager.swarm.baqend.com(至少在8080端口)访问。我们一直在这台机器上折腾,并且,从现在开始,这是我们唯一需要访问的机器。为了保证Swarm节点之间的协调通畅,我们需要配置ZooKeeper ensemble和Swarm管理器。

1.通过SSH连接Ubuntu1,接着快速检查一遍。如果Docker安装正确,运行下列代码可以显示出一个所有运行中的Docker容器的列表(只有针对Swarm的):

docker ps

2.现在我们可以按下面的方法在每台机器上启动一个ZooKeeper节点:

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……参数,我们可以在不同的主机上启动ZooKeeper容器。-p命令打开ZooKeeper默认需要的那些端口。两个-v命令通过将ZooKeeper使用的文件夹映射到对应的主机文件夹,可以在发生容器错误的情况仍然保持连贯性。以逗号分隔的主机名列表通知ZooKeeper这一集合中有哪些服务器。集合中的每个节点都不例外。唯一的变量就是ZooKeeper的ID(第二个参数),因为它对每个容器都是不一样的。

你可以使用以下命令行来检查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

如果你的集群一切正常,每个节点都会汇报它们是主节点还是从节点。

3.现在,开启Swarm管理器:

docker run -d --restart=always \
--label role=manager \
-p 2376:2375 \
swarm manage zk://zk1.cloud,zk2.cloud,zk3.cloud

4.现在Swarm集群正在运行。但是我们必须把这一点告诉Docker客户端。最后你只须保证之后所有的Docker运行语句都指向Swarm管理器的容器(它会负责排程),并且不违反本地Docker守护进程。

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

上面这段会立即执行,并且保证下次我们登录机器的时候被再次执行。

健康度检查

现在一切都被启动运行了。键入docker info检查一下manager节点上的集群状态。你会看到3个运行中的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

最重要的是每个节点的Status: Healthy那一行。如果你发现出现了其它的状态,例如Status: Pending,或者有的节点没有显示出来,那么即使其它地方还没有报错,也应该用以下命令试着重启管理容器,

docker restart $(docker ps -a --no-trunc --filter "label=role=manager"

然后再检查一次(这个操作可能会引发一个错误信息;无视它)。

配置Storm集群

现在Swarm已经运行起来了,你将要创建一个覆盖网络来跨越所有的Swarm节点,为单独的Storm组建运转多个容器。尽管Supervisor节点(即Storm workers)散布于Swarm集群中的所有节点,Nimbus和UI会在manager节点上,每台服务器上一个。

1.先创建覆盖网络stormnet:

docker network create --driver overlay stormnet

然后通过Docker来检查stormnet是否存在:

docker network ls

2.现在一个一个地启动Storm组件。每个Storm相关的容器会有一个cluster=storm标记,这样你在后面杀死整个Storm集群时,不会错杀其它容器。

首先,启动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节点上运行,我们加入一个限制条件:constraint:server==manager。

3.你现在可以访问Storm UI了,就好像它是在manager节点上运行一样:假如你的manager节点有个公开IP并且其端口8080开放,你就可以用链接http://manager.swarm.baqend.com:8080通过浏览器来访问Storm集群。但是目前还没有运行任何supervisor节点。

4.运行以下语句三次,来启动三个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]

因为我们无所谓具体启动哪里的supervisor节点,这里我们不用加入任何限制条件或容器名。但是,为了防止同一台机器上的有两个supervisor被启动,我们用了一个affinity标记:affinity:role!=supervisor。如果你要用更多的supervior容器,就得添加更多的Swarm worker节点(Ubuntu 4、Ubuntu 5等等)。

5.看一眼Storm UI,确保有三个Supervisor在运行。

(远程)拓扑部署

可以通过与manager主机在同一网络中的任意一台装有Docker守护进程的服务器来部署拓扑网络。在下面的代码中,假设你目前使用的目录中,拓扑fatjar是一个名为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

注意:这个命令会生出一个Docker容器,部署拓扑,接着删除容器。我们用-H tcp://127.0.0.1:2375参数来确保容器是在你当前使用的机器上启动的。如果让Docker Swarm自己来编排,部署就可能会失败,因为在生成容器的主机上可能找不到必要的拓扑文件。

另外,readlink -m topology.jar会为topology.jar生成一个绝对路径,因为并不支持相对路径。但是你也可以直接提供一个绝对路径。

终止一个拓扑

可以通过与Storm web UI交互从而终止一个拓扑,或者也可以通过下面的方式,假设正在运行的拓扑叫做runningTopology:

docker run \
-it \
--rm \
baqend/storm \
-c nimbus.host=manager.swarm \
kill runningTopology

此处并不需要主机参数-H …,因为上述命令是独立的,并不依赖任何文件。

关掉Storm集群

由于每个与Storm相关的容器都有一个cluster=storm标签,你可以用下述语句终止所有的容器:

docker rm -f $(docker ps -a --no-trunc --filter "label=cluster=storm"

不要忘记安全性!

我们在此教程中示范了如何在Docker上用多节点的ZooKeeper集为了高可用性和容错性运行一个分布式Storm集群。为了不让这个教程过分复杂,我们跳过了针对TLS配置Docker Swarm的部分。如果你打算把Docker Swarm用于关键的业务应用中,你必须在这个方面多下些功夫。

Baqend是怎样使用Apache Storm的?

我们利用Storm的能力来提供低延迟的流查询和查询缓存:

连续查询

如果你的APP允许连续查询,Apache Storm能接受你的连续查询和所有你的写入操作,并且将它们相比对:每当写一个对象时,所有注册的连续查询都与之比对。既然Storm一直在跟踪所有查询的结果,它就能发现新的主机或者新的匹配或不匹配的情况,并且在变更刚发生的时候通知你。

查询缓存

对于查询缓存来说,我们用这些通知来主动让缓存失效:Baqend Cloud用一段合理长度的TTL来缓存一个查询结果,一旦发生变更就自动让缓存的查询结果无效。得益于Storm,我们的匹配网络延迟仅为几毫秒,相较以往,数据的获取速度显著提高。

Baqend Cloud将很快发布这两大功能,近期,我们也会在Baqend Tech博客发表更多有关架构的细则和标杆性测试结果。敬请期待!

结束语

本教程是为1.10.3版本的Docker和1.1.3的Swarm所做,并在OpenStack和AWS上测试。本教程及我们的Storm和ZooKeeper Docker镜像文件都在Chicken Dance License v0.2的保护下有效。

你可以在GitHub上复制我们的项目,如有任何改进,也欢迎发起pull请求!

OneAPM Cloud Insight 产品集监控、管理、计算、协作、可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效、简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

原文地址:http://highscalability.com/blog/2016/4/25/the-joy-of-deploying-apache-storm-on-docker-swarm.html

在Docker Swarm上部署Apache Storm:第2部分的更多相关文章

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

    [编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...

  2. Docker Swarm从部署到基本操作

    关于Docker Swarm Docker Swarm由两部分组成: Docker集群:将一个或多个Docker节点组织起来,用户就能以集群的方式进行管理: 应用编排:有一套API用来部署和管理容器: ...

  3. 用Docker swarm快速部署Nebula Graph集群

    用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...

  4. 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群,并部署客户端负载均衡和高可用

    本文作者系:视野金服工程师 | 吴海胜 首发于 Nebula Graph 论坛:https://discuss.nebula-graph.com.cn/t/topic/1388 一.前言 本文介绍如何 ...

  5. Docker swarm 实战-部署wordpress

    Docker swarm 实战-部署wordpress 创建一个overlay的网络 docker network create -d overlay demo 6imq8da3vcwvj2n499k ...

  6. 关于docker线上部署时间问题

    背景 公司线上部署采用docker swarm方式,这几天线上项目时间突然出了问题(ps:第一反应,我去,这也能出问题,代码里肯定藏毒了),线上时间总跟实际时间差八个小时.本着速战速决的原则,把所有时 ...

  7. 在Windows 10上部署Apache PredictionIO开发环境

    Windows在初研究人员的探索下,研究出了一套更为精简的环境配置,极大的缩短了开发时间与效率,在此总结以供后来者参阅. 1.部署环境的配置 Windows10 64 home IntelliJ ID ...

  8. docker swarm快速部署redis分布式集群

    环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...

  9. Docker容器里部署Apache+PHP+MariaDB+phpMyAdmin

    前面讲到了创建MariaDB,这次在前面的基础上搭建phpMyAdmin服务,以便友好的管理数据库MariaDB.MariaDB的docker独立出来,这样方便管理,易于扩展.这次我们基于Docker ...

随机推荐

  1. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(五):模块化切分

    切分工程 考虑到后续我们的模块会越来越多,依赖的公共代码和配置需要集中管理,我们在这里先把公共模块和配置从后台管理业务中剥离出来. 新增两个工程,切分后结构如下: kitty-boot:启动器及全局配 ...

  2. jQuery同步Ajax带来的UI线程阻塞问题及解决方法

    遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收不同参数,只负责 ...

  3. CNN初探

    CNN初探 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7450413.html 前言 这篇博客主要讲解卷积神经网络(CNN) ...

  4. selenium3 无人工干预地自动下载某个文件

    一:主要内容 下载效果展示 代码内容展示 saveToDisk不生效说明,即文件没有下载下来解决办法 二:展示效果 1.下载效果展示 用selenium3无人工干预的自动下载该文件到指定路径下,如:D ...

  5. 资深程序员的Metal入门教程总结

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由落影发表于云+社区专栏 正文 本文介绍Metal和Metal Shader Language,以及Metal和OpenGL ES的差异 ...

  6. 如何从GitHub迁移到GitLab?

    如何从GitHub迁移到GitLab? 在本文中,我们将解释如何从Github迁移到Gitlab,同时我们也将解释如何将Github的开源项目导入到Gitlab. 正如你可能非常清楚的那样, Gitl ...

  7. python的Web框架,Django模板标签及模板的继承

    模板标签 在传递数据的时候,会有大量的数据展示在浏览器上,而数据会是动态变化的,在html的编写中,数据也是需要动态的,而不能是写死的,如果动态展示呢. 给定的例子数据 views传递数据给html ...

  8. input输入框file类型第二次不触发onchange事件的解决办法,简单有效

    在网上看了很多办法,现在将网上大部分说法总结如下: 网上说法: 原因:选择一次后onchange事件没有绑定到input标签上:    解决办法:拷贝一份input标签的副本,每次选择后对原input ...

  9. 创建自己的共用js库

    直至昨晚为止,学习了一个多月的MVC与jQuery,从所做的练习中,发觉jQuery的代码也有跟C#语言一样可以重构,多页面有相同使用的方法函数,均可以放置于一个单独立的js文件或是自定义的js库中. ...

  10. C# winform 无边框 窗体的拖动

    当船体设置为FormborderStyle='none' [DllImport("user32.dll")] public static extern bool ReleaseCa ...