统一的,高效的分布式系统诞生的条件已经成熟:
猛犸则是基于这些组件之上构建的分布式,大数据/传统应用部署运维平台。
猛犸提供了一个一致统一的大数据以及相关应用的部署,运维平台。
猛犸是可编程的。意味着你可以开发一套组件增强系统的功能,然后进行安装而不需要修改系统的内核。
猛犸简化大数据平台部署,加快产品落地,真正撸起袖子即可快速构建平台进行数据处理
猛犸统一了应用和组件的概念,使用者只需要了解两类应用:
支持App Store. 所有应用都是APP,部署过程就是APP的安装过程,和现在的单机系统保持了高度一致。即使没接触过猛犸的人也能轻而易举的部署一个可以服务成千上万人的业务系统。
基于资源模型的部署组件允许你上传一个.image文件(Docker镜像),指定资源占用量以及实例数即可完成所有部署
猛犸解决容器跨机器通讯问题
猛犸提供的应用自我修复机制可以使得应用总是运行在用户期望的状态,譬如维持恒定的用户规定的实例数,资源要求等。
猛犸自身是极度易于部署,不依赖单机操作系统或者本地库
猛犸的交互应该是区分人机交互和系统之间交互。人机交互应当提供一个友好的web界面,而系统之间交互应该提供一个良好的沟通API.
10.猛犸也支持通过分布式Shell引擎支持传统的服务器模式。并且资源模型和传统的服务器模式同时并存,解决各自擅长的问题
猛犸由5层构成,类似传统的单机操作系统:
交互层
应用层
系统服务层
文件系统
内核层(Borg)
现在,单机和分布式操作系统结构得到了完美统一,下面是单机操作系统:
从架构图中可以看到,这是一个典型的master-salve结构。
Master 进程包含三个大的模块:
Slave进程:
Web Console:
猛犸的默认交互端。通过该Console可以进行应用安装,管理等。
通讯协议:
调用者 | 服务者 | 协议 |
---|---|---|
Web Console | Master | HTTP |
CommandEngine | ShellEngine | AKKA |
ResourceManager | NodeManager | HADOOP RPC |
猛犸系统透过APPEngine支持两种应用/资源管理模式:
服务器模型。 也就是传统的‘指定服务器’部署模式。APPEngine默认透过CommandEngine做这种支持。基本步骤为:
对于不是很复杂的系统,比如flume之类的,则只需要在根目录里按格式要求放一个两三行的脚本,分布式系统便能够完成安装,启动,关闭,监控进程存活等功能。
而如果像Hadoop这么复杂的应用,目前猛犸直接默认提供支持,从官方下载tar.gz包上传即可安装。Hadoop/Zookeeper的安装已经简化到只需要选择机器即可完成一个任意规模的集群。后续可以通过配置管理系统重新编辑相应的配置文件从而优化集群性能。
如果用户开发的应用非常复杂,而猛犸默认的安装规则不足以满足要求的话,则可在安装包的根目录放一个json描述文件,系统会根据该json描述文件自动调整页面中的安装流程。不会对原有程序有侵入。
安装完之后会自动通知LoadBalance 以及注册中心(Zookeeper).
这种方式适合带有存储类的应用。譬如搜索,MySQL,HDFS等。
应用的安装信息并不会存储在master上,而是存储在每台Slave上。由Slave通过心跳上报到Master端。静态模型中,Master是完全无状态的。
安装成功后,透过Web Console可对应用进行生命周期管理,譬如关闭,开启等。同时对每个应用,用户可以在Web Console中浏览整个目录。
对于更新操作,用户可以在界面先停一部分服务,然后对这些服务重新走安装程序。接着按同样的方式对第二批服务进行操作,直到所有服务都是最新版本的。
该模式下,所有资源由Yarn内核进行动态分配管理。我们提供了一个DynamicDeploy的系统组件(猛犸单独开发的一个组件,用户通过Web Console上传后自动便会开启该功能)。
如果用户在部署过程中选择动态部署,那么用户有两种选择:
猛犸在该种模式下,对容器没有任何要求,只要能Run起来就行。而如果是Java程序,则该程序启动过程中,必须使用分布式系统给予的端口,而不能自定义端口。
当用部署时,AppEngine会将安装包提交给DynamicDeploy,DynamicDeploy会按下面的流程进行处理:
部署完成后,DynamicDeploy会保证:
更新操作中,灰度更新变得很简单,在Web Console中重新部署一套服务,该服务会根据LoadBalance策略,或者和原来的服务同时对外提供,或者保证只有旧的服务被关停后新的服务才能对外提供服务。
猛犸原型目前已经实现了分布式系统特性中的绝大部分。在Agent内核中同时支持分布式Shell引擎以及Yarn内核使得他们可以进行互补。
在软件行业,兼容现存的应用显得尤为重要,是决定一个平台系统能够存活的关键指标。容器技术使得所有应用可以被操作系统运行起来。并且可以吻合Yarn内核对资源控制的要求。但是我们可能需要对被容器包括起来应用更细致的控制。
我们先来看两个概念。
所谓哑应用指的是无法和分布式系统直接进行交互,分布式系统也仅仅透过容器能进行生命周期的控制,比如关闭或者开启的应用。典型的比如MySQL,Nginx等这些基础应用。他们一般有自己特有的交互方式,譬如命令行或者socket协议或者HTTP协议。
因为有了哑应用的存在,操作系统为了能够和这些应用交互,所以有了伴生组件的存在。这些伴生组件和哑应用具有相同的生命周期。伴生组件其实是哑应用的Proxy,从而使得哑应用可以和分布式系统进行交流。典型的比如,某个服务被关停后,该事件会被操作系统获知,操作系统会将该事件发送给Nginx的伴生组件,伴生组件转化为Nginx能够识别的指令,将停止的服务从Nginx的ProxyBackend列表中剔除。
如果我们只需要对应用进行生命周期控制,而你的应用是基于容器的,那么我们只要分布式系统默认提供的伴生组件即可完成大部分功能需求。
猛犸中的DynamicDeploy是一个基于Yarn调度容器的Framework,也就是说属于系统组件。而DynamicDeploy的Slave同时也属于Docker的伴生组件,可以对Docker容器进行交互。指令发给DynamicDeploy的Master,Master将其转发给Slave,Slave转化成Docker能够识别的内容进行操作。
同时对于LoaderBalance,猛犸默认提供了MammuthusNginx伴生对象。
这些组件都是以标准的方式进行安装即可。
在分布式操作系统中,可提供分布式文件系统(HDFS),也可以提供‘硬件级别’的磁盘,还有高层次支持事务的MySQL集群,高速缓存Redis集群,优秀的KeyValue存储 HBase等。对于这些的支持,我们正在开发相应的组件进行支持。
在分布式系统中可以保证:
这里,以MySQL为例,在分布式操作系统中是如何实现高可用的呢?
分布式操作系统中,MySQL 以容器状态运行,文件通过Volumn挂载在实际磁盘中,实现单Master多Slave结构,我们称之为一个Cluster,系统允许多个Cluster存在。
值得注意的是,MySQL这些信息都会在系统的注册表中找到。
我们开发了一套伴生组件,该组件是专门监控这种单Master节点类型的系统,一旦安装了MySQL,系统会自动启用该组件,定时监控Master的可用性,一旦发现Master不可以用,则找到数据最新的Slave,提升为Master,并且变更注册表信息(如IP,端口等),所有使用该MySQL的服务组件都会得到通知,从而实现动态变更。
这里有一个可能的问题是,如果某些应用并不接受这种变更通知。最透明的方式将会是使用IP漂移技术。
如果并不希望使用类似IP漂移技术,则一个比较直观的方式,通过某种途径,修改使用了该MySQL的应用的配置文件(这个是难点,如何修改?),并且将该重启该应用(cluster,可以rolling restart),到现阶段位置,目前这套机制并没实现。
同理,Redis Cluster也是通过相同的方式实现高可用。
在猛犸(也就是您正在看的系统)里,所有资源包括大数据集群和应用服务器集群都是被统一管理的(你也可以安装两套猛犸单独管理),所以其实大数据集群资源和应用集群资源是可以互相出让的。比如晚上应用使用的少,但是大数据集群非常繁忙,猛犸可以把部分计算资源让出来,给数据集群。反之白天则相反。目前大部分公司部署上都是独立的,大数据是大数据的机器,应用是应用的机器,而如果统一使用猛犸,可以打破这种界限。