阅读更多

1顶
0踩

互联网
引用

声明:本文为《从程序员》8月期原创投稿文章,未经许可禁止任何形式的转载。
作者:秦鹏,MaxLeap服务与架构部负责人,负责公司云平台、云应用的后端研发和维护工作。多年分布式、高并发场景的实战经验;目前在分布式存储、缓存、中间件、容器技术、微服务、DevOPS等领域均有涉猎。毕业于上海交通大学,曾供职于SAP,后投身MaxLeap致力于为企业和开发者提供快稳定、可靠的云服务。

摘要:MaxLeap从一个对内的私有云服务平台,发展到对外服务的BaaS平台,其功能覆盖了移动领域开发、运营的完整服务链,近期还会推出PaaS服务。在这个过程中,支撑整个平台的基础架构也在不断演进。本文结合了云平台的业务发展,介绍基础架构演进过程的主要思路、遇到的难题、用到的开源技术和未来的规划。

前言
MaxLeap早期是一家研发、运营移动应用和手机游戏公司,发展过程中积累了很多通用组件。这些组件很大程度帮公司在移动研发过程中节省了时间和成本,有没有可能以云服务的方式开放出去,创造更大的价值?延续这个思路,公司成立了云服务部门,尝试服务的商业化。

从对内提供接口服务到对外提供云服务,经历了三个阶段发展:1.0时代,定位对内服务,为公司研发的几十款应用提供服务端功能,推送、统一用户管理等API接口,可以说是非常普通的接口服务;2.0时代,定位对外服务,除了支撑公司的移动研发以外,同时对外开放服务,提供更多的功能接口,也参考了行业的通用做法,形成了针对移动研发加速和提高运营效率的BaaS云平台;3.0时代,定位基础研发平台,工具链逐渐完整,从研发、上线、运维到运营,提供应用管理、支付、IM、推送等SaaS功能,也提供托管、发布、监控、日志等PaaS功能,逐步形成SaaS + PaaS的研发平台。

云服务概念
常见的云服务有几种方式:

1. IaaS(Infrastructure as a Service),基础设施即服务。提供云端的基础设施为主,比如提供主机、存储、网络、CDN、域名解析等功能,知名厂商有阿里云、AWS、Azure等;

2. PaaS(Platform),平台即服务。提供云端的发布、数据库服务、文件存储、缓存服务、容器管理等基础存储和管理组件,自动化了程序的配置、发布、管理,有Heroku、Google App Engine、Force.com等;

3. SaaS(Software as a Service),软件即服务。提供云端的应用服务,ERP、HR、CRM等在线系统,每个账户或者每家公司有独立的数据存储,通过账户进行权限和访问隔离,知名厂商有Salesforce、Successfactor、Zendesk等;

4. BaaS(Backen as a Service),后端即服务,起初专指针对移动端研发提供的云服务,降低移动研发的复杂度,让开发者关注与移动端开发即可。流行的服务有几大类:综合类:Parse、Kinvey;分析类:友盟、TalkingData、神策数据;支付类:Beecloud、Ping++;IM类:环信、网易;消息类:极光、个推等。

我们在2.0时代把自己定位于BaaS,随着功能的不断演进3.0着眼于PaaS和SaaS。

1.0 单应用架构
背景

当时公司有几十款App需要研发和运营,每个应用功能各异,种类包括浏览器、音视频工具、社交工具、清理大师、图片存储类和手游等,门类很多、很杂。如何提高研发效率,实现一套统一的研发、管理和运营体系,是当时的主要诉求。对主要功能进行梳理之后发现,各类应用共同需要依赖的组件包括,用户体系、云参数体系、推送服务、数据存储和广告服务。



图1 1.0业务模型

需求基本明确后,目标是快速上线,然后小版本迭代。

设计

当时4个后端研发人员,Java出身,人少但是技术精干。结合团队情况和产品需求,决定采用如下架构,简单但给力。



图2 1.0架构

典型的Web应用架构方式,使用Nginx做反向代理和负载均衡,后面跟了多个JVM实例。每个JVM实例由Jetty作为应用服务器,提供REST接口,服务层实现具体的逻辑。DAL层对DB和缓存进行封装,提供统一的数据访问接口。Redis作为缓存方案,支持多个shard水平扩容,TPS高、性能好。Cassandra作为数据存储引擎,无中心、可水平扩展、易维护,没有专门的运维人员,对研发人员非常友好,由于没有事务场景,NoSQL完全满足当时的需求。RabbitMQ作为消息中间件方案,不同进程间通信,支持HA,支持持久化。Zookeeper用于存储基础配置信息。

小结

这种简单的设计,有效支持了公司几十款应用的运行,日访问量达数十亿级别。统一后台基础服务和移动端SDK后,提高了移动应用的研发和上线速度,研发了用户管理、推送这些基础功能,在移动端几行代码搞定。通过控制台,能有效管理应用和配置信息。其实对于多数十多个研发人员的公司来讲,这样的单应用架构性价比最高,解决商业上的问题才是关键。

也有不少需要改进的地方,Cassandra作为业务数据的存储,查询非常不灵活,依赖设计时对row key和composit key的精确把握,扩展非常困难,再加上对翻页、排序等支持有限,在数据层做了很多特殊处理。整个系统没有脱单,Redis、Nginx还有单点问题,脱单是高可用系统中首要需要解决的问题。所有服务部署在一起,出问题时相互影响,项目耦合度高,扩展困难。同时,开发效率低,发布新功能时相互依赖等,这些都是单用架构设计最明显的问题。

2.0 服务化架构
背景

随着业务不断发展以及新的产品定位,单应用架构的弊端不断暴露出来,要求我们在新的规划中,重新设计整个后端架构。

新的需求如下:
  • 定位公有云,服务标准化;
  • 多租户支持,用户数据需要隔离,每个公司都有自己的后台管理和账号管理,不同工作人员区分权限职责,允许同时有多款应用,应用在逻辑上相互独立,每个应用可以使用所有服务;
  • 更灵活的存储和查询服务;
  • 提供基础数据分析功能,提供代码托管等更多云服务。




图4 2.0云服务架构

网络,最外层增加了ELB,IP地址直接暴露在公网是非常危险的方式,通过DNS配置CNAME指向域名,降低了被DDOS的风险,提高了Nginx的可用性。ELB本身会在访问增加时,自动伸缩,配合IaaS厂商提供的AutoScalling服务,可以抵御多数DDOS攻击。通过Nginx作为反向代理和负载均衡,不同服务指向不同的upstram地址和端口。服务间禁止相互依赖。

容器,每个服务都运行在Docker中,服务之间环境和资源隔离,能够快速迁移和部署,统一了交付和发布流程。每个容器无状态,服务迁移、扩容、宕机等问题迎刃而解,在服务化过程中起到很关键的作用。

数据,NoSQL部分主要依赖MongoDB,Wired Tiger + SSD,由于MongoDB的Schema-less特性,开发者可以根据自己的需求随时调整实体的定义。天生为分布式设计,支持复制集高可用方案,支持多Shard水平扩展。关系型数据库采用MySQL,用于实现支付、订单、配置信息等需要事务支持的业务,我们基于MHA实现MySQL的高可用和读写分离。不同服务所依赖的库必须分离,从数据着手保障用户资源的隔离。

存储/缓存,块数据依赖AWS的S3,权限控制、分桶策略比较实用,可用性有保障;缓存依然使用Redis,为了解决单点问题,对原有版本进行了升级,采用官方的3.0集群方案,支持分片和高可用,当然也有其它方案可选,比如codis等代理的方案。

云计算部分



图5 2.0云分析架构
数据收集部分采用REST + Kafka方式,其中很重要的一部分是DataTransform,用于数据标准化、过滤、流控等用途,基于vert.x实现。

计算部分参考Lambda架构实现,分为Speed Layer、Batch Layer、Serving Layer三层。

Speed Layer,基于Storm实现,引擎监听Kafka中收集到的新数据,把一些对实时性要求高的指标计算完成,写入展示层。Batch Layer,基于Hadoop生态实现,通过开源项目Camus,把Kafka中监听到的数据存储在HDFS中,然后通过HIVE或者M/R的Job,计算各种指标,工作流通过oozie来调度,最终结果也写入展示层,并且覆盖掉实时计算的结果。结果数据根据不同指标,按天、周、月分别存储在Cassandra中,有很高的写速度,无限水平扩展。展示层,数据同时用antlr4j实现了SQL解析,访问Cassandra中的计算结果。

小结

相比较1.0时期,架构上更合理,扩展性、维护性、鲁棒性都有很明显提升。功能上,完成移动应用研发大部分组件(统计分析、支付、IM、社交、在线参数、推送、营销、云数据、云存储、云代码)。应用的研发、上线、运维、运营形成闭环,顺利完成从对内服务到公共BaaS平台的升级。团队上,1-3人一个服务的研发,测试、上线的节奏可以自己把控。

当然,业务在演进,也有新的问题需要去解决。从功能角度,Nginx只能支持静态方式设置反向代理,然后reload,而平台有服务对应的后端服务和端口是有动态调整需求。从架构角度,在相对成熟的系统中,日志、监控这些基础组件需要统一收集、管理、处理。数据访问层、RPC等基础服务也要标准化。

3.0 平台化
背景



图6 3.0业务模型

对于创业公司而言,业务随时会有调整,作为技术人员,需要能够应对这种变化,架构上为这些变化做准备。产品向3.0演进由新的业务需求和架构自身的调整需求共同推动。新的业务需要支撑一个全网营销的SaaS产品线,产品支持配置操作生成App+微信商城+手机网站,以及营销,就是需要本来专注于移动端研发定位的BaaS,向PaaS化和SaaS前进。架构上是基础组件需要进行升级,数据访问层、RPC、日志、监控系统等。于是我们提出一个目标,就是平台化,数据访问的组件以PaaS形式提供给开发者和内部团队,标准化API网关、日志、监控系统。

设计

设计上依然延续稳定、成熟、解决问题的思路。网关服务作为所有请求的入口,稳定、性能、水平扩展是考虑的要素。数据访问层,就像一个项目的大动脉,所有的访问压力、瓶颈、安全问题会在这里汇合,如何构建一条数据访问的高速公路是我们的目标。日志和监控,虽然没有业务系统那么核心,但是关键时刻出现问题需要排查时他们很大程度会影响解决问题的效率,好的监控系统能第一时间把正确的信号通知到正确的人,而烂的监控只会为运维带来困扰。

网关

我们设计网关的初衷是替代掉Nginx,在自研的网关上控制规则转发、主机注册、容器状态检查、负载均衡、服务拒绝、限速等功能。Nginx是非常优秀的一个软件,也满足一部分网关的功能,但是无法满足我们不断进化的需求。

整个网关系统由规则控制组件和容器管理组件两部分组成。后的服务在启动后,向Hydra-容器管理组件,注册自己的服务、IP地址和端口信息,Hydra随后接管容器的生命周期管理,进行健康检查,Failover处理,并把相关的信息保存在Zookeeper和MySQL中。规则控制组件在请求到达后,进行规制匹配、路由转发、限制、限速等处理。

目前网关用在了大多数服务中,下步计划是所有服务统一由网关进行管理,下图是网关系统的最终形态。



图7 3.0网关架构

数据访问

结构化的业务数据主要存储在MySQL和MongoDB中,设计上我们增加了数据代理层,代理层完全兼容MySQL和MongoDB的数据访问协议,让开发人员对代理完全无感,表面上是在访问特定的数据库,实际上连接上数据代理后,由代理对数据操作做解析和路由。

当然,如果是仅仅实现代理的功能,有很多开源项目可以使用比如MyCat、MySQL Proxy等,我们对代理有这些需求,数据访问路由和配置变更,数据访问鉴权和处理,日志采集发送,流控和服务拒绝。



图8 3.0公共组件架构

日志系统

设计之初也有考虑自己研发,通过调研后发现ElasticSearch+Logstash+Kibana完全满足我们的需求,并且ES的生态和社区非常活跃。通过早期几个服务的试水,最终决定整个平台基于ELK构建日志系统。

我们是这样做的,在每台主机上部署Logstash Angent采集格式化的日志数据,向Logstash Server发送日志。为了降低运维成本,我们把Logstash Forward做成Docker镜像,通过Salt来管理所有的Agent。Logstash Server在拿到日志信息后,不做任何规则上的处理,将数据保存在ES中。其实Logstash Server自身有日志解析和格式化的功能,但这样做会严重影响它的吞吐量,于是我们的方案是把日志标准的流程控制在源头。接下来,在Kibana中建立各种服务的面板和视图,便可以进行浏览和检索了,还可以周期对日志进行rotate、分析。



图9 3.0日志系统

监控系统

基于日志系统的基础架构,不同服务将Metrics输出到文件系统,通过LogStash和ES收集。在Kibana中定义视图,Kibana使用ES作为自己的存储引擎。比如新增一个视图后,Kibana会在ES的.kibana这个索引中创建一份视图的定义。

有了Metrics数据和视图的展示,下一步是报警。利用Nagios的报警机制,基于JNRPE实现报警的逻辑。报警逻辑通过读取ES中.kibana某一个视图的定义,和对应的阈值设置,通过比较当前值和阈值,返回某一个服务对应特定指标的监控状态。Nagios拿到状态后,决定是否报警。



图10 3.0监控系统

小结

相比较2.0时期,统一了主要的基础组件,降低了不同服务之间重复劳动部分。通过日志系统也提升了定位问题的效率,接下来还会考虑实现一套自己的请求trace系统,希望能够跟踪整个请求的生命周期,为寻找问题和定位性能瓶颈做参考。
总结

从应用到平台,公司业务和产品定位在不断的演进,架构也随之发生了天翻地覆的变化。有一点是我们研发人员时刻要提醒自己的,不能脱离业务去谈技术,满足业务是原动力,一切抛开业务去空谈架构的做法都是耍流氓。

成熟简单的技术就是最合适的,踩坑在所难免,但是如何把有限的资源用于做对的事情,不仅对商业和产品适合,对研发也同样适合。互联网公司多数都有由小团队、小想法、小产品,一步步发展起来的,在这个过程中能够通过设计和决策,在正确的时间做正确的事情,让产品能够快速迭代,快速上线,才是架构人员最需要考虑的事情。
  • 大小: 22 KB
  • 大小: 21.4 KB
  • 大小: 69 KB
  • 大小: 33.2 KB
  • 大小: 94.3 KB
  • 大小: 16 KB
  • 大小: 29.9 KB
  • 大小: 28.2 KB
  • 大小: 24.8 KB
1
0
评论 共 2 条 请登录后发表评论
2 楼 fnet 2016-08-16 11:40
我想说,这篇文章非常之好!
1 楼 g21121 2016-08-04 10:05
光看图了

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 力谱宿云秦鹏:MaxLeap云服务基础架构演进之路

    MaxLeap从一个对内的私有云服务平台,发展到...分享将结合云平台的业务发展,介绍基础架构演进过程的主要思路,遇到的难题,用到的开源技术和未来的规划。从而听众可以了解公有云服务后台的技术架构,用到的主要技术。

  • 从应用到平台 – 云服务架构的演进过程

    从应用到平台 – 云服务架构的演进过程

  • 从应用到平台 - 云服务架构的演进过程

    介绍       MaxLeap早期是一家研发、运营移动应用和手机游戏公司,发展过程中积累了很多通用组件。这些组件很大程度帮公司在移动...从对内提供接口服务到对外提供云服务,经历...

  • 工程师们不断推动下的云服务架构

    作为原始的应用框架,如果是一位牛逼的资深级程序员,一定能写出最整齐、简洁与极致高性能的代码,但是对于需要更多人参与进来的软件工程来讲,原始的框架很容易导致混乱,因此各种Web架构总是被顶尖的工程师们不断...

  • 电商技术架构演进过程——具体到每一个技术

    我想,不管你是一个开发人员,或者正在走向开发路上的人,都和我一样,都想了解那些电商平台,究竟是如何一步一步从孤舟称为航空母舰的!他们都经历的哪些技术革新。我们正在做的,在哪一个节点上。 以下是我的几...

  • 16 张图详解,淘宝十年架构演进过程

    文本文以淘宝为例讲解了大型网站的架构演进过程,特此分享给大家,相信看完会有所收获。整个架构的演进过程:单机架构第一次演进:Tomcat与数据库分开部署第二次演进:引入本地缓存和分布式缓存第三次演进:引入反向...

  • 从单体架构到亿级流量高并发系统架构15次架构演进详解

    一、如何清晰定位当前系统面临的问题并绘制出架构图谱,同时制定明确可执行的架构设计目标 系统架构不是无目的性的设计和规划,首先得直面当下系统出现的问题,一定是基于业务本身去做设计和分析,系统架构也不是...

  • [架构之路-242]:目标系统 - 纵向分层 - 应用程序的类型与演进过程(单机应用程序、网络应用程序、分布式应用程序、云端应用程序、云原生应用程序)

    计算机应用程序(Computer Application)是指专门为计算机系统开发的软件程序,用于执行特定的任务或完成特定的功能。计算机应用程序是通过编程语言编写的一系列指令和算法,通过计算机的硬件系统来实现特定的功能和...

  • 微服务架构演进

    微服务架构从单体架构演进而来。在单体应用相对较小时,应用的开发、测试和部署相对简单,但随着时间的推移,更多的功能被添加到应用中,代码的规模也进一步增长。作为功能扩展的结果,单体应用很快陷入单体地狱。...

  • 从10到10亿级PV京东系统架构演进之路

    今天从宏观的角度来讲,整个时代是大众创业万众创新的时代,作为程序员我们每个人都有一个梦想,吊打面试官,很多人给我说,我想进百度,想进阿里,想进腾讯,等一线互联网公司。你就需要知道面试官的一些大招,这样...

  • vivo 云服务海量数据存储架构演进与实践

    随着 vivo 云服务业务发展,云服务用户量增长迅速,存储在云端的数据量越来越大,海量数据给后端存储带来了巨大的挑战。云服务业务这几年最大的痛点,就是如何解决用户海量数据的存储问题。 二、面临挑战 2017-...

  • 架构杂谈——也谈互联网系统架构演进

    说到互联网系统架构,随便网上一搜都有大量的相关文章/书籍,而这些,得益于过去几年互联网行业的快速发展与繁荣,在今天看来,这些技术/解决方案似乎早已不是什么新鲜的东西了,但是,本文笔者仍想简单聊聊这个话题...

  • 【云驻共创】云原生应用架构之企业核心业务未来架构演进路线及华为云方案

    文章目录前言 前言 本文整理自华为云社区【内容共创】活动第14期。 查看活动详情:https://bbs.huaweicloud.com/blogs/336904 相关任务详情:任务16.企业核心业务未来架构演进路线及华为云方案

  • 研发协同平台架构演进

    本文将介绍明源云研发协同平台的架构从0到1,逐步随着业务发展一步一步迭代演进的过程。 背景 随着公司的ToB业务发展,开发团队规模不断扩大,需要交付的业务也不断增长,在这个过程中,交付的效率和质量出现了不同...

  • 受激拉曼散射计量【Stimulated-Raman-Scattering Metrology】 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

  • MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效

    MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效并网运行。,MMC整流器(Matlab),技术文档 1.MMC工作在整流侧,子模块个数N=18,直流侧电压Udc=25.2kV,交流侧电压6.6kV 2.控制器采用双闭环控制,外环控制直流电压,采用PI调节器,电流内环采用PI+前馈解耦; 3.环流抑制采用PI控制,能够抑制环流二倍频分量; 4.采用最近电平逼近调制(NLM), 5.均压排序:电容电压排序采用冒泡排序,判断桥臂电流方向确定投入切除; 结果: 1.输出的直流电压能够稳定在25.2kV; 2.有功功率,无功功率稳态时波形稳定,有功功率为3.2MW,无功稳定在0Var; 3.网侧电压电流波形均为对称的三相电压和三相电流波形,网侧电流THD=1.47%<2%,符合并网要求; 4.环流抑制后桥臂电流的波形得到改善,桥臂电流THD由9.57%降至1.93%,环流波形也可以看到得到抑制; 5.电容电压能够稳定变化 ,工作点关键词:MMC

  • Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基

    Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法

  • STM32F103C8T6 USB寄存器开发详解(12)-键盘设备

    STM32F103C8T6 USB寄存器开发详解(12)-键盘设备

  • 2011-2020广东21市科技活动人员数

    科技活动人员数专指直接从事科技活动以及专门从事科技活动管理和为科技活动提供直接服务的人员数量

Global site tag (gtag.js) - Google Analytics