返回介绍

大型网站架构经验

发布于 2025-04-20 18:52:15 字数 2733 浏览 0 评论 0 收藏

限于篇幅,本书无法把网站架构演进的过程都呈现出来,而且一个网站的架构往往和业务有关,并不适合全部的场景。图 6.1 所示是一个比较通用的大型网站的架构。

图 6.1 通用的大型网站的架构

图 6.1 中的架构模式主要包含如下部分。

缓存

通常来说,用户访问的热点数据只集中在一小部分数据上,这部分数据应该放在缓存中,这样就减轻了后端应用和数据存储的负担。缓存主要分为如下 4 种。

1.本地缓存。在应用服务器内缓存热点数据,当请求访问热点数据时,可以直接使用本机的内存获得结果而不需要访问数据库。

2.分布式缓存。大型网站的数据量非常庞大,单机无法承受,本地缓存在网站发展到一定程度后还需要分布式缓存集群,应用程序通过网络访问缓存数据。

3.反向代理。代理服务器位于网站机房之内,用户访问的地址其实是代理服务器地址,由代理服务器决定是从后端换取相应的内容,还是把缓存的内容返回给客户端。通常还会使用 Varnish 来加速应用。

4.CDN(内容发布网络)缓存。发布商出售缓存服务给需要的网站,这些网站不必自己维护缓存工作,只是按需求把内容提交到 CDN 发布商即可。通常 CDN 发布商的缓存服务器分布很广,能自动判断访问者的 IP 地址并解析出对应的 IP 地址,选择最优的缓存服务器响应请求。在 CDN 上缓存网站的一些变化少的内容(如静态资源)可以有效提升页面加载速度。

在实际场景中应该使用不同的缓存设计,提高用户体验。

负载均衡

负载均衡技术是构建大型网站必不可少的架构策略之一。后端服务器的硬件资源可能在 CPU 个数和性能、服务器内存、服务器质量等方面是不一样的,较好的服务器理当负担更大的访问量,较差的服务器理当负担较小的访问量。通过负载均衡可以把用户的请求分发到多台后端的设备上,这样就均衡了服务器的负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间的目的。常见的负载均衡工具包括 LVS、HAProxy、Nginx,对于中小型的 Web 应用它们都可以胜任。但对于复杂的应用场景,在选择负载均衡工具时需要注意如下几点:

  • Nginx 仅能支持 HTTP、HTTPS 和 Email 等协议,适用场景最少。HAProxy 和 LVS 都可以对 MySQL 进行负载均衡,但是 Nginx 不可以。
  • LVS 不支持正则表达式处理,不能做动静分离。
  • HAProxy 配置选项很多,也最灵活,适用场景最多。
  • Nginx 对网络的依赖非常小,但是 LVS 对网络的依赖很重。

高可用

之前讨论的都是单个节点的场景,但是单个节点无法满足日益增长的业务压力,这势必需要让服务运行在多个节点上。互联网服务都希望 7*24 不间断,这就要求系统具有高可用性,即组成系统的某些设备宕机或者组件失效时,并不会中断服务。Keepalived 最初是 LVS 的扩展项目,通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离和负载均衡器之间的切换。类似的工具还有 Heartbeat。但 Keepalived 不会单独出现,而是与其他负载均衡技术一起工作来实现集群的高可用。

业务拆分

大型网站业务场景复杂,为了提高网站可扩展性,需要考虑业务或者产品拆分,分归到不同的业务团队中负责。每个应用独立开发、部署、维护,应用之间通过网络进行通信,或者使用消息队列进行分发。业务拆分还包括对数据库的分库,其实现的成本低,但是效果相对较好。

集群

使用集群是解决高并发、海量数据问题的常用手段。当单台服务器的存储空间和处理能力不能满足要求时,不要盲目提高服务器的配置,而是选择增加一台服务器来分担原服务器的访问和存储压力。

用户看到的大型网站的大部分页面一般都不是单独的应用提供服务。整个页面事实上被分割成了多个部分,每个部分都由独立部署的一个服务器集群来提供服务。集群包含提供相同服务的多个服务器,这既提高了并发能力,也能在某台服务器发生故障时,使用系统失效机制或者按照负载均衡设置将请求转发到其他正常的服务器上,使用户不受影响。

有一点需要注意,不同用途的服务器对硬件资源的要求是不一样:应用服务器要处理大量的业务逻辑,需要更快的 CPU;文件服务器存储大量用户文件,需要更大的硬盘;数据库服务器需要快速的写入数据和检索到要查询的数据缓存,需要更快的硬盘和更大的内存;缓存服务器需要快速获取数据缓存,只需要更大的内存,等等。应该根据用途来决定采购的标准。Web 前端性能的优化有如下三点值得考虑。

减少页面请求和请求内容量

HTTP 是无状态的应用层协议,每次请求都需要在客户端/服务端启动独立的线程去处理,开销很昂贵,可以通过合并 CSS、合并 JavaScript、合并图片来实现减少 HTTP 请求的数目。其中合并图片的方法主要有 CSS Image Sprites(将多张图片合并成一幅单独的图片)、内联图片(通过使用 data:URL 模式而无须任何额外的请求)、IconFont(图标字体)这三种。请求的资源的内容越大,和服务端的连接时间就越长。生产环境要使用被压缩的 JavaScript 和 CSS 资源以提高响应速度。

动静页面分离

把像 JavaScript、CSS 这样的静态资源应用部署在专门的服务器集群中,在页面的模板上通过不同的域名引用。

动态页面静态化

如果动态页面访问量很大但是更新不频繁,可以将其生成一个静态页面,利用静态页面的优化手段加速用户访问,比如浏览器缓存、CDN 等。静态化之后可以有效减轻应用服务器的压力。豆瓣电影年度榜单(http://bit.ly/2a1IpoE )就是一个静态页面,数据效果靠 JavaScript 来实现。Mako 虽然也支持模板级别的缓存,但是通过试验对比,还是直接存入 Memcached 的访问效率更高。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。