使用 Mesos 管理虚拟机

摘要

为了满足渲染、基因测序等计算密集型服务的需求,UCloud 推出了“计算工厂”产品,让用户可以快速创建大量的计算资源(虚拟机)。该产品的背后,是一套基于 Mesos 的计算资源管理系统。本文简要介绍该系统的结构、Mesos 在 UCloud 的使用以及我们遇到的问题。

 

 

业务需求

 

我们的需求主要是两方面:

 

  1. 同时支持虚拟机和容器。

    在“容器化”的浪潮下,为什么我们还需要支持虚拟机呢?首先,一些业务有严格的安全隔离要求,容器虽好,但还做不到和虚拟机同等级的隔离性。其次,一些业务程序不能运行在 Linux 上,比如图片、动画的渲染软件大都是 Windows 程序。

     

  2. 整合多地域多数据中心。

    我们的资源来源于一些拥有闲置资源的合作伙伴,这些资源散布于多个地域的多个数据中心中。我们的平台需要能够支持全局的调度,同时尽可能减小运营、运维的成本。

     

简单地说,我们需要有一个平台,统一封装多个数据中心的计算资源,并且同时支持虚拟机、容器等多种形式的资源使用方式。 

 

 (图1:计算资源管理平台的需求示意图)

 

说到虚拟机,首先想到的就是 UCloud 自己的 云主机UHost 和开源的 OpenStack,然而,这两套系统都是针对大型公有云的场景,而且主要只针对于虚拟机这一种业务。它们功能丰富、模块众多,运维运营上都需要很大的成本。然而我们的业务并不需要这么多功能。

最终,我们选择基于 Mesos 来实现这套平台。

 

 

 

为什么选择 Mesos

 

Mesos是Apache下的开源分布式资源管理框架,它是一个分布式系统的内核。

通过 Mesos,一个数据中心所提供的不再是一台台服务器,而是一份份的资源。资源可以是 CPU 核数、内存、存储、GPU 等等。如果把一个数据中心当做一个操作系统的话,Mesos 就是这个操作系统的内核。

我们选择 Mesos 的原因在于它拥有高度可扩展性,同时又足够简单。

作为内核,Mesos 只提供最基础的功能:资源管理、任务管理、调度等。并且每一种功能,都以模块的方式实现,方便进行定制。架构上,Master 和 Agent 两个模块就实现了资源相关的所有工作,用户只需根据自己的业务逻辑实现 Framework 和 Executor 即可。这样就支持我们能够把计算资源封装成虚拟机、容器等各种形式。

采用 Mesos 来进行容器编排的方案已经被很多厂商使用,相关的资料文档也比较丰富。然而用 Mesos 来管理虚拟机,业内并没有应用于生产环境的实践。本文的余下内容,主要向读者分享一下 UCloud 用 Mesos 管理虚拟机的思路和实践经验。

 

 

Mesos 简介

 

Mesos 采用 Master-Agent 架构。Master 负责整体资源的调度并对外提供 API。Agent 部署在所有机器上,负责调用 Executor 执行任务、向 Master 汇报状态等。

 

Mesos 提供了一个双层调度模型:

  1. Master 在 Framework 之间进行资源调度。

  2. 每个 Framework 内部实现各自业务的资源调度。

 

整体架构如下图:

(图2:Mesos 的双层调度结构图)

 

 

架构设计

 

 

整体架构

在 Mesos 的双层调度模型上,平台的整体架构如下图:

 

 (图3:基于Mesos的资源管理平台整体架构图)

结构如下:

  1. 每个 IDC 一套或多套 Mesos 集群

  2. 每个 Mesos 集群一个 Cluster Server,与 Mesos Master 以及 Framework 交互,负责集群内部的调度、状态收集和任务下发

  3. 一个Mesos集群上有多个Framework,一个 Framework 负责一种业务,比如 VM Scheduler 管理虚拟机,Marathon Framework 管理Docker任务

  4. VM Framework框架实现管理的 Excutor 基于Libvirt,实现虚拟机的创建,重启,删除等操作

  5. 所有 Cluster Server 统一向 API Server 汇报,上报状态、获取任务

  6. API Server 负责主要业务逻辑,以及集群间的调度、资源和任务的管理等等

  7. API Gateway 提供 API 给 UCloud 控制台(Console)

 

基于 HTTP 的通信

系统内的所有通信都基于 HTTP。

首先,Mesos 内部基于 libprocess  各组件之间的通信都都依赖 libprocess 库,该库用 C++ 实现了 Actor 模式。每个 Actor 会监听 HTTP 请求,向 Actor 发消息的过程就是把消息体序列化后放在 HTTP 报文中,然后请求这个 Actor。

其次,业务相关的各个组件,API Server、Cluster Server 等也都通过 Restful 的 API 提供服务。

HTTP 的优点在于简单可靠、易于开发调试和扩展。

 

VM Scheduler

对于 Docker 容器,我们采用 Marathon Framework 进行管理。而对于虚拟机,我们则采用自己开发的 VM Scheduler Framework 。

VM Scheduler 从 Master 获取一个个的资源 offer 。一个资源 offer 包含了某个 Agent 上可用的资源。当有虚拟机任务需要执行是,Cluster Server 会把任务的具体信息发送给 VM Scheduler。

任务分为两类:

  1. 创建/删除一个虚拟机。此时需要传入虚拟机的配置信息、包括镜像、网络、存储等。VM Scheduler 根据这些信息,匹配满足要求的 Resource Offer,然后生成 Task 提交给 Mesos Master 去执行。

  2. 操作一个虚拟机,如开关机、重启、镜像制作等。此时 VM Scheduler 会和 VM Executor 通过 Framework Message 通信,告诉后者去执行具体的操作。

 

VM Executor

Task 是 Mesos 中资源分配的最小单位。Master 会告诉 Agent 需要执行哪些 Task,Agent 也会把 Task 的状态汇报给 Master。根据 Task 的信息,Agent 会下载并启动所需的 Executor,然后把具体的 Task 描述传给它。

VM Executor 是我们开发的对虚拟机的生命周期进行管理的 Executor,实现了对虚拟机创建、删除、开关机、镜像制作等功能。

VM Executor 启动后,根据 Task 的描述,动态生成虚拟机需要的配置文件,然后调用 libvirt 进行虚拟机创建。当收到来自 VM Scheduler 的 Framework Message 时,又调用 libvirt 进行开关机等操作。

状态的管理是实现虚拟机管理的关键部分。通过 Mesos 我们只能拿到 Task 的状态,RUNING 表示虚拟机创建成功,FAILED 表示虚拟机失败,FINISHED 表示虚拟机成功销毁。

然而除此之外,一个虚拟机还存在“开机中”、“关机中”、“关机”、“镜像制作中”等其他状态。我们通过在 VM Executor 和 VM Scheduler 之间进行心跳,把这些状态同步给 VM Scheduler。

后者对状态进行判断,如果发现状态改变了,就发送一条状态更新的消息给 Cluster Server,然后再转发给 API  Server,最终更新到数据库。

 

虚拟机的调度

首先看一下一个 Task 在 Mesos 中是怎么调度的:

 

(图4:Mesos 资源调度过程示意图) 

 

上面的示例中:

  1. Agent 向 Master 汇报自己所拥有的资源

  2. Master 根据 Dominant Resource Fairness(DRF) 调度算法,把这份资源作为一个 resource offer 提供给 Framework 1

  3. Framework 1 根据自己的业务逻辑,告诉 Master 它准备用这份资源启动两个 Task

  4. Master 通知 Agent 启动这两个 Task

 

对应到虚拟机的情况,调度分两个部分:

  1. 选择集群。默认情况下,API Server 根据资源需求,从注册上来的集群中选择一个拥足够资源的集群,然后把资源需求分配给该集群。另外,还可以针对不同的公司、项目等维度制定在某个集群运行;

  2. 集群内调度。Cluster Server 从 API Server 处获取到资源需求,比如说需要 200 个核,于是根据 Mesos 当前资源使用情况,创建出一个“资源计划”,200个核被分配为4个48核虚拟机和1个8核虚拟机。然后通知 Framework 按照这份计划来创建5个Task。

 

资源的标识

服务器之间除了 CPU、内存、硬盘等可能不同外,还会存在其他的差别。比如有时候业务要求一定要用某个型号的 CPU,有时候要求一定要拥有 SSD等等。为了支持更多维度的调度,我们利用了 Mesos 的 Resource 和 Attribute 来标识不同的资源。

Resource是 Mesos 中的一个概念,表示一切用户需要使用的东西。Agent 默认会自动添加 cpus, gpus, mem, ports 和 disk 这5种资源。另外还可以在 Agent 启动时,通过参数指定其他资源。

Attribute 以 Key-Value 形式的标签,标识一个 Agent 拥有的属性,同样可以在启动时通过参数指定。

通过 Resource 和 Attribute 的灵活运用,可以标识出更多的资源情况,满足各种资源调度需求。比如通过 Resource 指定 SSD 大小、CPU型号,通过 Attribute 标识机架位、是否拥有外网 IP,是否支持超线程等等。

Framework 收到一个 resource offer 后,与待执行的任务需求进行匹配,通过 resource 判断资源是否够用,再通过 Attribute 判断是否满足其他维度的需求,最终决定是否用这个 offer 来创建 Task。

 

镜像、存储和网络管理

平台提供了一些基础镜像,另外用户也可以基于自己的虚拟机创建自己的镜像。这些镜像文件统一存储在一个基于 GlusterFS 的分部署存储服务中,该服务挂载在每台物理机上。

有些业务场景需要部分虚拟机能够共享同一份存储,于是我们还是基于 GlusterFS 开发了用户存储服务,能够根据用户的配置,在虚拟机创建时自动挂载好。

网络方面,每个用户可以创建多个子网,各个子网之间做了网络隔离。创建虚拟机时,需要指定使用哪个子网。

 

 

其他问题

 

在使用 Mesos 的过程中,我们也遇到了其他一些问题。

 

问题一:Marathon选主异常

当机器负载比较高,尤其是 IO 较高时,我们发现 Marathon 集群有概率出现不能选主的情况。

我们怀疑是由于Marathon节点和ZK的网络不稳定,触发了Marathon或Mesos的bug导致。于是通过iptables主动屏蔽Leader ZK端口的方式,成功复现出问题。

通过在Marathon的代码中加上一些Leader选举相关的最终日志,成功定位到了问题,原来是由于Mesos Driver的stop() 方法没有成功引起 start() 方法退出阻塞导致。

由于我们的所有程序都是通过守护进程启动的,所以我们采用了一个最简单的解决方案:修改Marathon代码,当ZK异常发生时,直接自杀。自杀后守护进程会把程序再启动起来。

 

问题二:go-marathon问题

我们的服务采用 Golang 开发,使用 go-marathon 库与 Marathon 进行交互。使用过程中发现该库有一些问题:

不支持多Marathon节点。于是我们自己创建了一个分支,采用节点主动探测的方式,实现了多节点的支持。(原库v5.0版本以后也支持了该功能)

使用设有 Timeout 的 http.Client 进行 go-marathon 的初始化时,订阅 SSE 会产生超时问题。于是我们做了修改,普通的 HTTP API 和 SSE 不使用同一个 http.Client,操作 SSE 的 http.Client 不设置 Timeout。

网络异常时,go-marathon 的方法调用会 Hang 住。于是我们所有对 go-marathon 方法的调用都加上超时控制。

 

 

结语

 

Mesos 在 UCloud 有着广泛的应用,对外有“计算工厂”和 UDocker 等产品,对内则支撑着公司内网虚拟机管理平台。伴随着持续的实践,我们对 Mesos 的理解和掌控也越来越深入。伴随着持续的实践,我们对 Mesos 的理解和掌控也越来越深入,我们会持续输出我们的使用经验,期待得到各位读者的反馈。

 

转载于:https://www.cnblogs.com/nongchaoer/p/6410923.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Val编程-套接字

套接字的介绍:http://zh.wikipedia.org/wiki/Berkeley%E5%A5%97%E6%8E%A5%E5%AD%97 主要分为客户端和服务器。客户端一般是需要主动去链接,需要配置服务器的IP和端口。服务器是被动响应,需要打开相应的端口。端口一般不推荐使用系统端口和常用…

【pyqt5学习】——Qpainter控件学习(文本、图像、各种图形)

目录 1、作用及应用步骤 2、绘制文本drawText() 3、像素级别绘制点(正弦曲线为例) 4、绘制不同样式的直线 5、绘制弧形、圆形、扇形、图像等 6、画刷填充区域QBrush 1、作用及应用步骤 QPainter是一个用于绘制的类,该类可以用于绘制&…

反向代理与Real-IP和X-Forwarded-For(转)

如下图所示,客户端通过Nginx Proxy1 和 Nginx Proxy2 两层反向代理才访问到具体服务Nginx Backend(或如Tomcat服务)。那Nginx Backend如何才能拿到真实客户端IP呢? 接下来我们来看看如何才能获取到客户端真实IP。 场景1  场景1是…

Android studio打开之后 cannot load project: java.lang.NUllpointerException

参考来源:http://bbs.csdn.net/topics/391014393 关闭网络,重新打开Android studio就好了。(但是原因不清楚是为什么?) Internal error. Please report to http://code.google.com/p/android/issuescom.intellij.ide.p…

Val编程-任务编程

不同任务之间可以通过一个标志符来实现互斥事件。 程序代码&#xff1a; Task2 <span style"font-size:12px;">beginwhile truewait(bTaskFlag)cls()gotoxy(1,1)put("这是Task2")gotoxy(1,2)if bTaskFlagput("BFlag:true ")elseput(&…

【pyqt5学习】——拖拽功能(DragDrop)、剪切板(QApplication.clipboard)

目录 1、拖拽功能&#xff08;Drag&Drop&#xff09; 2、剪切板&#xff08;QApplication.clipboard&#xff09; 1、拖拽功能&#xff08;Drag&Drop&#xff09; 选择文本输入框中的文本&#xff0c;移动到下拉框中自动添加步骤&#xff1a; 1、将文本输入框设置为可…

Val编程-特殊函数使用

Waitendmove()和$Waitendmove()使用心得 这是两个部分&#xff0c;程序运行部分和运动堆栈部分&#xff0c;waitendmove是两个部分进行交互的一个函数。 一般情况下waitendmove()速度会降到0&#xff0c;相当于blend等于off. 代码&#xff1a; begincls()userPage()title("…

【pyqt5学习】——QDateTimeEdit控件学习

目录 1、同时显示日期时间QDateTime 2、只显示日期QDate 3、只显示时间QTime 4、设置显示的格式setDisplayFormat 5、 QDateTimeEdit常用信号 6、实例 1、同时显示日期时间QDateTime # 同时显示日期时间dateTimeEdit1 QDateTimeEdit()dateTimeEdit2 QDateTimeEdit(QDat…

复选框做成单选效果

function zlClick($id){ var eles document.getElementById($id).children; var srcEle event.srcElement; for(var i0;i<eles.length;i){ if(srcEle.checked){ if(eles[i].value!srcEle.value){ eles[i].checkedfalse; } } } } 技术领域可信计算 其他 申请日 200020012…

013. MVC5过滤器

微软提供了4中过滤器: 1.Action过滤器: 在Action方法执行之前和Action方法执行之后, 会执行此过滤器中的代码. 比如在执行public ActionResult Index()方法之前或之后; 也可以说是在方法执行前或执行后; 接口: IactionFilter 抽象类名: ActionFilterAttribute 添加一个实现…

Val编程-读取汉字

Val编程-读取汉字 Val编程中&#xff0c;对于汉字的读取不是很友好&#xff0c;利用fileget直接读取记事本产生的文件字符串会导致乱码的产生。因为Val只支持使用utf-8进行编码&#xff0c;因此读取的文本需要进行utf-8格式转换。 在GBK中&#xff0c;汉字占两个字节。并且…

【pyqt5学习】——菜单栏(QMenu())、工具栏QToolBar学习

目录 1、菜单栏&#xff08;QMenu()&#xff09;——一般在窗口顶部 1&#xff09;创建菜单栏步骤 2&#xff09;信号与方法 3&#xff09;实操 2、工具栏——一般在菜单栏下方 1&#xff09;创建步骤 2&#xff09;方法与信号 信号&#xff1a; 方法&#xff1a; 3&am…

【pyqt5学习】——利用Pyqt5连接打印机(QtPrintSupport、QPrintDialog、QPageSetupDialog)

目录 1、利用QtPrintSupport直接连接打印机——不常用 1&#xff09;基本知识 2&#xff09;完整代码案例 3&#xff09;结果 2、 打印对话框QPrintDialog、打印设置对话框QPageSetupDialog 1&#xff09;弹出打印设置对话框 2&#xff09;弹出打印对话框 注&#xff1a…

Exchange Server 2016管理系列课件39.新建本地移动请求

场景通过新建本地移动请求&#xff0c;可以很方便的将用户邮箱从一个数据库迁移到另外一个数据库。1&#xff09;跨平台邮件迁移&#xff1b;&#xff08;低exchange迁移到高版本exchange&#xff09;2&#xff09;数据库平衡与优化&#xff1b;&#xff08;企业当中&#xff0…

【数据库学习】——【汇总】MySQL数据库下载与安装(Msi文件安装和免安装版本)、Navicat下载与安装

目录 1、MySQL数据库下载与安装 1&#xff09;MySQL数据库下载 MySQL官网 MySQL数据库下载 2&#xff09;MySQL 通过msi文件安装 3&#xff09;MySQL免安装版本使用 1&#xff09;将免安装包移动到安装的文件夹位置&#xff1b; 2&#xff09;新建data文件夹 3&#xff…

【数据库学习】——纠错:mysql Authentication plugin ‘caching_sha2_password‘ is not supported

目录 1、环境介绍 2、问题描述 3、原因分析 4、 解决方案 1&#xff09;方法一&#xff1a;直接改成mysql_native_password验证方式 2&#xff09;方案二&#xff1a; 利用sql命令将验证机制修改 ① 打开命令行窗口——cmd ② 登录mysql数据库 ③ 查看不同用户名的身份…

xcode中用pods管理第三方库转

安装pods &#xff1a;http://www.cnblogs.com/wangluochong/p/5567082.html 史上最详细的CocoaPods安装教程 --------------------------------------------- 第一步&#xff1a;Cmmand&#xff0b;空格&#xff0c;搜索"终端"&#xff0c;使用cd命令进入到我们项目…

Val编程-界面编程

由于示教盒是一个黑白的分辨率为&#xff08;14*40&#xff09;的液晶屏&#xff0c;用户交互不是很好&#xff0c;界面不友好。而且没有鼠标导航与触摸屏。 界面编程函数 1.void cls() 2.void title(string sText) 3.void put(string sText), void put(num nValue) 4.void put…

【机器学习笔记四】分类算法 - 逻辑回归

参考资料 【1】 Spark MLlib 机器学习实践 【2】 统计学习方法 1、Logistic分布 设X是连续随机变量&#xff0c;X服从Logistic分布是指X具有下列分布函数和密度函数 &#xff0c;。其中u为位置参数&#xff0c;γ为形状参数。如下图&#xff1a; 分布函数以(u,1/2)为中心…

FPFH+ICP点云配准

A, UniformSampling降噪B, ISS计算关键点, FPFH特征在FeatureCloud::setInputCloud中读入点云,并调用processInput进行处理:processInput处理包括: 1, computeSurfaceNormals () 使用NormalEstimation计算得到表面法向量2, computeLocalFeatures () FPFHEstimationKdTreeIS…