我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何利用Mesos构建多任务调度系统

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何利用Mesos构建多任务调度系统

本篇内容介绍了“如何利用Mesos构建多任务调度系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

背景

公司内部的云平台为各个业务线提供了大量的实体机和虚拟机来运行业务的服务,经过统计发现,这些分配给业务的机器cpu, memory等资源利用并不充分;

如果能够充分利用这些机器上的空闲资源同时又能保证业务服务的正常运行,将会节省不少的机器资源;

选型

一提到多任务运行和调度,大部分人可能首先都会想到Kubernetes(k8s) + Docker, 跑起来如清风拂面, 顺畅无比。然而我们的业务机器大部分为centos 6.2, linux kernel 2.6的环境,而docker的运行需要Linux kernel的版本是 3.10+

(可参考: https://docs.docker.com/engine/faq/#how-do-i-connect-docker-containers)

因为想利用业务正在使用的机器,又不能影响现有已在跑的服务, 所以不能升级内核, 不能重启机器,显然k8s这条路走不通;

还好,这个世界总是提供给我们多样的选择,除了Kubernetes(k8s) + Docker, 我们还有mesos;

Mesos简介

先放上官方网站, 上面有很详细的说明;

http://mesos.apache.org/

简单来说,Mesos就是用于整个计算中心的操作系统,它统一管理计算中心所有机器的cpu, memory, disk, network等计算资源,按任务所需分配资源,调度任务,支持故障转移等等;

Mesos特性

Mesos最大特点是两级资源调度, 如下图:

如何利用Mesos构建多任务调度系统

上面架构图的简要说明如下:

  1. 各个Agent上报自已的计算资源给Master;

  2. Master给各个二级调度框架Framework发送resource offer;

  3. Framework将其上等待调度的task与收到的resource offer作匹配,反馈给Master;

  4. Master将相应Framework反馈的task和resource offer发送到对应的Agent;

  5. Agent使用Executor来运行task, 并限定资源使用;

在Mesos上可以运行Spark, Storm, Hadoop, Marathon等多种Framework;

Mesos系统架构

官方文档:

http://mesos.apache.org/documentation/latest/architecture/;

针对任务隔离这块, Mesos除了支持docker容器技术,还提供了它自己的Mesos Containerizer, 这正是我们所需要的.其实Mesos Containerizer目前也是利用Linux Cgroup作资源限制, 用Linux namespace作资源隔离.

Mesos Containerizer:

http://mesos.apache.org/documentation/latest/mesos-containerizer/

面临挑战

我们的多任务调度系统需要解决的几个问题

  1. Mesos agent在业务机器上需要非侵入式地部署,不能污染所部署的机器的环境;

  2. 实时监控和调整Mesos Agent所能使用的计算资源;

  3. Task的快速部署和资源隔离;

  4. 集群整体运行情况的监控;

多任务调度系统总体架构

架构设计图 

 如何利用Mesos构建多任务调度系统

  1. 各组件简介:
    1.1 主体还是Mesos master + Mesos agent;
    1.2 二级调度框架使用的是Marathon;
    1.3 在部署了Mesos agent的机器上同时部署monitor用于实时监控和调整Agent的可用计算资源;

  2. 系统运行流程,按上图中标号顺序

    1 Monitor实时监控组件收集所在机器上的可用资源;

    2 Monitor根据所在机器上的可用资源动态调整agent的保留资源;

    3 Agent动态实时的将自已的保留资源上报到Mesos master;

    4 Mesos Master在resource offer发到Marathon;

    5 Marathon根据收到的resource offer和需要运行的task作资源分配, 将分配结果反馈给Mesos Master;

    6Mesos Master将task分配到具体的Agent上执行;

Mesos agent在业务机器上非侵入式部署

我们采用的是Mesos 1.4.1版本,用C++11编写,Mesos项目本身非常庞大,依赖库必然也很多,解决这些运行依赖问题首当其冲;

部署原则就是不改变,不污染所部署的机器环境,针对libstdc++和其他一些so, 我们不会将其安装到例如/usr/local/lib这样的系统目录, 而是在打包时采用动态更改可执行程序的rpath的方法,使其运行时从我们的安装目录加载相应的so库, 具体作法就是

  1. 我们将mesos运行所需要的所有lib文件都集中放在libs目录下;

  2. 编译出来的mesos可执行文件,使用patchelf来更新rpath路径,指向我们自已的libs目录即可;

  3. patchelf这个工具可以在不影响可执行文件运行的前提下,修改其elf文件结构中的某些属性值,具体可参考:https://nixos.org/patchelf.html

这样部署完,Mesos agent只是一个单独的目录,卸载只需要停掉进程,删除目录就好;

说一下编译过程,虽然官网上已经介绍得比较详细,但在编译过程中还是会遇到一些问题:

  1. 官网编译步骤: 请参考

    http://mesos.apache.org/documentation/latest/building/;

  2. gcc官方要求是 4.8.1+, 我用了 gcc 5.4, 自己在 centos 6.2,linux 2.6.32上重新编译的;

  3. 编译默认是编译java语言的binding的, 但在 编译 "Build and attach javadoc"时缺 protobuffer的jar包,没编译过, 解决方案:修改 class="lazy" data-src/java/mesos.pom.in,先找到 ``, 在它下面的 <configuration>下添加 <skip>true</skip>,这样不会编译这个 javdoc, 但不影响 java binding的使用

实时监控和调整Agent所能使用的计算资源

自行开发了Monitor程序,和Agent一同部署在业务机器上,周期性的监测机器上可用资源和Agent本身所用资源;

如何利用Mesos构建多任务调度系统

Mesos为我们提供了动态资源保留这个超实用的功能,可以限制Agent当前针对某个Role可以使用的计算资源:

Monitor的监控评估结果就是当前Agent可以使用的计算资源;

本想着到这里这个问题就结束了,测试时发现Agent并不能在线实时调整这个动态资源保留,需要在配置文件时更新好当前能够使用的动态资源,然后重启Agent;

重启Agent是我们不能忍受的,因此我们修改了源码,通过http接口在线调整动态资源保留, 这部分其实不难,mesos http接口定义十分清晰,依葫芦画瓢就好了.

Task的快速部署和资源隔离

task的部署目前我们采用Marathon,上手简单,功能够用; 如果需要更灵活的调整策略,可能就需要自己开采框架或基于某一框架二次开发了;

task其实是有重要,紧急之分,占用资源也不尽相同。对于重要紧急任务,为了保障任务的更好运行,我们会利用Mesos attribute,在调度任务时让特定任务只跑在具有特定attributes的agent上, 这就需要为每个mesos agent设置相应的attributes;

遇到了同样的问题,mesos不能在线动态调整attributes :-(, 其实也比较简单,稍微梳理下mesos源码结构,改起来不难;

还有一个问题,attributes是动态调整的,agent如果重启了怎么办?我们为此部署了etcd集群来管理,每台agent都是etcd上的一个node, 通过etcd提供的http接口更新其attribrtes, agent会周期性的从etcd上同步;同时各agent 上的attributes信息也很容易从etcd上获得;

直接操作etcd, 删除某台agent上的attribute, 那依赖于这种attribute部署的任务会自动别调度走,不再在这台agent上运行;

task隔离问题,针对cpu和memory,mesos都是通过cgroup来完成,对于cpu的限制, 我们使用cfs方式,前提是需要判断当前kernel是否支持.对于disk的限制,目前mesos使用的是du命令周期性检测的方式;

对于cpu的限制,mesos有两种方式:

  1. cpu shared方式:这种方式对 cpu 没有严格限制,机器上的任何task都可以访问机器上所有cpu资源,比如你限定的cpu使用资源是2, 这种方式可能使用到4,6或更高;

  2. cpu CFS方式: 相当于配置了独占 cpu, 比如cpu配置为1,那么这个任务的 cpu 使用率就不会超过 100%, 相当于设定了一个hard limit;

在我们的大部分环境中,受限于kernel版本,mount namespace不支持,因此我们采用rootfs + chroot的方式来作简单的资源隔离;

我们定制了若干版本的rootfs, 任务打包就是将任务本身的依赖和相应rootfs结合的过程, 打包好可以放到s3等存储上,供marathon部署任务时调用。

这里我们结合marathon的一个任务部署的json配置来讲一下, 先看一个这个配置, 我将说明直接写在里面

如何利用Mesos构建多任务调度系统

“如何利用Mesos构建多任务调度系统”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何利用Mesos构建多任务调度系统

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何利用Mesos构建多任务调度系统

本篇内容介绍了“如何利用Mesos构建多任务调度系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景公司内部的云平台为各个业务线提供了大量
2023-06-05

基于云服务MRS如何构建DolphinScheduler2调度系统

这篇文章主要介绍“基于云服务MRS如何构建DolphinScheduler2调度系统”,在日常操作中,相信很多人在基于云服务MRS如何构建DolphinScheduler2调度系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-06-30

Win10系统如何调节任务栏透明度

本篇内容介绍了“Win10系统如何调节任务栏透明度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、在开始菜单打开设置。 2、选择打开个性化
2023-07-02

如何利用MySQL和Go语言开发一个简单的任务调度系统

下面是一个简单的示例,展示如何使用MySQL和Go语言开发一个任务调度系统:1. 安装MySQL数据库和Go语言开发环境。2. 创建一个MySQL数据库,用于存储任务和调度信息。可以使用以下命令创建一个名为task_scheduler的数据
2023-10-20

如何利用Redis和Perl 6开发分布式任务调度功能

如何利用Redis和Perl 6开发分布式任务调度功能随着分布式系统的广泛应用,分布式任务调度成为了许多企业和开发者面临的一项重要挑战。Redis作为一款高性能的缓存数据库,以其快速的响应和持久化特性成为了分布式任务调度的理想选择。而Per
2023-10-22

如何在golang中利用Select Channels Go并发式编程实现任务调度

在Go语言中,可以使用select和channel来实现任务调度。下面是一个示例代码,演示如何使用select和channel来实现任务调度:gopackage mainimport ("fmt""time")func worker(id
2023-10-20

Spring Boot中的权限系统如何利用Spring Security 进行构建

本篇文章为大家展示了Spring Boot中的权限系统如何利用Spring Security 进行构建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring Security是一个能够为基于Sp
2023-05-31

如何利用ChatGPT和Python实现智能推荐系统的构建

如何利用ChatGPT和Python实现智能推荐系统的构建推荐系统是目前互联网应用中广泛使用的一种技术,它能根据用户的兴趣和行为数据,为用户推荐个性化的内容和产品。ChatGPT是一种基于人工智能的机器学习模型,专注于对话生成。结合Chat
2023-10-27

如何利用XP系统文件和文件夹建立审核制度

这篇文章将为大家详细讲解有关如何利用XP系统文件和文件夹建立审核制度,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。有网友问,你这些日子说的那些安全措施管用吗?评论中有说好的,也有提出批评的。
2023-06-14

Linux系统如何使用fork命令创建子进程执行任务

小编给大家分享一下Linux系统如何使用fork命令创建子进程执行任务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!fork 系统调用要创建一个进程,最基本的系统调用是 fork: # include pid_t fork
2023-06-28

如何使用MySQL构建一个多公司/分支机构会计系统表结构以支持多个实体的财务管理?

如何使用MySQL构建一个多公司/分支机构会计系统表结构以支持多个实体的财务管理?在当今的商业环境中,许多企业都拥有多个子公司或分支机构。为了有效管理这些实体的财务活动,一种常见的做法是使用一个集中式的会计系统。本文将介绍如何使用MySQL
如何使用MySQL构建一个多公司/分支机构会计系统表结构以支持多个实体的财务管理?
2023-10-31

如何利用Systemd和Crontab在Linux系统中设置定时任务的优先级

在Linux系统中,可以使用Systemd和Crontab来设置定时任务。以下是如何设置定时任务优先级的步骤:1. 使用Systemd设置定时任务的优先级:- 创建一个新的Systemd服务单元文件(例如,`mytask.service`)
2023-10-09

如何利用Systemd和Crontab在Linux系统中实现定时任务日志记录

要在Linux系统中实现定时任务日志记录,可以使用Systemd和Crontab的组合。下面是具体的步骤:1. 创建一个Shell脚本,用于执行定时任务,并将任务执行的结果输出到日志文件中。例如,创建一个名为`mytask.sh`的脚本文件
2023-10-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录