服务项目 >> 网站负载优化

  一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果。所有的贞面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展。已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。

  大型网站在面对大量用户访问、高并发请求方面,基本的解决方案也就是第一层次可以分为几个环节

1、使用高性能的服务器

  购买服务器的时候主要考虑几个方面的设备:

  A、服务器硬盘;

  B、服务器内存;

  C、服务器CPU;

  D、其实上面的设备也是由主板决定的,比如需要SAS硬盘,就必须是主板支持SAS接口,当然也可以外接SAS卡特例除外;内存的类型、CPU选择还得由主板决定。还有一个不能忽视的是电源。

  E、总体来说,就是需要在服务器各组件上下功夫,做高负载的网站,这点钱不能省。

2、高性能的数据库,高效率的编程语言

  因为我们主要是基于PHP+MYSQL开发,所以就只能推荐PHP编程语言和MYSQL数据库了。

3、高性能的Web容器,高效操作系统

  可选而且从经济角度考虑,推荐APACHE或者NGINX,从现有项目经验来看,还是推荐NGINX,虽然版本还只是到0.8.x。从选择数据库,编程语言和WEB服务器来看,操作系统选择LINUX是不二选择,整体组合就是LNMP,也就是LINUX+NGINX+MYSQL+PHP.

  上面环境搭建好,网站正常运行,但是有一天,你可能会发现出现CPU使用接近100%了,或者内存全部使用完毕,已经使用了交换分区的东西了。是的,网站还得优化,怎么样优化?又可以从以下几点也就是第二层次来考虑

1、程序检测优化。

  程序是不是每次运行都链接数据库,不管用不用到。我们建议是需要用到数据库的时候才连接数据库。

2、使用缓存技术。

  可以静态化一些基本固定的页面,就是不经常更新的,比如文章类页面。对于经常更新的,如果允许的情况下,也可以多使用MEMCACHE这个分布式缓存好东西。反正不要每次都去访问数据库,从数据库里调数据出来,特别是全文检索类的。因为瓶颈往往都在数据库这块。

3、Web服务器与 DB服务器分离

  我想也是加服务器的时候了,可以独立一台服务器出来专门做数据库服务器。建议WEB服务器和DB服务器都配备双网卡,一网卡对外,一网卡对内,就是双机使用内网互连,内网主要是用来数据库连接的。

4、附件分离

  对于用户参与互动的网站,特别是有大量附件,包括图片和其他文件的,可以考虑附件分离,降低主WEB服务器的负载。

  如果第二层次的还不能满足要求,那么继续优化,主要考虑下面几点

1、拆分数据库、数据表

  拆分库,主要是针对网站有多个子系统,而子系统之间关联并不是很紧密的。那么可以考虑按功能模块将数据库拆分。拆分表,主要是针对特定表,记录可能比较多,超过500万的记录,比如注册用户表,再通过「索引表」进行关联处理。

2、数据库读写分离

  同时对数据库进行「读」和「写」的操作,是非常没效率的一种访问方式。比较好的做法,是根据读、写的压力和需求,分别建立两台结构完全相同的数据库服务器,将负责「写」的那台服务器的数据,定时复制给负责「读」的服务器。

3、按功能分子域

  这个配合上面的数据库分库,按功能模块把子域分开,部署到不同的服务器上。

  一般来说,中型网站经过上面几个方面的优化,基本能抗一个比较理想的负载。如果上面步骤进行以后还是不能负载起,那就得考虑继续第四层次增加设备使用负载均衡技术来解决这个问题。负载均衡技术发展了多年,有很多专业的服务提供商和产品可选择,基本上又可分为「软件」和「硬件」的解决方案

1、硬件方面

  对于负载均衡硬件方面的东西,我首先想到的是传说中的F5,听说价格不低,不过效果很好。

2、软件方面

  Apache 这一款众所皆知的 HTTP Server,其双向 Proxy / Reverse Proxy 功能,亦可达成 HTTP 负载均衡功能,但其效率算不上特别好。而另一款 HAProxy 就是纯粹用来处理负载均衡的,且具有简单的缓存功能。

 09922103214107.jpg

  上图中,有四台 Real Server (Web Server),以及三台 Real DB Server,形成 Web 及 DB 的服务器集群 (Cluster)。我们看到最上方的 Virtual Server 1 本身不具备任何的数据服务 (如:.PHP、图片...等),只有一个功能,就是将用户的连线 request 请求,重新导向下方的四台 Real Server。这种利用重新导向 (director) 的方式,将服务负载分布给 Real Server 的方式,就称作 Load Balance。

  现在似乎还没有一种做法,能自动计算主机的「负载」情形,例如计算 CPU 已使用多少百分比,以决定要把 request 丢向哪一台 Real Server;现在一般都还是按照轮替 (Round-robin) 的方式,或加上一些权重的设置而已。

  若我们在 Server 上设置 Load Balance,且要执行PHP程序,就要注意一个问题,就是 Session 的存储位置是在哪一台 Web Server 的内存上,以避免发生有用户表单填写得比较久,等到他提交时,已经被 Windows Server 的 NLB 将工作阶段切换到另一台 Web Server 主机上了。此时就可考虑将 Session State,改存储在 MYSQL Server 里。

  至于用软件做的 Load Balance 其性能如何呢?基本上用软件做的,性能一定不会是 1 + 1 = 2,但通常能提高 Availability,亦即常听到的 HA (高可用性集群 High-availability),即 Failover 方式,如上图 2 的最上方,红色箭头左侧的 Virtual Server 2,是能够侦测 Virtual Server 1 宕机或无法提供服务时,自动将自己的 IP address 取代 Virtual Server1。因此 HA 是指提供「不会中断的服务」,而现在讨论的 Load Balance 是指提供「能承受高度负载的服务」,两者指的不是同一件事。