目录
- 前言
- 猛犸系统特点
- 猛犸抽象分层
- 猛犸原型
- 猛犸如何和已知应用交互
- 猛犸如何提供高可用存储支持组件
- 猛犸打通应用集群和大数据集群
前言
- 资源管理/调度系统。资源模型取代传统的服务器模型。
- 容器技术。
- 单机上混跑任务互不干扰
- 应用与服务器互不依赖
猛犸的特点
2.猛犸简化大数据平台部署,加快产品落地,真正撸起袖子即可快速构建平台进行数据处理
- 系统组件(Framework),用来增强系统的功能。典型如动态扩容等功能。
- 应用程序(APP),实际业务系统
5.基于资源模型的部署组件允许你上传一个.image文件(Docker镜像),指定资源占用量以及实例数即可完成所有部署
6.猛犸解决容器跨机器通讯问题
7.猛犸提供的应用自我修复机制可以使得应用总是运行在用户期望的状态,譬如维持恒定的用户规定的实例数,资源要求等。
8.猛犸自身是极度易于部署,不依赖单机操作系统或者本地库
9.猛犸的交互应该是区分人机交互和系统之间交互。人机交互应当提供一个友好的web界面,而系统之间交互应该提供一个良好的沟通API.
猛犸抽象分层

1.交互层
- 外部服务调用,类似单机的IP/Port定位,分布式操作系统通过封装 Nginx/Haproxy 实现。
- 人机交互界面,类似单机的Shell终端,通过Web化界面实现。
2.应用层
- 支持.tar.gz, .image, .git 三种文件的安装。在分布式系统中,用户看到的一切,要么是APP,要么是Framework,他们都可以以规范的方式安装进分布式系统。APP就是属于应用层。而Framework则属于系统级组件,对应用层提供各种隐形功能支持。
- 以Docker为进程模型进行运行。基于服务器的传统部署组件(Framework) 允许采用其他进程模型,譬如裸机上直接运行一个Java程序。
- 进程支持异步或者同步同步通讯,通过系统封装的Zookeeper API 来实现协调。
3.系统服务层
- 部署:基于服务器的传统部署组件(基于内核分布式Shell引擎开发的Framework);基于资源的部署组件(基于内核Yarn开发的Framework)
- 应用稳定性支持,基于资源的部署可保证服务实例的数量,保持对所需资源的占用。
- 存储稳定性支持。实现实现MySQL,Redis这种单Master的高可用性,保证存储的稳定。而类似HBase,Cassandra这些服务本身已经实现了高可用性,不需要分布式系统的系统服务来支撑。
- 对应用提供依赖性API.譬如安装Hadoop时,需要以来Zookeeper,安装程序可直接调用系统查询是否有可以使用Zookeeper.
4.文件系统
- HDFS分布式文件系统
- MySQL高可用支持事务的存储引擎
- Redis高可用缓存组件
- HBase高可用KV存储组件
5.内核层(Borg)
- 集成分布式Shell引擎
- 集成Yarn资源管理引擎

猛犸原型系统

- ResourceManager.资源模型的管理和调度中心。基于Yarn封装的一套组件。
- CommandEngine,命令系统,服务器模型的中枢模块。该模块通过Akka可以向Slave的ShellEngine发布任何Shell脚本指令。
- APPEngine,APP部署支持,APP信息存储查询等。提供了一系列功能方便管理Slave以及和Web进行交互。譬如安装部署解析引擎可根据配置为特定应生成安装页面,手机安装信息。
- NodeManager. 对特定服务器进行资源管理的核心模块。该模块 基于Yarn封装。
- ShellEngine. 在Slave上执行各种Shell脚本。支持阻塞,异步模式。
- ConfEngine. 如果系统发现用户安装了Zookeeper,则会请求确认开启,从而支持配置文件管理。配合Web端,可以对各个系统的文件进行可视化管理,比如/etc/hosts文件等。
调用者 | 服务者 | 协议 |
Web Console | Master | HTTP |
CommandEngine | ShellEngine | AKKA |
ResourceManager | NodeManager | HADOOP |
- 上传安装包
- 选择服务器
- 收集参数
- 生成配置文件
- 分发安装包
- 安装
- 进入管理界面
对于不是很复杂的系统,比如flume之类的,则只需要在根目录里按格式要求放一个两三行的脚本,分布式系统便能够完成安装,启动,关闭,监控进程存活等功能。
该模式下,所有资源由Yarn内核进行动态分配管理。我们提供了一个DynamicDeploy的系统组件(猛犸单独开发的一个组件,用户通过Web Console上传后自动便会开启该功能)。
- 纯Java程序(.tar.gz后缀文件)
- 容器(.image后缀文件)
- DynamicDeploy向ResourceManager模块提交资源资源申请,ResourceManager启动ApplicationMaster
- ApplicationMaster启动DynamicDeploy的Driver(Master)
- ApplicationMaster向Resource Manager申请资源,Resource Manager根据集群资源情况为其分配YARN Container,
- 这些Container会连接Driver。Driver发布启动指令给各个Container.Container会执行download image,load image,run image 三部分指令
- run指令会自动添加cpu,内存,磁盘配额。并且给Docker的容器配置一个随机端口
- Container会将Docker容器的IP,端口上报给Driver,Driver会将这些发送给APPEngine.
- APPEngine会把通知发送给LoadBalance 以及注册中心(Zookeeper)
- 完成部署
- 如果有服务实例当掉,DynamicDeploy会检测到,并且在找到合适的服务器重新启动该实例。也就是DynamicDeploy会保证实例的个数稳定不变。
- DynamicDeploy 对自身提供 FailOver机制
- 如果是Driver挂掉,并不会影响正在运行的服务。直到分布式系统进行多次尝试仍然无法启动DynamicDeploy Driver,才会出现服务Fail的情况。
- 如果是伴生进程挂掉,则猛犸有两套机制保证用户的进程不会成为‘没人管’的进程。首先伴生进程如果不是JVM crash掉了,会自动将用户进程杀掉。Driver然后会在其他服务器重新调度,保证实例数不变。如果是JVM crash掉来不及做清理工作,Driver会监听心跳,一定时间内会将该信息发布给猛犸,猛犸会通过分布式Shell引擎来完成最后的清理工作。
分布式操作系统如何现存应用进行交互
所谓哑应用指的是无法和分布式系统直接进行交互,分布式系统也仅仅透过容器能进行生命周期的控制,比如关闭或者开启的应用。典型的比如MySQL,Nginx等这些基础应用。他们一般有自己特有的交互方式,譬如命令行或者socket协议或者HTTP协议。
因为有了哑应用的存在,操作系统为了能够和这些应用交互,所以有了伴生组件的存在。这些伴生组件和哑应用具有相同的生命周期。伴生组件其实是哑应用的Proxy,从而使得哑应用可以和分布式系统进行交流。典型的比如,某个服务被关停后,该事件会被操作系统获知,操作系统会将该事件发送给Nginx的伴生组件,伴生组件转化为Nginx能够识别的指令,将停止的服务从Nginx的ProxyBackend列表中剔除。
- 基于资源的部署方式,需要你将应用容器化,或者如果你的应用是一个Java程序,则能够接受分布式系统提供的端口作为自己对外服务的端口,也可以被调度,然而,存在的另外一个风险是,对CPU的控制会比较困难。
- 基于传统服务器模式的部署方式,则并不强制要求容器化,我们提供封装了一套完善的Shell脚本引擎,你只要填写两到三行指令就可以完成完成分布式系统对对应应用的生命周期管理。对应用没有任何改动。然而,你需要自己解决应用本身对裸服务器的环境以来,譬如某些本地库。
高可用存储支持组件
- 这些存储以组件的形态供用户安装
- 这些组件安装完成后,自动会获得高可用支持
这里,以MySQL为例,在分布式操作系统中是如何实现高可用的呢?
分布式操作系统中,MySQL 以容器状态运行,文件通过Volumn挂载在实际磁盘中,实现单Master多Slave结构,我们称之为一个Cluster,系统允许多个Cluster存在。值得注意的是,MySQL这些信息都会在系统的注册表中找到。
我们开发了一套伴生组件,该组件是专门监控这种单Master节点类型的系统,一旦安装了MySQL,系统会自动启用该组件,定时监控Master的可用性,一旦发现Master不可以用,则找到数据最新的Slave,提升为Master,并且变更注册表信息(如IP,端口等),所有使用该MySQL的服务组件都会得到通知,从而实现动态变更。
这里有一个可能的问题是,如果某些应用并不接受这种变更通知。最透明的方式将会是使用IP漂移技术。如果并不希望使用类似IP漂移技术,则一个比较直观的方式,通过某种途径,修改使用了该MySQL的应用的配置文件(这个是难点,如何修改?),并且将该重启该应用(cluster,可以rolling restart),到现阶段位置,目前这套机制并没实现。同理,Redis Cluster也是通过相同的方式实现高可用。