伴随着Docker技术的兴起,以及容器集群管理平台Mesos、Kubernetes、Swarm、Rancher等的大行其道,仿佛PaaS平台及其相关技术一下进入了黄金时期,各种各样的技术组合,各种各样的技术验证,以及伴随着容器相关的创业公司布道,仿佛只要有了PaaS平台及其相关的技术,就能解决一切的企业IT问题。但是,企业IT,尤其是非互联网传统企业,PaaS平台的构建与业务上云是一个长期的过程,绝不是一个Docker+kubernetes/Mesos/Swarm构建完以后就能完成的,IaaS年代是这样,PaaS年代也是这样。
在互联网公司或者自研发型的应用,开发环境与部署运行环境非常的类似,这也是Docker或者容器相关技术在应用上的一个很大的优势(比如构建开发、测试、部署的DevOps流水线),但是在传统企业便不一定能行得通,比如某个企业的IT应用开发维护是外包的,标准软件需要采购、应用开发需要在应用开发商完成、硬件是另外的硬件提供商,到货后需要硬件系统集成、标准软件部署、应用开发部署调试,需要很多供货商来完成,往往以项目经理统筹完成,很难由一套DevOps之类的平台来解决所有问题。
那么传统企业PaaS平台设计需要什么样的功能?上云时又需要进行如何改造?这是本文探讨的重点。
大家对这种架构耳熟能详,但也请做云计算或者容器技术的同事不要对这种架构嗤之以鼻,因为这种架构也包含很多对我们有学习借鉴意义的技术模块:
传统企业这种架构统治了企业IT数十年之久,在大的行业,通常以商用中间件、商用DB、小型机、SAN存储部署。这种架构存在扩展性不足的问题,但是在传统企业架构中大量存在。
我们部署一个IT系统,最终的目的是为了解决传统的问题,所谓把线下业务线上化,这些业务最终的服务对象是数据,而数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。
当然还有其他的业务类型,比如银行或者运营商的每月出账系统,这种系统为也是一种批处理系统,但是实时性很强,跟Hadoop MR所谓的批处理不是一个概念,也不在一个层级。这种应用我们暂时不考虑。
OLTP,也叫联机事务处理(Online Transaction Processing)系统,表示事务性非常高的系统,一般都是高可用的在线系统,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。典型的OLTP系统有客户关系管理系统、电子商务系统、银行、证券等。
要求:一致性、高可用性。
OLAP,也叫联机分析处理(Online Analytical Processing)系统,有的时候也叫决策支持系统,就是我们说的数据仓库。在这样的系统中,语句的执行量不是考核标准,因为一条语句的执行时间可能会非常长,读取的数据也非常多。所以,在这样的系统中,考核的标准往往是磁盘子系统的吞吐量(带宽),如能达到多少MB/s的流量。
下面我们分别分析一下这两类应用的云化需求与云化的分析。
注意:这些要求分析与要求是在Docker与各类容器管理平台火起来之前总结与做的,不是依据Docker或者容器相关技术的要求做的。所以,对我们跳出容器的惯性思维,构建一个适合传统企业的PaaS云平台有很强的指导意义。
云化关键点1:系统弹性伸缩
通过应用与数据分离和集群化部署,实现系统快速扩容、处理能力灵活水平线性扩展、故障自动隔离。对于独立的应用主机可以进行灵活弹性伸缩。
弹性伸缩特点:
云化关键点2:应用集群化部署
将紧密耦合的大应用模块化拆分为多个模块化小应用,通过资源池提供系统资源的整体利用率,并将拆分后的子模块部署于资源池(后来我们搞Docker的称之为微服务化)。当硬件资源实施池化后,才具备了支撑应用的弹性伸缩,实现硬件的按需分配的基本需求,充分提高资源利用率。
云化关键点3:通过数据分级分类实现应用与数据分离
根据数据实时性、重要性、敏感性等因素,将数据分成数个级别,各个级别的数据对系统的作用、采用存储、保护方式也都有所不同。
通过对应用提供数据的透明访问,屏蔽数据的位置差异、数据分布差异、数据存储等差异:
云化关键点4:合理规划实现数据分布式部署
对不同业务的数据、不同类型的数据进行有效规划部署。通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现数据分布存储,通过路由规则路由访问特定的数据库。
数据库拆分方式包括:
拆分以后,带来的问题,需要做到:对外提供统一访问,对应用屏蔽数据访问复杂度。数据访问层提供数据互访能力,拆分访问合并返回。
所以需要构建统一数据访问引擎,或者数据路由层(Data layer层)。开源的比如有Hibernate Shards、Ibatis-Sharding、淘宝TDDL等。
云化关键点5:数据平台化
数据平台化是指通过应用架构和数据架构的重新梳理、规划与调整,将业务处理中的业务数据和状态数据与应用分离,实现应用的轻量化、无状态;构建统一的数据访问层,实现数据的共享访问。数据平台化是数据处理水平线性扩展的前提和基础。
数据平台化特点:
首先看一下传统的数据仓库典型架构:
这种架构以处理结构化数据为主,基本部署于Oracle、小型机、SAN存储之上,扩展性不足,难以处理海量数据。大数据处理技术的兴起让这类应用的云化找到了思路。云化时总体推荐混搭架构,即采用多种技术架构建设大数据中心:
1. 垂直混搭架构:
这种架构比较容易部署,但会形成多个相互独立的信息孤岛;未来缺乏可行的系统演进路;
2. 水平混搭架构:
OLAP云化关键点1:数据计算引擎开源化
M/R计算引擎:用HDFS文件保证每一步计算结果,避免硬件故障导致重头执行。
Spark计算引擎:RDD是分布式内存的抽象。
OLAP云化建设关键点2:数据集市云化建设
建设现状:传统小机+Oracle数据库和新建的MPP数据库两种建设模式。
数据云平台完成所有的后台计算。
OLAP云化关键点3:数据ETL云化建设
我们提到了传统企业中两类核心的应用,并且在Docker流行之前便规划了一些云化的关键点,并形成了PaaS平台,使之运行于IaaS平台与Hadoop YARN集群之上。
基于此架构有以下几个主要问题:
Docker及其相关技术兴起之后,我们基于容器的相关生态圈技术,构建了新一代PaaS平台。
使用容器+容器镜像管理替代服务目录管理+虚拟机模板管理。
在Instance PaaS(iPaaS)平台上除了基于Kubernetes的容器管理、镜像管理、应用管理等功能,还构建了如下子系统:
整体的PaaS平台构建基于Kubernetes、Hadoop、Spark on Mesos,构建完整的DCOS平台。
需要说明的是,在传统企业在云平台还需要对接大量的系统,比如ITIL、4A/3A、人力资源系统、审计系统等,这些系统与云平台的接口集成不在本次讨论范围内。
下面说一下基于以上的PaaS平台对传统应用云化关键点的解决。
针对OLTP类应用云化的5个关键点的解决:
OLAP云化的3个关键点的解决:
这种调度实际上是两级的调度框架,Mesos本身只管资源(主要是CPU与MEM),提供offer给上层的调度框架使用。一级调度即Mesos层有两种调度模式:
粗粒度存在资源还是不能完全共享的问题,因此仍然有资源浪费的问题,细粒度模式可以改变这种问题,但是又带来新的问题:
目前多个框架之间每个都有自己的用户管理模式,默认情况下,如果多个框架之间有交叉使用,需要在多个框架之间租户互相打通,涉及到Mesos、Hadoop、Kubernetes的账号打通问题,需要开发独立的账户中心,并且完成同步。
最后讨论一下应用上云时的考虑点,并给出一个例子:
这里给出一个应用上云部署的例子:
上图左边是某传统企业电商应用最初架构,Web部署于一台高配置x86服务器、APP部署于一台中端小型机、DB部署于一台中端小型机,右边是初步进行了改造后的架构,即迁移到PaaS平台之前应用已经做了模块化与集群化的初步改造:
该应用里面还用到了Kafka,用来做数据总线,也采取了集群化部署。
针对目前的现状,如上图,应用迁移到PaaS平台需要做三方面的工作:
剩余一个问题需要探讨,Redis集群、ZooKeeper集群、Kafka集群(用作消息总线)要不要做PaaS化?如何做?
首先回答一个问题,Redis、Zookeeper、Kafka等集群PaaS化(容器化)的难点在哪儿?
主要是这些集群节点之间的互相通信与数据传输即东西向流量,要求这些节点之间的IP配置需要固定IP,而且重新启动以后相应的配置信息不能改变。容器自身的启动、网络配置比较动态化,对需要固定的集群配置而言是一个挑战。
比如大多数的PaaS平台提供单个实例的Redis缓存服务不是问题,但是提供任意配置的Redis集群便不支持。我们经过前期的测试,实现了容器平台下的此类应用的集群化部署,以ZooKeeper为例:
ZooKeeper自身部署要求:
解决方案(基于Kubernetes):
最后,需要说明的是,应用上云后一个很重要因素,PaaS平台(Docker为基础的构建),稳定性与可靠性也是至关重要的,我们在部署迁移应用时,每次都会针对应用做较为详细的测试,测试案例包括:
等等。这些测试方面供大家参考,具体测试方法与步骤可针对应用自行设计,不在这里具体分享。
Q:在你的新一代PaaS平台中,我怎么对公司的很多个不同的应用做不同的集群,有些集群偏向于大量的IO占用,有些集群偏向于大量的网络占用,有些集群偏向于大量的内存占用,并且启用的集群间还有通信和交互,针对这些不均衡现象该如何处理?
A:所以PaaS平台硬件资源会针对不同应用去做区分,在企业私有云建设时,需要对应用进行梳理,将不同的应用分类,底层采取相应集群支撑,比如计算密集型、IO密集型等,同时综合考虑波峰波谷与业务特性进行配置。
Q:公司有很多Web系统,每一个Web系统都有自己的存储、数据库,所以如果融入PaaS平台的话,首先第一点软硬件问题如何做到全部满足,其次就是就算把我的DB层整合迁徙到你的PaaS的DB层,我是不是还要做其它方面的投入,比如开发成本等等,还有就是DB的兼容性是不是会有问题?
A:Web层我们推荐做无状态化,且要做应用与数据分离,session信息集中存放。DB迁移到PaaS层是一个比较慎重的过程,PaaS层优先考虑开源数据库。如果原先是MySQL基于PaaS平台也提供的MySQL数据库服务,那么开发成本基本比较小,只需考虑版本问题。
Q:请问MySQL部署数据应用能承载多大数据量,响应速度如何?
A:我们一个项目中,采用读写分离的MySQL架构,几千万的数据表,及时查询没问题,这也要看硬件配置与数据索引的建立等。
Q:有些传统公司,有些软件设备是以序列号安装使用的,所以这一块融入PaaS平台是不是不太可能?
A:比较困难,另外还有一个问题是License限制的问题,在弹性架构中也比较难。
Q:请问架构改造会不会导致应用要重新开发?
A:会,从IOE架构到x86架构,从x86物理机到虚拟机到Docker,应用需要以越来越小的模块化分布式部署,也就是说逐步向微服务化过渡。
Q:为什么Kubernetes和Mesos要一起用呢,考虑点在哪里?
A:针对单个应用Docker化,我们开始的选型定位在Kubernetes,主要考虑了POD的应用场景更类似虚拟机,另外Kubernetes的模块比较丰富,像负载均衡、服务发现等已经成熟,后来用Mesos是因为需要把大数据之类的应用进行整合。需要Kubernetes/Spark on Mesos。
Q:开发周期过长或者客户开发能力弱会导致整个架构流产 有配套的应用改造方案吗?
A:对传统企业而言,一开始就搭建一个大而全PaaS方案是不现实的,我们推荐从某一个典型应用做起。我们针对交易性应用、分布式应用、批处理应用等应用都有配套改造方案。
Q:Mesos使用集中式存储和分布式存储效率上有什么不同吗?
A:这个看应用,集中式存储在集群中应用时,如果针对单一与应用划分Volume,性能会好一些,如果是分布式应用,比如MR类的应用,分布式存储反而会好。
Q:容器弹性伸缩策略具体怎么考虑的,CPU?
A:CPU、内存、IO、用户连接数等都可以作为弹性伸缩的策略依据。