4 服务编排 - Mesos
Mon, Nov 12, 2018
初见
Program against your datacenter, like it's a single pool of resources.
在你的数据中心上运行程序,就像运行在单个的资源池一样
- 数据中心:很多台服务器的集合
Apache Mesos abstrcts CPU, memory, storage, and other compute resources away from machines (physical or vitual), enabling fault-tolerant and elastic distributed systems to easily be built and run effectively.
Mesos会从机器(物理机、虚拟机)上抽取CPU、内存、硬盘等资源,构建一个方便部署、高效运转的可容错的分布式系统
- 只是通过软件管理的方式,把机器管理起来,进行合理的调度
- Twitter开发的,有20w台机器运行在Mesos上...
原理
调度框架
两级调度架构
第一级调度:Mesos master一行
由Mesos master调用Mesos Slave,每个Slave启动的时候都会注册到master,master协调全部Slave,以及确定Slave的资源
- 支持高可用集群,通过ZooKeeper完成主节点的选举
- 管理所有Mesos slave(又叫Agent)
- 运行在虚拟机或物理机上
- 运行着任务或服务,如Hadoop或MPI
第二级调度:由Framework组件组成(红色虚线部分)
Framework包括:调度器、执行器
- 调度器:上面的虚线部分
- 举例:Hadoop scheduler、MPI scheduler
- Mesos可以和多种类型的framework通讯,其他类型的应用也会有相应的framework
- 执行器:下面的虚线部分
- 运行在messos的slave中
- 由slave调度起来
Framework被注册到Messos,以使用Messos集群中的资源
调度流程
注:Agent === Slave
执行步骤
第一步:Slave 1 向master汇报它的空闲资源(4个cpu,4g内存)
第二步:
- 由master触发分配策略模块,得到的反馈:framework 1请求全部可用资源
- master向framework发送资源邀约,描述了slave 1上的所有可用资源(4个cpu,4g内存)
第三步:framework的调度器,和master说:需要在slave上运行两个任务(共占用3个cpu,3g内存)
第四步:master向slave下发任务,分配资源给framework的执行器。之后由执行器启动这两个任务(Executor和Task)
说明
此时,还有1g内存和1个cpu没用,可以分配给其他任务来运行
总结
- framework的调度器:用来和mesos master谈判资源的:「我需要多少资源,你的资源够不够,给我哪个资源用」
- 然后把执行器发给slave,在slave上执行
- 执行器:可以理解为一段代码,可以和slave对接的代码
隔离模块
目的:实现同一个slave上运行多个任务
机制:进程隔离机制(如使用Docker本身的隔离机制)
资源邀约和分配
策略
资源邀约:
1 由master向注册在上面的framework发送资源邀约,包含:
- slave上的可用cpu、内存
- 资源列表
2 由master提供资源给其framework,分配策略对所有的framework通用
3 如果资源情况不满足,framework可以拒绝资源邀约,master将邀约发送给其他framework
4 slave定期向master报告其可用资源
任务类型:
mesos上可以运行不同的资源类型,取决于你的framework。如:
- 马拉松Marathon,适合运行长期的服务,如web服务、缓存、数据库
- Co....,适合运行周期性的作业,如数据备份、数据导出
常用Framework
Marathon
Mesos + Marathon 对比 原始Linux内核
说明:
- Marathon + Mesos相当于系统内核
- Marthon相当于内核中的外壳管理程序,如systemd
- 区别:Mesos不只是一台机器的内核,它可以调度成千上万个机器的内核,实际上它是一个数据中心的内核
Mesos服务整合:mesos、Marathon、负载均衡、服务发现
流程一(黑线)服务如何运行:资源邀约&运行任务(调度器和执行器的工作过程)
- 报告资源
- Mesos向framework(马拉松)发送邀约
- framework发送任务和资源请求(在哪个slave上运行,需要多少个CPU和内存),把执行器发给master
- master向slave发送执行器
- slave调度执行器,启动任务
- 例一:tomcat web服务
- 例二:dubbo服务
流程二(蓝线)客户端如何访问:服务运行起来后,客户端获取响应的过程
- 客户端访问web服务,通过Marathon-lb(marathon提供的一个负载均衡和服务发现的实现,基于HAProxy,会订阅Marathon的一个事件,知道Marathon上运行的所有程序信息,与Marathon有通讯)
- HAProxy访问到具体的Slave,把执行的结果回传给Client
流程
解决服务编排问题
- 服务发现
- 服务部署
- 服务更新
- 服务扩容
服务发现、负载均衡
:所有服务的注册中心,决定某个任务具体运行在哪个Slave的哪个端口上,它对每个服务的具体信息都清楚
:可以理解为Nginx,其HAProxy和Nginx的功能相似。区别:Nginx的配置是手动配置的,HAProxy的配置是根据Marathon-loadbalance动态更新其配置的
以上,实现了服务发现和负责均衡功能
服务部署
流程:
- 做一个Docker镜像
- 在Marathon平台上,把服务建立起来,把镜像配置进去,指定一些信息(端口号)
- 点击「部署」,所有服务调度流程就运行起来了
哇...这么简单!
服务更新
流程:
- 找到原来的服务,修改镜像版本,保存
哇...下巴掉了...
服务扩缩容
流程:
- 修改一个字段,点击保存...
特征
Mesos
- 强大的资源管理:保证集群内的用户平等的使用资源
- Kernel和Framework分离:Mesos只负责资源的调度和管理,轻量、灵活,可以让各种程序,都使用Mesos的资源。很多厂商都支持,如果没有合适的Framework,可以自己开发。
- 门槛低,易使用:集群环境易搭建,长期运行的服务用Marason就好。(如果有特别的应用,需要自己实现Framework的话,门槛就高了)
- 大厂使用(Twitter、Apple、Uber、爱奇艺)
Marathon
- 高可用(支持集群)
- Constraints(限制、约束):举例 - 一些机器的CPU好,一些机器的网络好,可以给这些机器打标签,在资源邀约的时候,可以选择有指定标签的资源
- 服务发现&负责均衡:Marathon相当于一个注册中心,Marathon-lb借助于它实现了服务发现和负载均衡的功能
- 健康检查:Marathon的执行器里有「健康检查」的功能,三种方式:
- 基于HTTP:web服务一般会加这个健康检查,访问一个固定的页面,返回的code是200,认为服务是正常运行的;连续多次不是200,说明不健康,Marthon将其停止,再启动一个新的实例
- 基于TCP
- 基于Shell命令
- 事件订阅:自己写的应用可以向Marathon注册一个事件订阅,Marathon会把事件都推送给Endpoint,包括服务运行、停止、被杀掉等事件
- 完善的REST API、漂亮的UI,方便查看所有服务的状态
架构图