AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

Mesos container 在 360 广告系统的应用(下)

  • 2019-11-25
  • 本文字数:4594 字

    阅读完需:约 15 分钟

Mesos container在360广告系统的应用(下)

mesos master 的故障恢复机制

接下来说一下 mesos master 的故障恢复机制。



因为 mesos master 只有一个软体状态,只会列出它之上的 framework 以及 mesos-slave 的信息,在 mesos master 需要进行切换的时候,通过 zookeeper 进行 leader 的重新选取,选取好新的 leader 后,只需要所有的 framework 和 mesos-slave 节点重新注册到新的 mesos master 之上,时间就 10 秒钟左右。如有你有上万台机器,可能会同时连 mesos master 会不会造成大量的链接导致 master 服务不可用,官方有这样的设置可以设定链接的比例来进行控制。

mesos 的生态圈有哪些框架

marthon framework


  • 运行长任务。从应用框架字面的意思,任务就像跑长跑一样,这个框架其实就是运行长任务(long running job )的。

  • 服务发现。marathon 还可以实现服务发现,有比较好的 API 接口,比如我有一个 APP id 对应具体机器的 IP 是什么。

  • 健康检测 &事件通知机制。marathon 支持对你所启动的任务进行健康检测,比如端口或者你自定义命令都可以,有事件通知机制,正因为有了事件通知机制才可以在马拉松之上建立一些实时的服务发现,知道哪些服务宕掉了,在哪些新节点启动了,可以保证我们的实时发现服务,重新指向新的服务器。

  • WebUI。marathon 有自己的 web UI,可以通过界面直接操作,非常方便。

  • 限定条件。你可以设定一大堆的限定条件,比如我之前说的像你选飞机的舱位一样,你设定了网卡必须是万兆的,marathon 会根据你设定的限定条件,帮你选择对应资源。

  • Labels。labels 标签也是我们常用的,随着资源利用率越来越大,可能有各种应用,大家可以加上各种的标签,方便的查询。

  • 数据持久化。数据持久化也是支持的,可以支持挂载本地卷。

  • 服务的预热。这个功能用得不是特别多,比如你在服务启动的时候会需要启动时间,这个时间健康检测是失败的,你可能需要设定一个预热时间,保证服务启动之后正常的健康检测才生效。

  • 优雅退出。优雅退出这个问题,大家可能都会遇到,比如像 C++不涉及内存自动回收可能需要程序上设计优雅退出的问题,你可以通过 marathon 设置一个退出时间,保证你的服务正常退出之后,才把以前的服务都退掉,新的服务启动。

  • 支持自定义的 containerizer 和 GPU 资源的调度。

Marathon-lb


marathon-lb 是我们用的一个实时发现的服务,marathon-lb 是基于 haproxy 和 marathon eventbus 机制设计的。其实除了 mrathon-lb 还有一些其他的服务实时发现,但是都是基于 marathon 的事件通知机制设计的。因为 marathon 有事件总线的实时更新,可以实时的改变服务后端的 IP。如果有宕机或者有服务自动扩缩容的话,marathon-lb 可以实时改变 haproxy 的配置,marathon-lb 主要是通过第四层 IP 加端口的方式进行服务代理,marathon-lb 支持 TCP 或者 HTTP 的代理方式。

Mesos-DNS


我们还使用了 mesos 官方的 mesos-DNS 服务,用于一些对实时性要求不高的服务,比如我们把 STORM 容器化以后 nimbus 和 supervisor 之间的通信可能就不是那么频繁,如果有 nimbus 宕机的情况,只需要通过 mesos-dns 就可以重新发现 appid 对应的新的 nimbus IP。你可以使用 mesos-DNS 发现 appid 对应的所有后端节点的 IP,可以保证你的服务节点随时都可以访问到你想访问到的 IP。mesos-DNS 有一定的延迟性,我们测试大概有十几秒。

Mesos VS YARN

我说一下在我们做技术选型的时候,我们也做过 mesos 和 yarn 方面的调研。


mesos 主要是能调度各种样的资源,有 CPU,内存、端口、硬盘;yarn 主要是 CPU 和内存。


两者都是两极调度策略但是又有不同。


mesos 本身只做资源的调度,不负责具体任务的调度,把任务调度交给 framework 调度。


yarn 全都是 yarn 本身进行资源调度,一个程序提交给它一个任务都由 yarn 来决定是否接受或者拒绝这个资源,而 mesos 却不同。


mesos 因为是对物理资源进行管理与调度的,yarn 主要基于 hadoop 来做。


根据需要,我们最后还是选择了 mesos 来作我们的分布资源管理框架。

Mesos VS Kubernetes

说起 mesos 可能很多同学觉得使用了 marathon 提供了容器任务的管理能力,可能就需要跟


kubernetes 系统进行比较一下。


本身来讲,mesos 和 kubernetes 是两个东西,mesos 是一个分布式的资源管理框架,被称为分布式系统的内核。假如你有很多物理资源,你想把它整合成一个逻辑资源层面的物理资源池,那么你用 mesos 是最合适不过的了。


mesos 解决问题的核心是如何把资源整合成一个大型的物理资源池,它上面运行什么,怎么跑它并不关注。


kubernetes 主要是一个自动化的容器操作平台,操作主要包括部署、调度还有节点集群间的扩容等等。


kubernetes 解决问题的核心主要是围绕容器来做的,这两个系统本身没有可比性。因为 mesos


支持很多 framework,比如 marathon 可以实现容器的调度,所以大家就会把这两个平台进行比较。


如果你想搭建这样一个容器管理平台或者调度平台,从我个人来讲第一点从任务上来讲,marathon 只支持长任务型的,kubernetes 支持的比较广,比如支持长时间任务(long running job),节点后台支撑型(node-daemon)等等各种各样的任务。


说一下稳定性方面,kubernetes 是谷歌官方推出的,它的更新比较频繁,更新频繁可能带来的就不是特别稳定,大家可能理解我可以多做一些线下测试,但是事实确实是这样的,kubernetes 更新非常频繁。mesos 一般每半年更新一次,一年发布两个版本,会经过充分测试。mesos 产品设计因为是开源的,是 Apache 基金会下面的顶级项目,会在社区跟大家进行投票与沟通,决定未来我们的产品怎么做,我们会增加哪些功能。


第三种主要是从功能上来讲,kubernetes 是由谷歌做的,所以它的考虑会非常全面,它的生态非常全面,你想要的功能基本都有,包括网络 kubernetes 其实也是有的,其实 kubernetes 本身的网络做得不是特别好,很多用 kubernetes 都是用 calico 实现的。mesos 系统的设计思路则定义了任务调度和功能上整体依赖于调度器的设计,所以可以把 mesos 看成一个大乐高底层的基础板。


对于这两个框架,选择哪一个都没有对与错,只有适合与否,选择一个适合你们的工具才是最重要的。

mesos /container 在 360 的一些应用

我说一下 mesos /container 在 360 的一些应用。



我们从 2015 年开始,就对分布式的调度系统或者容器调度平台进行了调研,最后选择使用 mesos,因为我们想构建一个大型的物理资源池。在 2016 年业务正式上线,包括之后说的一些服务的容器化,2016 年我们也使用了 chronos,可以运行一些物理机上运行的 crontab 任务,长时间支持服务在线运行。2017 年我们已经实现了两个机房各部署了一个大型的资源池,节点达到了单集群最大 1000 个以上,任务达到 5000 个以上,10 个以上的自定义 framework。

解决的问题

部署

现在部署可能你只需要在 marathon 上改变你的镜像(image)地址,或者只需要把 instance 数改大就可以扩容。

故障恢复

故障恢复,如果有一台 mesos-slave 宕掉了,会自动在其他的节点上启动。

服务降级

关于服务降级,我们的资源池服务器是有限的,1000 台服务器如果资源快用满了,有些业务就需要做服务降级,不是所有业务都有动态扩缩容。我们主要处理广告业务,广告业务实时日志流比较多,在资源不够的时候,会让某些业务降级。平时每秒处理 20 万条,降级时让它每秒处理 10 万条或者 5 万条,有一定数据延迟也没有关系,因为数据不会丢只会慢慢处理完。

服务发现

关于服务发现,现在有了 mesos-dns 和 marathon-lb 我们可以做到实时的服务发现,因为是动态资源划分,我们的任务就可能实时变化。

storm 集群的容器化


上图是原来通过物理级部署的,所有的 supervisor 节点都是一台台物理机还要单独部署一个 ninmbus,如果 nimbus 节点宕掉非常麻烦,比如有些同学说我可能会用 keepalived 做高可用,这确实是一种方案,但是如果你的集群需要频繁的扩容或者缩容就会非常麻烦,你要是不对资源进行动态管理的话,势必带来的就是资源的浪费,因为不可能一天 24 小时都满负荷运行。


把服务容器化之后,所有的 supervisor 都运行在 container(mesos-slave)中,supervisor 节点会通过 mesos-DNS 发现 ninmbus(master)的 IP。现在集群资源都是动态利用的。


图片服务的容器化

重点说一下图片服务的容器化。



图片服务主要用的 PHP7 来做的,我们也会面临像阿里一样在双十一的时候,因为广告展示与投放量非常大,每秒达到上百万次,因为给用户进行展示与投放的图片会根据用户的习惯去动态的缩放与拼接。如果我放着很多机器专门用来做图片服务,可能也可以达到你的需求,但是在空闲时间段比如夜里资源浪费得非常多,对资源的利用率不是非常好。


我们就制定了这样一套方案,首先把 PHP 服务容器化,之后我们根据亚马逊 AWS 的策略,做了自己的方案,跑一个 long running job,根据 marathon 的 API 获取你的图片服务具体是哪台机器,由于所有机器上的监控都用了二次开发,通过 API 接口能获取负载、CPU,内存等等信息。当图片服务器的负载上升了肯定是压力最大的时候,这样我们只需要设定一个阈值。


比如系统负载大于 10 超过 10 次,就进行一次扩容,扩容的倍数是 1.5 倍,原来我有 10 台机器,现在要扩容到 15 台。大家可能会问你这个最大能扩到多少?我一定要设定一个最大值不能无限的扩。比如我们设定一个 36,最大扩到 36 台,在 5 分钟内可能判断 10 次,如果这个负载水平一直很高,就不进行缩容。


我肯定还会设定一个最低值,比如最低值是 6 台,可能到了夜里直接减为 6 台,每次都需要通过 marathon 的 API 实时发现后端所有机器计算出一个平均值。服务的监控,我们对每台 mesos slave 都有监控,具体的 container 我们做了异步,通过异步把日志写到 graylog 中,监控日志传输通过 UDP 协议。如果发生网络中断的情况也不会有太大影响,因为 UDP 是可丢的不可靠的。

其他

我们还有其他服务的一些容器化,有 Web service 相关的,aerospike 服务,通过组播实现集群之间的通信部署起来比较方便,marathon-lb 也是完全的 Docker 化的,毕竟是代理层像 lvs 一样,可能会有服务瓶颈。kafka mirrormaker 我们用来进行多机房之间的数据传输,原来直接部署在物理机上,这样虽然不会有太大问题,如果宕掉之后数据不能在多个集群当中进行同步,对实时性不能要求那么高。如果做了容器化之后是可调度的,都是可高可用的,我们会保证服务的可靠性。redis 也有做容器化,支持数据的落地和持久化,因为我们有 cephfs 还有更多的一些无状态的服务也运行在 mesos 之上。



最后我要说一下我们的服务 ci/cd 是怎么做的,ci/cd 主要是通过 GitLab runner。我们会定义一个 Gitlab-CI,可以直接把你提交的代码进行 Docker build,把镜像自动提交到对应的仓库,通过 API 修改 marathon 上面对应的地址,最后实现上线自动化。

未来计划

未来我们想做的,因为 cephfs 的量不是很大,cephfs 之后想上一些写入量比较大的业务,看看效果如何。我们不是做公有云的对于 calico 的需求不是那么急切,之前一直没有上这个服务。之后我们可能会做一些 calico 相关的,比如一些爬虫的应用,如果用公司的 Nat 代理的话,可能遇到一些 IP 被封,导致整个代理 IP 都不能访问对应的网站就有一些问题了。


还有一些实时的机器学习,现在机器学习主要都基于离线业务来做,实时学习比较少,marathon 和 mesos 本身是支持的。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/GX4rJRJs7TP5lpEjqBEDqA


2019-11-25 15:30723

评论

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

在这些工厂、农田、服务区,看到智能中国的草蛇灰线

脑极体

人工智能 华为 许昌

极客时间运维进阶训练营第十三周作业

9527

【Rust学习】内存安全探秘:变量的所有权、引用与借用

京东科技开发者

spring rust slice 企业号 2 月 PK 榜 可变引用

状态机的概念与设计

timerring

FPGA

架构实战营 10 期 - 作业 6

炮仗

十年老程序员:再见了Navicat,以后多数据库管理就看这款SQL工具

雨果

sql navicat 数据库管理工具

Portraiture4最新简体中文li磨皮滤镜插件

茶色酒

Portraiture Portraiture4

Java高手速成 | 单例模式实现方式——枚举

TiAmo

单例模式 枚举 Java 开发

我的快速调优线上服务器CPU利用率通用办法,震惊面试官

KINDLING

Java cpu 服务器 性能调优 ebpf

嘉为科技蝉联信创工委会“卓越贡献成员”荣誉称号

嘉为蓝鲸

自动化运维 嘉为蓝鲸

关于Zebec生态的改进提案,以及即将上线的 Nautilus 链

BlockChain先知

第六周作业-拆分电商系统为微服务

不爱学习的程序猿

重识Flutter 用于解决复杂滑动视窗问题的Slivers - part1

编程的平行世界

flutter 前端 an'droid

关于小程序游戏变现方式你还知道哪些?

没有用户名丶

前端开发 小程序游戏

全新视觉,升维体验!全栈可观测中心嘉为鲸眼产品全新体验升级

嘉为蓝鲸

可观测 自动化运维 嘉为蓝鲸

成熟的自动化运维平台是怎样练成的?

嘉为蓝鲸

自动化运维 嘉为蓝鲸

Top 5 OSSInsight 年度最佳 MLOps 开源工具

Jina AI

深度学习 开源框架 Jina MLOps OSSInsight.io

《数字经济全景白皮书》出海篇:选对路径下好棋,热点出海行业如何实现增长?

易观分析

数字化 经济 出海

支付对接常用的加密方式介绍以及java代码实现

京东科技开发者

Java 安全 哈希算法 加密算法 非对称加密算法

有关TCP协议,这是我看过讲的最清楚的一篇文章了!

程序员小毕

程序员 TCP 程序人生 计算机网络 架构师

小游戏内测|小游戏脱离微信运行在其它 App

Onegun

微信小程序 小游戏 小游戏开发 微信小程序-游戏

算力新话题,畅聊算力之新民生

鲸品堂

算力网络 企业号 2 月 PK 榜

Sugar BI 增强分析能力全场景解析

XxinQi

数据分析 可视化 BI 商务智能 预测模型

高校数据库/SQL教学用什么样的SQL工具?管理更方便,学习更轻松

雨果

数据库管理工具 :MySQL 数据库 SQL开发工具

前端图片最优化压缩方案

凉城

前端 图片处理 图片压缩 前端图片压缩

Boom 3D免费电脑环绕音乐软件2023最新版下载

茶色酒

Boom 3D

ChatGPT集成之前,让我们复习一下即将过时的知识

newbe36524

搜索引擎; ChatGPT

100 行 shell 写个 Docker

vivo互联网技术

Docker Shell

嘉为蓝鲸携手麒麟软件共建国产化一站式DevOps解决方案

嘉为蓝鲸

DevOps 自动化运维 嘉为蓝鲸

对线面试官:浅聊一下 Java 虚拟机栈?

王磊

java面试

Mesos container在360广告系统的应用(下)_服务革新_李冬_InfoQ精选文章