AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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:198654

评论

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

同城订单同城送,爆单依旧得心应手!

CRMEB

深入理解完美哈希

C++后台开发

hash 后端开发 C++后台开发 哈希函数 C++开发

还在用Unity开发游戏?那你就out了,试试用Unity做一个答题系统吧

恬静的小魔龙

Unity

还在被电影中吧爆炸的画面震撼?那你一定不要错过这款Unity的爆炸插件

恬静的小魔龙

Unity

易观分析《2022年中国数据安全市场数据监测报告》正式启动

易观分析

技术

还在用 ListView?使用 AnimatedList 让列表元素动起来

岛上码农

flutter ios 安卓开发 跨平台开发 7月月更

IP地址分类及范围

郑州埃文科技

IP地址 IP地址分类 IP地址范围

用Unity做仿真,这款图表插件我不允许你不知道

恬静的小魔龙

Unity

Spirng之Annotation注解与AOP使用

echoes

你离「TDengine 开发者大会」只差一条 SQL 语句!

TDengine

tdengine 开源 时序数据库

Tapdata 与优炫数据库完成产品兼容性互认证

tapdata

数据库 Tapdata 实时数据 交互式 优炫数据库

wallys/new product/DR7915/MT7915+MT7975/WiFi6 MiniPCIe Module 2T2R

wallys-wifi6

这次和GrowingIO工程师一起搞事情 | StartDT Hackathon

奇点云

void 0 有什么意义?undefined竟然是可变的?

南极一块修炼千年的大冰块

7月月更

运行时,物体移动旋转缩放插件,“RuntimeTransformGizmos插件”使用教程(Unity3D)

恬静的小魔龙

游戏开发 Unity 插件 虚拟仿真 游戏引擎

2022年中国第三方支付市场专题分析

易观分析

第三方支付

浅谈负载

Damon

7月月更

带你认识8个软件设计中的谬误

华为云开发者联盟

后端 分层架构 开发

26岁从计算机视觉界“黄埔军校”博士毕业,他想为车打造一双慧眼

华为云开发者联盟

人工智能 计算机视觉 天才少年 激光感知

个人实战经验:数据建模 “账户数据是属于维度还是账户域 ”

松子(李博源)

数据仓库 数据建模 数据中台场景实践

想要制作沙盒游戏?那么这一款插件你一定不能错过(Unity3D)

恬静的小魔龙

Unity

膜拜~ 终于拿到了美团老大哥分享的 Netty 源码剖析与应用 PDF

程序知音

Java 程序员 架构 Netty 后端技术

饿了么为啥给你推荐这个?本地生活搜索算法解密

阿里技术

算法 性能提升

开发动态 | StoneDB 2022年版本发布里程碑

StoneDB

云原生 #数据库 大数据 开源 #开源

移动研发平台EMAS 3.0全新升级,欢迎登陆阿里云官网搜索EMAS进行体验

移动研发平台EMAS

阿里云 emas 移动测试 移动研发 产品架构

hive数据导入:Python脚本

怀瑾握瑜的嘉与嘉

Python hive 7月月更

EMQ映云科技荣登《中国企业家》2022年度“新锐100”榜单

EMQ映云科技

开源 物联网 IoT emq 7月月更

tsconfig.json在配置文件中找不到任何输入,怎么办?

华为云开发者联盟

JavaScript 前端

同构+跨端,懂得小程序+kbone+小程序容器就够了!

Geek_99967b

小程序容器

2022年中国人工智能产业生态图谱

易观分析

人工智能

极客星球丨字节跳动一站式数据治理解决方案及平台架构

MobTech袤博科技

架构 运维 数据治理 全链路

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