Swan1.0发布,功能、测试、Demo一个都不能少丨数人云Mesos开源调度器

关于Swan

Markdown

数人云Swan是基于Mesos实现的开源应用调度框架,帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。

2016.11.08,继数人云容器管理面板Crane后,数人云Mesos调度器Swan正式开源;

2017.06.30,经过半年多的打磨,Swan在性能和功能方面有了巨大的提升,我们正式发布Swan 1.0。

功能List

• Application Management

• ScaleUp/ScaleDown

• Rolling update

• Rollback

• Mesos-based health checks

• HA

• Event Subscription

• Compose

• Calico-based IP-Per-Task

• Schedule strategy

重点功能解析

➤➤➤ 1. Application Management 应用管理

应用管理做为Swan的基本功能,也是最重要的功能,本次重构做了进一步提升,精简了数据结构,并通过数据库读写和逻辑优化,使得功能更加稳定。 应用管理主要包括以下几点功能:

1)应用的CRUD
属于应用基本操作,重构对CRUD的逻辑做了很多优化,减少不必要的数据库读写,提升了性能。

2)扩缩
扩缩将之前的两个接口合为了一个,使用上更简单。同时支持了对独立IP的支持,支持扩实例过程中,用户输入IP列表为新增的实例注入单独IP。 IP的管理目前是静态的,由用户输入,后期将做成自动的IPAM,只需用户在发应用时指定一个网络即可,可以做到自动的获取IP,释放IP,避免人为输入IP的麻烦。

扩缩还有一个改进—更清楚的错误信息,如果扩缩失败,用户可明确查看出错原因,提升了用户体验。

3)更新
更新与Marathon有一点不同,可指定需要更新的实例数,且如果考虑灰度,还可传入一个新版本流量占全部流量的百分比,做到控制更新版本实例的流量。

更新失败目前的策略是会停止更新,由用户来选择回滚,主要考虑到用户会比较关心失败的原因,如果自动回滚,错误现场可能会被冲掉。当然,后期计划做成可配置的。

4)回滚
新版回滚作为一个独立接口,且现在回滚时支持要回滚到的版本号,默认如果不传版本ID,可回滚到上一版本,如果传了,则回滚的版本ID指定的版本。这样做的目的是为了更灵活,虽然大部分情况下都是回滚到上一版本,但通过版本号可以实现跨版本回滚。

➤➤➤ 2. Mesos-based health checks 健康检查

实现了基于Mesos的健康检查,Swan最初是自己做的健康检查,后来考虑到性能的问题,决定还是采用Mesos的健康检查。之前基于Mesos的健康检查存在部分Bug和问题,在最新的版本应该已经做了修复,二是基于Mesos的健康检查目前只能配置一个,不支持多个Mesos,现阶段数人云的开发同事也正在对这一功能进行开发。

健康检查目前支持三种:HTTP、 TCP,Command,现在Swan上都能做很好的支持。不过Command还是有个坑,就是Mesos默认会切换到容器的Namespace中执行Command,那么问题来了,如果你要执行的Command在容器镜像中没有那就杯具了,Command检测就会失败。所以这种方式不推荐,最好用HTTP或TCP。

➤➤➤ 3. HA 高可用

目前Swan高可用是基于Zookeeper做Leader选举。之前做过一版基于Raft协议,感觉Hold不住,索性换了Zookeeper,好在Mesos目前也是用Zookeeper,这样反而更简单。

Leader选举的基本原理是多个Swan同时去Zookeeper的一个目录下创建一个自增长序列的临时节点, 该节点在客户端断开一段时间以后会被Zookeeper自动删除。通过比较自增序列,找出序列最小的节点,最小的也就是最先创建的,谁最先创建谁就是Leader,选出Leader之后,其余节点去监控Leader的事件,如果Leader断开,创建的节点会被删除,其他节点在收到该事件时再重新开始Leader选举,依次来完成Leader的选举过程。

目前来说,用此方式做的Leader选举,在Swan这边测试的还是比较稳定,暂时没出现选举失败或出错等BUG。

➤➤➤ 4. Event Subscription 事件机制

事件机制是通过对外暴露一个Event接口来实现。当有客户端连接到该接口后,Swan会实时发送Task的变更事件,新建或状态更新等给客户端。重构主要精简了事件的数据结构。

➤➤➤ 5. Compose 编排

Compose是Swan新增的一个功能。主要是支持Docker Compose V3的编排。Docker Compose V3是Docker借助Swan的分布式特性而实现的分布式编排引擎,Swan借助与自身的DNS功能,也能够解析Compose V3的Spec来做分布式跨主机编排。

➤➤➤ 6. Calico-based IP-Per-Task 基于Calico的独立IP

Calico IP主要是通过Calico来创建网络,然后通过创建应用时选择网络,手动填入Task的IP来实现。内部是通过Docker的--ip参数来传入IP,网络间的通信由Calico来做,而且是一个手动的IPAM。之后可能会考虑做成自动的IPAM,更方便用户的使用。

➤➤➤ 7. Schedule strategy 调度策略

调度策略是这次重构新加入的功能,主要是为了提高调度的灵活性和资源的利用率,加入了Random、Spread、Binpack三种调度策略。

亮点功能

➤➤➤ 调度策略,Swan支持Random、Spread、 Binpack:

Random策略是指发任务时随机选择一台Agent来发,优点是策略简单,无法控制任务的均匀分布,从而是主机的资源使用无法均匀。

Spread是指每次发任务都选择资源剩余最多的Agent中的一个来发,这样可以把Task根据主机资源相对均匀的发到各个Agent上。

Binpack是指每次发任务都选择剩余资源最少的Agnet中的一个来发,这样可以尽量把Task占满一个机器,减少资源碎片的产生,更有利于主机资源的利用,缺点是当机器负载升高时会出现一些问题。

Swan默认是Spread策略,目的是为了均匀的使用主机资源,从而达到性能的最大化。

➤➤➤ PROXY:

PROXY的角色是作为应用的访问入口,为应用的提供一致的访问方式,不论应用后端容器的增删变化。

PROXY支持基于权重对后端容器进行负载均衡流量分配,支持基于访问源IP的会话保持。

PROXY同时支持L4/L7代理,L7代理还允许设置自定义的访问域名。

PROXY允许通过HTTP REST API对代理设置进行热更新,无需重启或Reload。

PROXY对访问进行详细的数据统计, 通过Stats API,可以方便查看全局,应用,容器的累积/实时请求数,进出流量,在线连接等统计数据。

➤➤➤ DNS:

DNS 通过订阅调度器的Event事件, 在内存中维护一份记录数据, 为每个应用提供高效的DNS 记录和SRV记录解析,方便应用之间通过域名进行服务发现。

Swan的未来

➤➤➤ 1. 加强Agent功能

通过加强Agent功能来辅助调度器来做一些事情,比如上报Mesos Agent主机的负载来为调度做选择,或是查询Mesos Agent主机上的容器数等等,具体的功能还在进一步细化中。

➤➤➤ 2. 优化(新加)调度策略

通过Agent查询负载来做基于机器负载的调度策略,或通过Agent查询容器数来做基于容器数的调度策略,或者是实现其他的调度策略。

➤➤➤ 3.KVM支持

通过开发Excutor和调度器结合来创建基于KVM的虚拟主机。

➤➤➤ 4.优化应用管理

进一步优化应用管理的逻辑和策略,来提升Swan应用管理的能力。

性能测试

Swan&Marathon管理不同数量容器实例时CPU的占用对比: Markdown

Swan&Marathon管理不同数量容器实例时内存的占用对比: Markdown

Swan&Marathon管理不同数量容器实例时ZK的CPU占用对比: Markdown

Swan&Marathon管理不同数量容器实例时ZK的内存占用对比: Markdown

Swan&Marathon管理不同数量容器实例时Mesos的CPU占用对比: Markdown

Swan&Marathon管理不同数量容器实例时Mesos的内存占用对比: Markdown

健康状态依据:

Master主机资源:2C 8G

Marathon页面操作3秒响应

Master 主机 CPU < 70% &&Memory < 70% && IO < 70%

注:此为内测数据,仅供参考。

Swan Demo

Build and Start & App Management:

观看地址:点击观看


以上为Swan 1.0 版本更新内容、性能测试及Demo。加小数微信:xiaoshu062 可进一步交流,同时欢迎在Github上Star&Fork。

Github地址:https://github.com/Dataman-Cloud/swan