快速成长期应用架构实践 (6):在线水平扩展

叁叁肆2018-11-14 18:48

欢迎访问网易云社区,了解更多网易技术产品运营经验。


4.2.3 在线水平扩展


在线水平扩展能力是一个分布式系统需要提供的基本能力,也是在架构设计时需要满 足的重要功能点。而水平扩展能力也是业务发展的硬性需求,从产品的角度出发,产品的 业务流量往往存在着很大波动,具体如下。


产品业务量增长:在这个信息病毒式传播的时代,一些热点应用的业务量可能会 在很短时间内大量增长。


周期性业务:客服服务、证券服务及春运购票等。这类活动往往都存在着很明显 的周期性特征,会按照一定的周期(月、天、小时、分钟)进行波动。波峰和波 谷的流量往往会有一个数量级以上的差异。


活动推广:一次成功的活动推广往往会带来数倍甚至数十倍的流量,需要业务可以快速扩展,在很短的时间内提供数十倍甚至上百倍的处理能力。


秒杀:秒杀活动是弹性伸缩压力最大的业务,会带来瞬时大量流量。


为了应对这些场景,需要业务在一个很短的时间内提供强大的处理能力。而在业务低 谷期,可以相应回收过剩的计算资源,减少消耗,达到系统性能和成本之间的平衡,提高 产品的竞争力。


1. 准备工作


产品对水平扩展的需求是一直存在的,但是受制于传统 IT 行业按天甚至按周计算的资 源交付能力,弹性伸缩一直是一个美好的愿望。直到云计算这个基础设施完善之后,才使 弹性伸缩的实现成为了可能。如果要实现弹性伸缩,需要以下几点的支持。


资源快速交付能力:业务可以根据需要,动态并快速地申请、释放资源。这也是 云计算提供的基础能力,根据云计算平台的不同,一般都会提供从秒级到分钟级 的资源交付能力,相对于传统 IT 管理按天计算的交付水平有了巨大的提升,这也 是弹性伸缩的基础。在云环境下,绝大部分资源交付、扩容操作都可以在分钟级 别完成,从而为弹性伸缩提供了基础支撑。


无状态服务设计:对于有状态服务来说,由于有着各种各样的状态信息,因此会 使扩展的难度大大增加。因此,无状态话的服务设计,是弹性伸缩服务的前提。


业务性能监控:只有了解业务实际的负载情况,才有弹性伸缩的可能。只有对业 务承载能力、运行负载有了全面的了解和实时监控,才能制定出相应的扩展指 标。对于云服务厂商来说,基本上都提供了对基础资源,如 CPU、内存、网络等 的监控能力。而对应的 PaaS 服务,还提供了应用层数据的详细分析,为更细粒度、 更加精确的扩展提供了可能。


统一的服务入口:只有提供了统一的服务入口,才可以在不影响用户的情况下实 现后台服务的弹性伸缩。统一服务入口有两种实现机制,一种是在系统层面,通 过负载均衡服务提供统一的流量入口,使用负载均衡服务统一进行管理。另一种 是通过服务注册和发现机制,在服务层实现适配。对于外部访问,可以使用对外 的负载均衡服务,对于内部服务,一般都会提供租户内部的负载均衡。业务方可 以根据需要,使用对应的流量入口。 


2. 实现要点


前端系统一般都会采用无状态化服务设计,扩展相对简单。在实践中,有多种扩展方 案,如通过 DNS 服务水平扩展、使用专有的 apiserver、在 SDK 端分流及接入负载均衡等。 其中负载均衡方案使用最广,综合效果也最好,可以满足绝大多数场景下的需要,下面就 以负载均衡服务为例,介绍前端系统水平扩展的实现要点。


协议选择 

负载均衡服务分为 4 层和 7 层服务,这两种并不是截然分开的,而是有兼容关系。4 层负载均衡可以支持所有 7 层的流量转发,而且性能和效率一般也会更好。而 7 层负载均 衡服务的优势在于解析到了应用层数据(HTTP 层),因此可以理解应用层的协议内容,从 而做到基于应用层的高级转发和更精细的流量控制。


对于 HTTP 服务,建议直接采用 7 层负载均衡,而其他所有类型的服务,如 WebSocket、 MySQL 和 Redis 等,则可以直接使用 TCP 负载均衡。


无状态服务 

前端系统可扩展性需要在系统设计层面进行保证,较为通用的做法是无状态化的服务 设计。因为无状态,所以在系统扩展时只需要考虑外网设施的支持,而不需要改动服务代 码。对于有状态的服务,则尽量服务改造把状态分离出去,将状态拆分到可以扩展的第三 方服务中去。


高级流量转发 

对于 7 层负载均衡来说,由于解析到了协议层,因此可以基于应用层的内容进行流量 转发。除了最常用的粘性会话(Sticky Session)外,最常用的转发规则有基于域名和 URL 的流量转发两种。


基于域名的流量转发:外网的 HTTP 服务默认使用 80 端口提供,但经常会有多个 不同域名的网站需要使用同样一个出口IP的情况。这时候就需要通过应用层解析, 根据用户的访问域名把同一个端口的流量分发到不同的后端服务中去。域名流量 转发是通过解析请求头的 Host 属性实现的,当浏览器通过域名访问时,会自动设 置 Host 头。通过程序访问 HTTP API 接口时,一般的第三方库也会设置这个属性,但如果自己组装 HTTP 请求,则需要主动设置对应的 Host 头。


基于 URL 的流量转发:对一些大型网站,或者基于 REST 风格的 API 接口,单纯 通过域名进行分流已经无法满足分流要求。此外,还存在着同一个域名的服务, 根据 URL 分流到不同后端集群的情况,这种情况就可以通过请求中的 URL 路径 信息,进行进一步分流。一般的 URL 都会支持模糊匹配。

 

文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著 


网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用