
1 前言
2017年,我们开发了一套DCOS云平台管理,它是采用mesos+marathon开源容器应用编排框架作为底层组件。DCOS云平台产品并在XX金融公司上线使用,它搭建了以Docker容器为基础封装各类应用和运行环境,以Mesos、Marathon为核心实现容器资源的分布式调度与协调,并以Haproxy、Etcd实现服务注册和业务的引流。其中,Marathon作为DCOS云平台的核心组件,并结合MESOS的资源调度组件,实现DCOS云平台下任务的动态调度,保证应用服务长时间稳定运行。接下的主题是分享MESOS这一核心组件原理与实践。
2 Mesos简介
Mesos 最初由 UC Berkeley 的 AMP 实验室于 2009 年发起,遵循 Apache 协议,目前已经成立了 Mesosphere 公司进行运营。Mesos 可以将整个数据中心的资源(包括 CPU、内存、存储、网络等)进行抽象和调度,使得多个应用同时运行在集群中分享资源,并无需关心资源的物理分布情况。它能够在同样的集群机器上运行多种分布式系统类型,更加动态、有效率、低共享资源。提供失败侦测,任务发布,任务跟踪,任务监控,低层次资源管理和细粒度的资源共享,可以扩展伸缩到数千个节点。如果把数据中心中的集群资源看做一台服务器,那么 Mesos 要做的事情,其实就是今天操作系统内核的职责:抽象资源 + 调度任务。Mesos 项目是 Mesosphere 公司 Datacenter Operating System (DCOS) 产品的核心部件。
3 Mesos原理与架构

可以从上图看出,Mesos 采用了经典的主-从(master-slave)架构,其中主节点(管理节点)可以使用 zookeeper 来做 HA。Mesosmaster 服务将运行在主节点上,Mesos slave 服务则需要运行在各个计算任务节点上。负责完成具体任务的应用框架们,跟 Mesos master 进行交互,来申请资源。
Mesos实现了两级调度架构,它可以管理多种类型的应用程序。第一级调度是Master的守护进程,管理Mesos集群中所有节点上运行的Slave守护进程。集群由物理服务器或虚拟服务器组成,用于运行应用程序的任务,比如Hadoop和MPI作业。第二级调度由被称作Framework的“组件”组成。Framework包括调度器(Scheduler)和执行器(Executor)进程,其中每个节点上都会运行执行器。Mesos能和不同类型的Framework通信,每种Framework由相应的应用集群管理。上图中只展示了Hadoop和MPI两种类型,其它类型的应用程序也有相应的Framework。Mesos Master协调全部的Slave,并确定每个节点的可用资源,聚合计算跨节点的所有可用资源的报告,然后向注册到Master的Framework(作为Master的客户端)发出资源邀约。Framework可以根据应用程序的需求,选择接受或拒绝来自master的资源邀约。一旦接受邀约,Master即协调Framework和Slave,调度参与节点上任务,并在容器中执行,以使多种类型的任务,可以在同一个节点上同时运行。
4 Mesos特点
支持多种应用框架,包括 Marathon、Singularity、Aurora 等;
多级资源调度(针对内存与CPU);
通过Zookeeper提供容错机制;
轻松扩容到1万台节点服务器;
支持 Docker、LXC 等容器机制进行任务隔离;
提供了多个流行语言的 API接口,包括 Python、Go、Java、C++ 等;
自带了简洁易用的 WebUI,方便用户直接进行操作;
横跨虚拟机、裸机多种方式部署。
5 Mesos适用场景
大数据技术平台
容器应用编排管理平台
CI/CD测试平台
运维管理平台
6 Mesos日志与监控
1、MESOS日志排查
Mesos组件对于DCOS云平台来说是一个非常重要的核心组件。虽然Mesos组件故障时不会影响业务容器,但是会影响到DCOS平台去做资源调度与容器应用发布,甚至影响到容器扩缩容问题。Mesos自身提供了强大的日志输出,默认日志文件路径:/var/log/mesos。
mesos.master日志:用于查看集群中主机资源的总汇聚情况;
mesos.slave日志:用于专注和Master有没有中断连接;
2、MESOS监控指标
指标 | 具体含义 |
mesos.cluster.cpus_percent | 分配的 CPU 的百分比 |
mesos.cluster.disk_percent | 分配的磁盘空间百分比 |
mesos.cluster.dropped_messages | 丢弃的消息数量 |
mesos.cluster.eventqueuedispatches | 事件队列里调度的数量 |
mesos.cluster.eventqueuehttp_requests | 事件队列里HTTP请求的数量 |
mesos.cluster.eventqueuemessages | 事件队列里消息传输的数量 |
mesos.cluster.frameworks_active | 活跃的应用框架数量 |
mesos.cluster.frameworks_connected | 已经连接的应用框架数量 |
mesos.cluster.frameworks_disconnected | 未连接的应用框架数量 |
mesos.cluster.frameworks_inactive | 非活动的应用框架数量 |
mesos.cluster.mem_percent | 分配的内存百分比 |
mesos.cluster.outstanding_offers | 未处理的资源邀约数量 |
mesos.cluster.slaves_active | 活动的slave节点数量 |
mesos.cluster.slaves_connected | 连接中的slave节点数量 |
mesos.cluster.slaves_disconnected | 未连接的slave节点数量 |
mesos.cluster.slaves_inactive | 非活动中的slave节点数量 |
mesos.cluster.tasks_error | 已经失效的任务数量 |
mesos.cluster.tasks_failed | 失败的任务数量 |
mesos.cluster.tasks_finished | 已经完成的任务数量 |
mesos.cluster.tasks_killed | 被杀死的任务数量 |
mesos.cluster.tasks_lost | 丢失的任务数量 |
mesos.cluster.tasks_running | 运行中的任务数量 |
mesos.cluster.tasks_staging | 待处理任务数量 |
mesos.cluster.tasks_starting | 开始的任务数量 |
mesos.cluster.total_frameworks | 总的应用框架数量 |
mesos.cluster.validstatusupdates | 无效的状态更新的数量 |
mesos.registrar.registrysizebytes | 注册表大小 |
mesos.registrar.statefetchms | 读注册信息的延迟,单位毫秒:ms |
mesos.registrar.statestorems | 写注册信息的延迟,单位毫秒:ms |
mesos.registrar.statestorems.count | 注册表写入次数 |
mesos.registrar.statestorems.max | 最大写注册信息的延迟,单位毫秒:ms |
mesos.registrar.statestorems.min | 最小写注册信息的延迟,单位毫秒:ms |
mesos.registrar.statestorems.p50 | 写注册信息延迟的中位数,单位毫秒:ms |
mesos.registrar.statestorems.p90 | 写注册信息90%起的延迟,单位毫秒:ms |
mesos.registrar.statestorems.p95 | 写注册信息95%起的延迟,单位毫秒:ms |
mesos.registrar.statestorems.p99 | 写注册信息99%起的延迟,单位毫秒:ms |
mesos.registrar.statestorems.p999 | 写注册信息99.9%起的延迟,单位毫秒:ms |
mesos.registrar.statestorems.p9999 | 写注册信息99.99%起的延迟,单位毫秒:ms |
mesos.slave.cpus_percent | 已分配的cpu比例 |
mesos.slave.disk_percent | 已分配的磁盘空间比例 |
mesos.slave.executors_registering | 注册中的执行器数 |
mesos.slave.executors_running | 运行中的执行器数 |
mesos.slave.executors_terminated | 已终止的执行器数 |
mesos.slave.executors_terminating | 正在终止的执行器数 |
mesos.slave.frameworks_active | 活动中的应用数 |
mesos.slave.mem_percent | 内存分配百分比 |
mesos.slave.recovery_errors | 恢复过程中的错误数 |
mesos.slave.tasks_failed | 失败的任务数量 |
mesos.slave.tasks_finished | 已经完成的任务数量 |
mesos.slave.tasks_killed | 被杀死的任务数量 |
mesos.slave.tasks_lost | 丢失的任务数量 |
mesos.slave.tasks_running | 运行中的任务数量 |
mesos.slave.tasks_staging | 等待运行的任务数量 |
mesos.slave.tasks_starting | 开始的任务数量 |
mesos.stats.elected | 是否被选为主节点 |
mesos.stats.system.load_15min | 15分钟内平均负载 |
mesos.stats.system.load_1min | 1分钟内平均负载 |
mesos.stats.system.load_5min | 5分钟内平均负载 |
mesos.stats.system.memfreebytes | 剩余内存 (bytes) |
mesos.stats.uptime_secs | 从节点运行时间 |
7 MESOS API接口
DCOS云平台是通过mesos api接口来调度和管理主机资源,目前DCOS平台调用到mesos api两个接口,用来获取计算节点资源和mesos组件健康状态。
1、获取计算节点资源
API接口:http://mesos-master-ip:5050/master/slaves

对应DCOS平台下面计算节点资源

2、Mesos组件健康状态
Mesos master组件状态
API接口:http://mesos-master-ip:5050/metrics/snapshot

Mesos Slave组件状态
API接口:http://mesos-slave-ip:5051/metrics/snapshot

对应DCOS平台下面的mesos主从节点健康状态

3、其它API接口
https://github.com/apache/mesos/blob/master/docs/api-client-libraries.md
8 MESOS优势在哪里,我们为什么选择它
根据对适合构建DCOS的各种技术架构的评估来看,选择以Mesos为基础的方案。其优势是它的成熟度高、两级调度框架、适合多种应用场景、混合部署、应用与平台耦合度低。
Mesos | Yarn | K8S | |
调度级别 | 二级调度(Dominant Resource Fairness) | 二级调度(FIFO,Capacity Scheduler,Fair Scheduler) | 二级调度(基于Predicates和Priorities两阶段算法) |
生态活跃 | 活跃 | 活跃 | 非常活跃 |
适用场景 | 通用性高,混合场景 | 大数据生态场景 | 目前较单一 |
成熟度 | 高 | 高 | 中 |
应用与平台耦合度 | 低 | 低 | 中 |
应用案例分析 | Twitter、Apple、Airbnb、Yelp、Netflix、ebay、Verizon | Hadoop生态圈应用 | 目前快速发展中,生产环境应用较少 |
9 总结
通过我们DCOS平台对mesos组件的使用总结如下几点:
1、Mesos组件提供支持自动弹性伸缩机制;
2、能够最大化提升服务器资源利用率;
3、它能够适用于企业大规模生产环境,实现百万并发量;
4、关于OpenAPI提供更加快速接入第三方服务无缝交互;
5、MESOS相比K8S软件成熟度高,并有更多的第三方成熟案例供参考使用;
6、由于去年k8s产品崛起,其功能得到加强与完善,大部企业开始拥抱k8s, mesos慢慢会被其过渡掉。




