5月27日,OSC 源创会在上海成功举办。又拍云系统开发高级工程师黄励博在大会分享了《CDN 边缘节点容器调度的实践》。主要介绍又拍云自主开发的边缘节点容器调度方案,从 0 到 1 ,实现零停机、负载均衡,以及基于容器的子网组建、管理等底层功能。

因为分享内容较多,所以将分享整理为两篇文章:

第一篇文章,CDN边缘节点容器调度实践(上)介绍又拍云边缘节点容器调度平台版本1到版本2的发展过程,以及搭建平台时的基本思路;
第二篇文章着重介绍又拍云边缘节点容器调度平台版本3到版本4的发展过程,对平台后续功能的完善做了详细的讲解。

本文是第二篇,以下为讲师分享内容:

版本 3 支持动态负载均衡

版本 2 完成了对 App 所有者的隔离和限制,我们来看下服务的访问者,现在他们都是直接访问节点的机器,这样并不适合完成一些服务的调度, 比如负载均衡和服务更新等。

由于之前提供端口映射方案可以是随机的,在这种情况下,App 的访问者甚至不知道服务具体跑在哪些机器, 监听在哪些端口上,因此需要有一个统一的入口。

△ Slardar

上图是又拍云开源的基于 ngx_lua 的动态负载均衡方案——Slardar。它可以做到在不 load Nginx 的情况下,动态更新 upstream 列表和动态更新 lua 代码。方便动态的维护容器服务的地址。

那么 Slardar 是如何完成服务动态选择的?

如图所示, 首先对于 http 服务我们可以通过 host 来区分不同服务,动态地找到指定的服务,类似的, 对于 tcp 服务,我们通过接入的端口来区分不同的服务

其中, checkups 是一个动态选择上游的组件,他提供了一个注册机制,我们可以注册用户自定义的负载均衡策略, 默认支持轮询和 hash 算法,同时也支持注册主动的健康检查策略, 默认支持 tcp http mysql等协议,这样为每个服务选择一个正常工作的地址。

△ 健康检查功能

上图是健康检查页面,在 slardar 中我们会启用一个定时器来定时检查所有上游的状态。其中 checkup_timer_alive 字段代表这个定时器是否还存活着,last_check_time 字段代表上一次定时器的检查时间。后面是上游的健康状态, 包括 IP、端口号、服务名称, status 状态等。

△ 版本3

我们可以在节点上部署 slardar 作为容器服务的统一入口完成服务的负载均衡和健康检查。服务的用户访问时,都会接入到 Slardar 这个统一入口。由 Slardar 代理到具体的 Task。版本3 的架构如上图所示。

版本 4 支持零停机更新

有了统一的入口,我们可以保证在任务更新时,服务不会出现不可用的状态。可以通过运行两个不同版本的服务同时运行来实现蓝绿更新。

当 Master 收到服务更新请求的时候,Master 会让 Agent 负责启动服务新版本的容器 Tasks,同时把新版本容器地址写入 etcd 把旧版本的地址删除, 之前我们介绍过 calico 会用到这个分布式的 key value 服务器,这边管理 upstream 列表, 我们也同样使用了 etcd 这个 kv 数据库。

旧版本是图中三个蓝色的 Tasks,更新任务开始,会部署三个绿色的新版本 Tasks。当三个新版本任务起来后,Agent 会把 Tasks 中的地址更新到 etcd 中。图中看到有个 confd 的服务会监听 etcd 中 upstream 列表的变更, 把 upstream 列表主动同步给 slardar 完成 upstream 的切换, 而 slardar 启动的时候也支持从 etcd 加载 upstream 列表, 这样就完成了服务的更新, 等旧版本的服务流量没有的时候 Agent 会主动删除旧版本完成更新操作。

△ 零停机更新

结合上文讲的访问控制、统一入口以及动态更新,我们就拥有了这样一个架构。

△ 版本4

版本 4 架构中,Slardar 是 HTTP/TCP 代理,它是一个无状态的代理服务,所以可以任意部署,不存在单点问题,直接部署多台就可以保障可用性。而 Hancock Master 作为服务拥有者的入口,拥有着所有服务的状态,可以看到到现在为止,还是单点的,不是一个高可用的服务。为了解决这个问题,我们需要有一个高可用的方案。

版本 5 实现高可用

与版本 4 项目,版本 5 中使用 Raft 分布式一致性协议实现高可用。

Raft 主要特点有三个:

  1. 领导选举: 心跳机制来触发选举, term 充当逻辑时钟的作用;
  2. 日志复制: 领导者把一条指令(能被复制状态机执行)附加到日志中,发起附加条目 RPC 请求给其他角色;
  3. 强领导者:日志条目只从 leader 发送给其他的服务器。

如图所示, 服务起来时默认为跟随者, 如果发现当前集群中有一个领导者, 那就接受它。如果超时时间内一直没有收到领导者的消息, 它就会把角色切换成获选人, 同时把自己的 term 任期号加1, 开始一轮选举, 如果获得了集群中半数以上的节点的投票, 它就会变成领导者。如果在此过程中, 发现了集群领导者, 而且它的任期号不小于自身的任期号, 那么就把角色退化成跟随者, 如果在随机的一段超时时间到来后, 没有发现领导者也没有多数人的投票, 那么就再进行一轮新的选举。

领导者会把指令附加到日志中, 然后发起 RPC 请求给集群中的其他服务器, 让他们复制日志, 这条指令会最终在集群的每台机器上在 Raft 的状态机中执行, 日志条目只能从 leader 发送给其他服务器。

△ 版本5

在增加了 Raft 之后,版本 5 已经是一个高可用的方案,leader 平时是会与所有的 Agent 交

互,并且它是有状态的,可以把状态同步到两个跟随者中。当 leader 挂掉时,follower 拥有 leader 完整的状态,只要重新选举出来一个成为新的 leader,服务就可以继续运行下去。

版本 6 监控与告警

由于系统中的消息都是异步交互, App 服务可以通过注册回调通知地址,来实时获取各个事件。除了用户需要及时获取一些事件(实例状态变更,服务状态变更等)之外, 我们也需要一个监控和告警方案来及时了解我们边缘服务的情况。

监控:

Agent 会收集 Metrics 到 InfluxDB, 由 Grafana 展示, 如图所示几个节点的流量监控

告警:

告警信息分两类, 一类是任务相关: Hancock 会发送消息到 slack , 截图是 Hancock 的一个告警信息。

还有一类是监控相关, 比如设定的指标异常时, 发送实时消息到 slack, 截图是 slardar 上 500-504 响应的告警信息 , 可以看到在 21点左右 502 的状态出现了一个峰值,有三百多次 502.

最后有了我们现在的边缘容器调度架构。

这些就是我们边缘节点容器调度架构涉及到的一些主要组件, 一些更具体的细节就不再这边一一展开了, 欢迎感兴趣的公司或个人使用我们的这个服务。

了解更多:容器云 - 全球首家分布式容器云平台

CDN边缘节点容器调度实践(下)的更多相关文章

  1. CDN边缘节点容器调度实践(上)

    又拍云容器云是基于 Docker 的分布式计算资源网,节点分散在全国各地及海外,提供电信.联通.移动和多线网络,融合微服务.DevOps 理念,满足精益开发.运维一体化,大幅降低分布式计算资源构建复杂 ...

  2. 边缘节点 如何判断CDN的预热任务是否执行完成刷新 路由追踪 近期最少使用算法

    阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络.阿里云CDN分担源站压力,避免网络拥塞, ...

  3. CDN 边缘规则,三秒部署、支持定制、即时生效,多种规则覆盖常用业务场景

    2017年的最后一周,又拍云进行了一次重要升级,将自定义 Rewrite 升级为"边缘规则".互联网应用场景的日益多样化,简单.方便.快速的根据不同应用场景实现不同的功能变得越来越 ...

  4. CDN之多边缘节点负载均衡--学习笔记

    一.剧情 剧情是这样的,本次的多边缘节点负载均衡实验,1个LVS四层负载均衡集群和1个Nginx为反向代理的七层负载均衡集群,由Bind dns解析作为 主负载均衡服务器,调度两个集群,中间层有一台W ...

  5. Kubernetes+Docker+Istio 容器云实践

    随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求.近年来,互联网.移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于Kubernetes+Docker的容器云 ...

  6. 边缘节点服务ENS重磅升级 阿里云首次定义“边缘云计算”概念层层深入

    随着5G.物联网时代的到来以及云计算应用的逐渐增加,传统集中式的云计算技术已经无法满足终端侧“大连接,低时延,大带宽”的需求.结合边缘计算的概念,云计算将必然发展到下一个技术阶段,也就是将云计算的能力 ...

  7. 国内首个全域边缘节点服务发布,阿里云助力企业把握5G机遇

    7月24日,阿里云峰会开发者大会在上海世博中心举办.作为2019年首场最受瞩目的云计算开发者大会,阿里云携一众云计算技术大牛与开发者面对面,探讨各自领域的技术干货与前沿趋势.同时,也发布了多项重大重磅 ...

  8. 《CDN 之我见》原理篇——CDN的由来与调度

    CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术.它能够有效解决网络带宽小.用户访问量大.网点分布不均等问题. 为了让大家更全面的了解 ...

  9. 大数据分析的下一代架构--IOTA架构设计实践[下]

    大数据分析的下一代架构--IOTA架构设计实践[下] 原创置顶 代立冬 发布于2018-12-31 20:59:53 阅读数 2151  收藏 展开 IOTA架构提出背景 大数据3.0时代以前,Lam ...

随机推荐

  1. MFC-注册热键

    0.测试环境 VS2015专业版,基于对话框的MFC程序, 例子地址:http://pan.baidu.com/s/1qX9IRec 1.MFC工程设置 类向导->消息->WM_HOTKE ...

  2. hbase 性能优化 (转载)

    一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...

  3. windows部署Apollo

    前言 配置中心伴随着这几年分布式系统演变和微服务架构的兴起,已经成为必不可少的需求之一.试下一下如果哪天公司的所有应用服务,从公司服务器迁移到云服务,成千上万的配置,修改起来是多么耗时费劲的事(我们公 ...

  4. 查看Android应用包名、Activity的几个方法

    一.有源码情况 直接打开AndroidManifest.xml文件,找到包含android.intent.action.MAIN和android.intent.category.LAUNCHER对应的 ...

  5. [OC] NSTimer

    注意NSTimer的销毁 NSTimer在初始化之后,加入RunLoop会导致当前界面被强引用, 所以不会执行dealloc, 需要在合适在逻辑上进行NSTimer的销毁 [_timer invali ...

  6. MVC简单的增删改查

    最近的学习了一下mvc,现在做一个mvc的CRUD例子. 1.创建实体模型 2.创建一个UserInfo的控制器 3.查询数据 code public IList<UserInfo> us ...

  7. Python3系列__01Python安装

    Python和Java一样是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.所以你在一个平台上面上写的代码在另一个平台仍能正常运行. 要学习Python编程,你需要做的就 ...

  8. JavaScript(九)

    内置对象 1.document document.referrer //获取上一个跳转页面的地址(需要服务器环境) 2.location window.location.href //获取或者重定ur ...

  9. C\C++ 内存对齐现象

    前几天一个在自学C语言的小伙伴问了我个问题,C语言结构体储存所占空间为啥和自己预测的不一样.看一下下面这一段代码: struct node{ int num; char ch; }a; printf( ...

  10. jquery中$.each()的用法

    each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象.数组的属性值并进行处理.jQuery和jQuery对象都实 现了该方法,对于jQuery对象,只是把each方法简单 ...