写点什么

Docker Swarm 与 Apache Mesos 的区别

  • 2015-12-27
  • 本文字数:4026 字

    阅读完需:约 13 分钟

Docker Swarm 是目前 Docker 社区原生支持的集群工具,它通过扩展 Docker API 力图让用户像使用单机 Docker API 一样来驱动整个集群;而 Mesos 是 Apache 基金会下的集群资源管理工具,它通过抽象主机的 CPU、内存、存储等计算资源来搭建一套高效、容错、弹性的分布式系统。

显然,这两者功能上有交集,网络上也有很多关于 Docker Swarm, Mesos 和 Kubernetes 之间区别的讨论,作为一个 Mesos 重度用户,最近也抽时间把玩了下 Docker Swarm。一路下来,Docker Swarm 给我的感觉首先是它特别简单、灵活,相较于 Mesos 而言, Docker Swarm 对集群的侵入性更小,从而资源损耗也更低;其次,我特别想强调的是目前看来,虽然它与 Mesos 之间功能有重叠,但是两者关注在不同的东西上了,所以拿这两者作比较没有多大意义。当然,未来这种情况可能会发生变化,这取决于社区的 roadmap 。下面我会从多个角度把 Docker Swarm 和 Mesos 进行比较。

配置

在安装配置方面,Docker Swarm 要比 Mesos 简单的多。使用 Docker Swarm 搭建一套集群,最简单的情况下只需要 3 步:

  1. 通过 shell 命令 swarm create 生成一个集群的 token;
  2. 借助这个 token 将想要添加到集群的主机广播到 Docker Hub 集群发现 的公共服务(Hosted Discovery with Docker Hub)上,这样我们就把主机添加集群中了;
  3. 接下来通过命令 swarm manage 以及相应的 token 我们就可以在任何一台连接到互联网的主机上管理我们的集群了。

进一步,为了安全和性能起见,如果我们想脱离 Docker Hub 集群发现 的公共服务,我们只需要在第 1 步使用 staticfile、consul、etcd 或者 ZooKeeper 中的任意一个,甚至是静态的 IP 列表来做集群发现即可。

与 Docker Swarm 不同,我们必须保证 Mesos 的管理节点(master,相当于上述第 3 步中的 manager 机器)一直正常运行,然后才能向集群中添加 agent/slave 节点;另外向集群中添加节点时还需要配置 resource,containers 等基本参数;最后只搭建好了 Mesos 集群是无法方便的使用集群资源的,我们需要 Marathon、Chronos、Spark 等调度器去调度资源,才能真正使用起这套东西。显然 Mesos 的配置要比 Docker Swarm 复杂的多,当然这主要也是由 Mesos 需要支撑多种资源调度导致的。

易用性

由于 Docker Swarm 对外提供完全标准的 Docker API,只需要理解 docker 命令,用户就可以开始使用 Swarm 集群了; 而对于 Mesos 来说, 我们需要额外了解 Marathon 等调度器的 API 才能真正将 Docker 任务发布到集群上。当然 Marathon 调度器也为我们带来了好处,譬如 docker 容器的健康检查,失败重启机制等。

架构

我们首先参考博客 《 Weave Discovery and Docker Swarm 》里的架构图来分析下 Docker Swarm 的架构。

图中 vm1 和 vm2 代表集群中的计算节点,集群的每个节点上都运行着一个 swarm-agent 的 Docker 容器,这个 swarm-agent 负责向 集群发现的后台(backend)广播节点的 IP,其中 backend 我们在上面的配置部分已经提过,它可以是 Docker Hub 集群发现的公共服务或者是 etcd, consul、ZooKeeper 等一致性中间件;

vmmaster 代表集群中的管理节点,它上面运行着 swarm-manager 的容器,其中 vmmaster 是能够访问 backend 的任意机器, 譬如笔记本等;swarm-manager 通过监听 backend 来获取集群信息, 然后访问 vm1,vm2 的 docker daemon 程序的 REST API 接口部署容器等。

同时,我们借用 http://www.ericsson.com/research-blog/data-knowledge/mesos-meetup-hosted-ericsson-research/ 中的 Mesos 架构图解释下 Mesos 的架构,图中的 Mesos Slave 代表集群中的计算节点,对应于上图的 vm1/vm2;Mesos Master 与 MarathonScheduler 合起来一起对应于上图中 vmmaster;Mesos Master 是主动向其调度器 offer 资源的, 然后由调度器决定是否接受这些资源。

至此,我们已经可以发现两者的不同,Mesos 是支持多种调度器的,Docker 容器型的任务,Hadoop、Spark 的计算任务等都可以运行在 Mesos 框架上,Mesos 强调的是资源混用的能力;而 Docker Swarm 只专注于 Docker 容器型任务。从而,依据不同的调度器,Mesos 的执行器(executor)是可配置的;而 Docker Swarm 只需要 Docker Daemon 一种执行器。

集群高可用/容错

Docker Swarm 与 Mesos 都可以通过一致性中间件构造高可用集群。Mesos 的 Master 节点一般通过 ZooKeeper 保证高可用,而 Docker Swarm 的 manager 节点可以通过 consul、etcd 或 ZooKeeper 中的任意一个来保证高可用。 但是从目前 Docker Swarm 的架构来看,Swarm manager 节点的高可用不是必需的,因为即使 manager 节点宕机了,Swarm 的原有服务也不会受到影响。我还有一种更极端的想法, Swarm 集群平时不需要 manager 节点,只有在需要 metrics 信息,发布新的应用,或者健康检查时再启动 manager 服务即可,这是因为 manager 节点目前的功能非常单一,像容器的健康检查,失败重启等功能还没有实现,文档中提到的资源管理,以及服务中断等机制也都没有详细的介绍,我估计应该还在开发中。

基本的健康检查

截止我写这篇文章时,Docker Swarm 没有提供对其部署的容器进行健康检查的功能,所以需要容器部署方来进行相应的容器的健康检查以及异常重启等;而 Mesos 的调度器 Marathon 是支持健康检查的,它可以每隔一段时间扫描一次应用的绑定端口,并在容忍 3 次或者几次失败后将应用重启,目前支持 HTTP、TCP 协议,当然,这都需要应用提供 health 的接口。

可扩展性 / 可插拔

由于 Docker Swarm 使用标准的 Docker API,从而任何使用 Docker API 与 Docker 进行通讯的工具都可以无缝地和 Docker Swarm 协同工作,譬如与 docker-compose 结合实现多主机 scale 容器,这个与 Kubernetes 的 Pod 非常类似;与 Shipyard 集成等。但这对 Docker Swarm 来说也是一个缺点:你只能做 Docker API 规定的事情。如果 Docker API 不支持某个你要的功能,你就不能直接使用 Docker Swarm 来实现,你可能需要使用一些特别的技巧来实现(也可能完全不能实现)。

Mesos 的可扩展性首先在于它可以承接各种调度器,Spark、Hadoop、Kafka、Cassandra、Marathon、Chronos 等等都可以拿 Mesos 来做资源池;其次,Mesos 可以与 Mesos-DNS 结合来实现内部的服务发现 / 负载均衡。

另外,Docker Swarm 也可以与 Mesos 结合,在 Docker Swarm 的 repo 里面有一个 docker-swarm-on-mesos 子模块 https://github.com/docker/swarm/tree/master/cluster/mesos 。Docker Swarm 可以借助它成为 Mesos 的调度器,使用 Mesos 资源池里面的资源。但是目前我个人还没有发现这种结合的价值,唯一能够想到的一点就是可以借此绕过 Mesos 来直接调度 docker 容器同时集群仍然支持资源混用,毕竟我们通过 Mesos 来直接操纵单个容器没有那么方便。

弹性

Mesos 与 Docker Swarm 都支持的向集群添加新的节点。

调度

Docker Swarm 对容器的调度已经相当丰富:

  • 通过参数 constraint 将容器发布到带有指定 label 的机器上。譬如将 MySQL 发布到 storage==ssd 的机器上来保证数据库的 IO 性能;
  • 通过参数 affinity 将容器发布到已经运行着某容器的机器上,或者已经 pull 了某镜像的机器上;
  • 通过参数 volumes-from, link, net 等将容器自动发布到其依赖的容器所在的机器上;
  • 通过参数 strategy 可以指定 spread,binpack 和 random 3 种不同 ranking node 策略,其中 spread 策略会将容器尽量分散的调度到多个机器上来降低机器宕机带来的损失,反之 binpack 策略会将容器尽量归集到少数机器上来避免资源碎片化,random 策略将会随机部署容器。

由于 Mesos 更加 generic,其在容器调度方面稍显欠缺,目前我们可以通过设置主机 attribute 来将容器调度到指定的机器上。

选择

当你尝试在 Docker Swarm 和 Mesos 之间做选择的时候,可以考虑以下几点。

  • 你要部署的集群只是运行 Docker 容器么?如果是,你可以考虑 Docker Swarm,否则如果你的集群资源需要混用,你最好尝试 Mesos。
  • 你要部署的集群是大型生产环境么?如果是,建议优先考虑 Mesos, 毕竟 Docker Swarm 还在开发中,而 Mesos 已经被国内外很多公司应用于生产环境上了;如果你只是想尝试 Docker 相关的东西,请考虑 Docker Swarm。
  • 你或你的团队有足够丰富的 Linux 和分布式经验么?如果没有,建议考虑 Docker Swarm,毕竟 Docker Swarm 的配置使用都更简单,更易于 troubleshooting;而使用 Mesos 集群,你需要解决 docker 之外的很多问题,Mesos 将成为你额外的负担。

最后,想再强调一遍,Mesos 更多的是从经济学角度出发来提高整个集群的资源利用率,拿它跟 YARN、Google Borg 作比较更合适;而 Docker Swarm 专注于 Docker 的集群管理,拿它跟 Kubernetes 比较可能更合适。 当然,在容器集群管理复杂度的问题上,基于 Mesos 的商业产品 DCOS,如:国外的 Mesosphere,国内的数人云,都已经做的非常简单和易用了。

所以总的来说,如果您想搭建一套集群生产环境,从稳定性和可扩展性来看,建议选择 Mesos;如果是仅想运行 Docker 容器,从易用性角度来看,建议采用 Docker Swarm。

作者简介

周伟涛,现数人科技云平台负责人,曾就职于国际开源解决方案供应商 Red Hat, 红帽认证工程师, Mesos Contributor,高级 Python 开发工程师。 是国内较早一批接触使用 Docker、Mesos 等技术的开发者。

参考

  1. http://technologyconversations.com/2015/11/04/docker-clustering-tools-compared-kubernetes-vs-docker-swarm/
  2. http://stackoverflow.com/questions/27640633/docker-swarm-kubernetes-mesos-core-os-fleet
  3. https://github.com/docker/docker/pull/8859
  4. https://github.com/docker/docker/issues/8781

感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-27 17:198427

评论

发布
暂无评论
发现更多内容

夏季不塞网胶浆、夏季不堵网胶浆

C13713145387

夏季不塞网胶浆

不反粘水性台板胶Waterborne table glue

C13713145387

不反粘水性台板胶

Java面试:BIO,NIO,AIO 的区别,别再傻傻分不清楚

Java大蜗牛

Java 程序员 面试 编程语言 后端

万丈高楼平地起,爆肝21000字Java基础知识总结,收藏起来总有用得着的时候

北游学Java

Java 集合 线程池 IO流

负载均衡续:万亿流量场景下的负载均衡实践

Coder的技术之路

负载均衡 架构 高并发 负载均衡架构

【案例】新基建下星环科技城轨智能视频分析系统建设

星环科技

大四实习生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

学Java关注我

Java 编程 架构 面试 计算机

高并发系列:架构优化之从BAT实际案例看消息中间件的妙用

Coder的技术之路

高并发 高并发系统设计 消息队列 消息中间件

【LeetCode】解码异或后的数组Java题解

Albert

算法 LeetCode 5月日更

流媒体:依托于声网的连麦解决方案

小岛上的黑桃六

架构 音视频 架构师 流媒体 声网

从简历被拒到收割8个大厂offer,我用了3个月成功破茧成蝶

比伯

Java 编程 架构 面试 计算机

聊聊我的编程时如何入门的

C语言与CPP编程

c++ 编程 程序人生 C语言 数据结构与算法

高并发之存储篇:关注下索引原理和优化吧!躲得过实践,躲不过面试官!

Coder的技术之路

数据库 高并发 索引结构 索引优化

高并发系列:存储优化之也许可能是史上最详尽的分库分表文章之一

Coder的技术之路

高并发 分库分表 高并发系统设计

INNOVATE 2021 圆满落幕,一起盘点那些 AI 前沿实例!

亚马逊云科技 (Amazon Web Services)

回顾 Alex Smola 讲述的“自动化机器学习(AutoML)”,本文带你了解 AutoGluon!

亚马逊云科技 (Amazon Web Services)

云图说|云数据库MySQL内核小版本升级全攻略

华为云开发者联盟

MySQL 云数据库 内核 华为云数据库 小版本升级

GitHub开源的最全中文诗歌古典文集数据库

不脱发的程序猿

GitHub 开源 程序人生 中华古典文集数据库

Android中绘制圆角的三种方式

teoking

android

华云大咖说 | 安超DCM给数据中心“做主”

华云数据

架构实战营模块三作业

日照时间长

架构实战营

百分点大数据技术团队:政务数据安全管理实践

百分点大数据团队

专家解惑 | 关于华为云盘古大模型,你想问的都在这里~

华为云开发者联盟

计算机视觉 nlp 华为云 盘古大模型 预训练

弹力抗刮硅油布胶浆

C13713145387

弹力抗刮硅油布胶浆

水性硅胶防滑透明浆

C13713145387

水性硅胶防滑透明浆

用机器学习操控无人驾驶小车,竟然和训练狗狗的原理一样!?

亚马逊云科技 (Amazon Web Services)

LiteOS内核源码分析:静态内存Static Memory

华为云开发者联盟

内存管理 LiteOS 静态内存 Static Memory Membox

GitHub Actions:真正的 DevOps CI

大龄程序员老羊

架构 DevOps 持续集成 Github Actions NoOps

立体水性石头拉浆

C13713145387

一文抽丝剥茧带你掌握复杂Gremlin查询的调试方法

华为云开发者联盟

调试 图数据库 Gremlin 遍历源 图遍历

Flink on Zeppelin 系列之:Yarn Application 模式支持

Apache Flink

flink

Docker Swarm与Apache Mesos的区别_开源_周伟涛_InfoQ精选文章