网站架构的一般演化过程以及一些网站性能优化的方法

前言:本文是读李智慧先生的《大型网站技术架构》一书的观后感。
一个网站在不断的发展历程中,会不断遇到庞大的用户,高并发访问和海量的数据等问题,会导致整个网站的性能降低,甚至服务无法提供,下面则简要介绍网站遇到以上问题时,在每个阶段的网站架构图和解决方案。注意,以下所描述的问题不一定是按顺序逐个出现的,提供的解决方案也不一定是按顺序使用的,有可能在一开始,网站就使用了好几种的解决方案。

一、网站的初始阶段

任何大型网站都是从小网站开始发展而来的,网站结构也是一步一步演化而来。刚刚开始的的网站,业务简单,用户量少,数据结构单一,所以一台服务器就可以解决所有的问题。应用程序,数据库,文件等所有资源都在一台服务器上。

这个是图片描述

二、分离数据库和应用程序【文件资源分离也在这一步骤】

问题:用户量越来越大导致性能迅速下降,数据越来越多导致存储空间不足
解决方案:把应用程序和数据库以及文件存储分离,分别设置一台服务器提供服务,如下图所示:

这三种服务器对硬件资源的要求更不一样,应用服务器需要处理大量的业务逻辑,因此需要更强大的CPU,数据库服务器需要快速检索和数据缓存,因此需要更大的硬盘和更大的缓存,文件服务器需要大量的用户上传的文件,需要更大的硬盘。

三、使用缓存

问题:随着用户量越来越大,数据库压力太大导致访问延时,从而影响了整个网站的性能
解决方案:使用第三方缓存来解决,如redis,memcache等开源第三方分布式缓存

网站访问和世界财富分配一样遵循着二八分配,80%的业务访问集中在20%的数据上。既然大部分的业务访问都集中在小部分数据中,就可以使用性能更好的内存来提供服务,使用缓存可以大大减少数据库的读写压力。这个时候,网站的结构图应该是这样的:

四、使用服务器集群

问题:网站面临高并发,海量数据,一台服务器的性能已经达到瓶颈
解决方案:增加一台(几台)服务器分担压力,用lvs做负载均衡
使用集群是网站解决高并发,海量数据的常用手段,当一台服务器不足以解决当前问题的时候,并且不断的进行优化后仍然不能解决问题时,此时最简单的方法就是增加一台服务器分担压力,而不是换一台更强大服务器替换。理由很简单,再强大的服务器,也会有性能瓶颈,难道每次遇到问题后就是花钱买一台更贵的服务器?那原来的就服务器就不要了么?显然不划算。
使用集群就涉及到了负载均衡调度器,当你使用集群面向用户提供服务的时候,对用户来说这种变化却应该是透明的,我们不可能因为加了一台服务器还得告诉用户,“嘿,我换了一台服务器,你用另外一个网址访问吧!”这时候可以使用lvs或者nginx的多重代理实现。此时的网站结构如下图所示

使用集群

五、数据库读写分离

问题:虽然缓存减小了数据库的读写压力,但是仍然有一部分数据需要进行数据库读写,当这部分数据达到一定规模后,仍然会对数据库造成比较大的压力。此时,数据库的性能瓶颈再次成为整个网站的瓶颈
解决方案:数据库进行读写分离
把数据库服务器从一台分成两台,一台专门做读,另外一台专门作为写,利用大部分数据库都有的主从同步功能,可以基本实时保持数据一致性,这样可以把一台服务器的压力分担到了两台服务器上。相mysql这样的数据库软件,其实还可以做到一台服务器写,几台服务器读,可以持续不断的扩展,理论上可以无限的分担数据库压力。

数据库主从分离

六、使用cdn和反向代理服务器

问题:用户量一直增大,由于中国的网络环境,不同地区访问网络时,速度差别也很大。
解决方案:使用CDN加速和反向代理。
CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户请求网站服务的时候,可以在最近的网络提供商机房获取数据;而反向代理服务器则部署在网站的中心机房,当用户访问网站内容的时候,先到达中心机房,如果中心机房的服务器缓存有用户的访问内容,则直接返回给用户。CDN加速和反向代理可以一起使用,都可以减轻后端服务器的负载压力。
这边需要注意的是,一般CDN可以租用CDN服务商的服务,如蓝汛等,而反向代理服务器则一般是自己搭建了,曾经使用过squid,效果还可以。

七、使用分布式文件系统和分布式数据库系统

问题:任何强大的单一服务器都满足不了大型网站持续增长的业务需求,当服务器存储压力越来越大,数据库访问压力越来越大,此时就再次遇到性能瓶颈。
解决方案:使用分布式文件系统和分布式数据库系统
首先是分布式文件系统,最明显的案例就是用户上传的图片资源。当用户上传的图片资源越来越多,单一的服务器存储已经根本不够用的时候,最好的解决方案就是使用分布式文件系统,使用多台机器实现共享存储,理论上只要机器够多,就不用担心存储容量不足。我在的公司曾经使用MFS(moosefs),具体使用方法可以自己百度~
其次是分布式数据库,这里说的分布式数据库其实就是通常说的分库分表做法。当单一的库没法承担数据业务压力的时候,通常做法就是进行分库,思想类似第四点,实质就是把一个库的数据分到了几台服务器上,再根据实际情况对每次业务访问指向不同的服务器。

图片描述

八、其他增加性能方案

    1、使用搜索引擎和nosql数据库
    2、对业务进行拆分,对一些访问压力大的业务,比如单独把登录业务独立到一个服务器集群。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值