黎雪 王芳
随着移动互联网、云计算和大数据的不断成熟,网站开发相关的技术已经细分到了各个方面,采用的技术也丰富多样。开发一个大规模高并发的网站,解决方案可以集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、高性能的Web容器以及高可靠性的防火墙。这些方案在一定程度上意味着从硬件设备到软件都需要更大的投入。而云计算的兴起正好解决了这个问题,使用者可以按需从可配置的资源池中获取资源,如网络、服务器、存储资源、防火墙和应用程序等,资源可以快速通过Internet供给和释放,让使用者的工作量和使用成本降低至最少。本文对如何快速搭建一个大规模高并发网站以及开发过程中需要使用的云计算服务进行了简要介绍。
大型网站都是从小型网站发展起来的,网站架构也是一样。初期,访问量小,只需要一台服务器,随着业务的发展,服务器存储空间不足只能将应用和数据分离。网站访问特点是大部分的浏览都只会集中在一小部分数据上,理论上把这些数据缓存在内存中,就可提高访问速度。但是单一服务器能处理的访问有限,在访问的高峰期,服务器还是会成为网站的瓶颈。如果使用集群来解决高并发的问题,只要不是能弹性扩展的服务器,都满足不了网站持续增长的业务,此外,不同地区的用户访问速度也有差别。为了留住因访问延迟而可能流失用户,网站需要更快的访问速度,这种情况可以使用CDN,让数据尽快返回给用户。大型网站发展到这里,任何单一服务器都满足不了持续增长的业务需求,虽然基本上大多数的技术问题都可以从硬件或者软件方面去解决,但是时间和金钱成本太高。而云计算则提供了一个良好的解决方案,帮助开发者以最高效率和最低成本轻松地开发大型网站。
网站框架分析与设计
网站整体架构如图1所示,网站静态化的HTML页面托管在Amazon s3存储桶上。用户访问网站时,Route 53提供高度可用且可扩展的域名系统(DNS),高效地将用户请求连接到AWS中的Elastic Load Balancing负载均衡器和Amazon S3存储桶。当网站遭遇大量的用户请求时,Amazon ELB负载均衡器将前端流量均衡地发放到后端服务器,实现负载均衡,减轻单服务器处理压力。虽然在访问的高峰期,服务器数量还是会成为网站的瓶颈,但是AWS Auto Scaling可以持续监控Amazon EC2云服务器实例运行状况,确保它们以预定的性能水平运行。出现需求高峰时,AWS Auto Scaling可以自动增加受限资源的容量,添加或删除EC2实例,根据预需求自动安排正确数量的EC2实例。同时将应用服务和数据分离,不同特性的AWS Auto Scaling组承担不同的服务角色,使网站的并发处理能力和数据存储都得到改善。数据的读写操作都会直接访问数据库,在网站到达一定规模后,也会增大数据库的压力,这时可以通过Amazon RDS云数据库配置2台数据库搭建主从关系,将一台数据库服务器的数据同步到另一台服务器上,实现数据库的读写分离功能,从而减轻数据库的压力。除此之外,为了提高访问速度,使用Amazon CloudFront内容分发网络服务,智能地将用户流量路由到性能最好的AWS边缘站点位置以提供缓存或动态内容。
使用Amazon S3托管静态网页
大型网站的静态内容包括HTML、CSS、JavaScript、图像、视频和其他文件,使用本地服务器的时候,这些静态内容是存储在磁盘里面。随着服务器压力增大,每个用户在浏览页面某个图片时,都会从服务器的磁盘里面检索图片,如图2所示,一旦磁盘出现故障,用户就无法获取这个图片。因此,需要一个海量、高并发、可靠的储存来存放这些静态资源。
AWS为了满足这种需求提供了Amazon Simple Storage Service(简称Amazon S3),一个公开的云存储服务,用户可以在Amazon S3中存储对象的容量和个数不受限制。要在Amazon S3上托管静态内容,首先需要创建一个S3存储桶,如图3所示,将存储对象上传到存储桶中同时可获取到该对象的URL。图片可以直接将其URL嵌入在Web网页里,无需担心并发问题,后续也可以继续使用cloudfront服务加速分发。
使用S3服务后,网站的架构也从图2变成了图4,用户在访问网站的静态内容时就不需要访问服务器的磁盘,直接从S3获取静态内容即可。
使用AWS Auto Scaling组分离应用服务和数据
动态内容的部分就需要一个服务器来处理。Amazon Elastic Compute Cloud(EC2)提供了可快速启动和管理的虚拟计算环境(服务器),同时可对其计算、内存、存储等方面进行调节。借助AWS Auto Scaling监控服务器的使用率,并根据需求的变化自动实时向资源组添加容量或从中删除容量。
如图5所示,网站每天的资源需求是不一样的,最好可以分配充足的Amazon EC2容量,以便能始终满足最高的需求时段(图5中是周三)。不过,这意味着运行的资源在一周的大部分时间内都得不到充分利用。
上述方案,成本并未得到优化。最优的方案是分配较少却刚好适量的Amazon EC2实例来降低成本。如图6所示,当需求上升时,AWS Auto Scaling将自动添加资源容量,当需求下降时,AWS Auto Scaling将自动删除多余的资源容量,节省开支,这样才是最理想的方案。
同时,为了支持业务的进一步发展,应该将应用服务和数据的服务器分離管理,不同特性的服务器组承担不同的服务角色如图1所示,这样可以使网站的并发处理能力和数据存储都得到很大提升。
使用Amazon ELB分配流量
当开启多个EC2实例时,还需要考虑如何统一高效地管理这些虚拟服务器,把流量合理地分发到这些虚拟服务器上。
弹性负载均衡器Elastic Load Balancing(ELB),将访问的流量分配到多个EC2实例之间。如图7,负载均衡器充当在服务器前面的“交通警察”,并能够最大限度地提高速度和容量利用率,以满足客户端的请求,并确保没有任何服务器超负荷运行。如果单个服务器崩溃,负载均衡器会将流量重定向到剩余的在线服务器。同时,ELB可与自动扩展AWS Auto Scaling相集成,让负载均衡器挂载到现有的Automatic Scaling组中,如图8。挂载负载均衡器之后,当其中有EC2运行状况不佳或不可用时,AWS Auto Scaling将启动未受影响的新实例,负载均衡器会自动开始向其发送请求。当运行恢复到正常状态时,负载均衡器和Automatic Scaling会相应地调整并将流量重新平均分配。
使用Ainazon RDS实现读写分离
在数据库层面实现高可用,通常是在软件层面来做。例如,MySQL的主从模式(Master-Slave)能满足需求。Amazon RDS服务可以让用户非常容易且方便地管理关系型数据库,使用Amazon RDS创建Mysql实例,利用mysql数据库提供的主从备份的机制,实现mysql数据库的热备份。同时,RDS提供了可读副本,在创建数据库实例时,同时创建一个副本接收客户端的读请求,然后返回结果给客户端,减轻主数据库的负载压力。
使用Amazon CloudFront提供缓存
Internet的统计表明,超过80%的用户经常访问20%的网站内容,因此,使用缓存服务器可以处理大部分客户的相同请求,加快响应时间。如果内容是首次请求,CloudFront将从Amazon S3存储桶或者EC2检索内容。而对于不是首次的请求,那么内容已经缓存在边缘站点上,用户再次请求时,Cloud Front会从延迟最短的边缘站点提供给用户,无需重新检索。
近几年来,云计算取得了飞速的发展与翻天覆地的变化,逐渐成为信息技术产业发展的战略重点。云计算与传统的网络应用模式相比,其具有虚拟化、可动态扩展、按需使用、灵活性高、兼容性强、可靠性高、性价比高以及可高效扩展应用的优势。使用云计算替代传统IT解决方案是大势所趋,本文基于亚马逊云服务,实现负载均衡、弹性调节服务器数量,降低了数据库压力;同时利用CDN提供缓存,最终形成一个高并发、高可用的网络架构。