zoukankan      html  css  js  c++  java
  • 大访问量、高并发网站优化

    前言:最近管理的网站访问量较高,收集整理了一下优化方案

    1、首先,确认服务器硬件是否足够支持当前的流量普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻底解决性能问题。

    2、缓存技术的合理运用,减少数据库的频繁操作;

    优化数据库访问前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站,静态化往往不能满足某些功能。缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用 这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术,如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用 Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大,尽量做到"所查即所得" ,遵循以小表为主,附表为辅,查询条件先索引,先小后大的原则,提高查询效率.量SQL查询。

    3、程序功能规则,减少外部盗链;

    外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗链,Apache自 己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当然,伪造refer也可以通过代码来实现盗链,不过目前蓄意伪造refer盗链的还不多, 可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。

    4、控制大文件的上传与下载;

    大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗 CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。

    5、使用不同主机分流主要流量

    将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了

    6、 数据库优化

         重点说说数据库优化,往往一个网站可并发量的瓶颈在数据库上 ,优化数据库有如下方法

    一、SQL查询语句优化

        1、使用索引

        建立索引可以使查询速度得到提升,我们首先应该考虑在where及order by,group by涉及的列上建立索引。

       2、借助explain(查询优化神器)选择更好的索引和优化查询语句

        SQL 的 Explain 通过图形化或基于文本的方式详细说明了 SQL 语句的每个部分是如何执行以及何时执行的,以及执行效果。通过

    对选择更好的索引列,或者对耗时久的SQL语句进行优化达到对查询速度的优化。

       3、任何地方都不要使用SELECT * FROM语句。

       4、不要在索引列做运算或者使用函数

       5、查询尽可能使用limit来减少返回的行数

       6、使用查询缓存,并将尽量多的内存分配给MYSQL做缓存

    二、主从复制,读写分离,负载均衡

       目前大多数的主流关系型数据库都提供了主从复制的功能,通过配置两台(或多台)数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可以利用数据库这一功能,实现数据库的读写分离,从而改善数据库的负载压力一个系统的读操作远远多于写操作,因此写操作发向master,读操作发向slaves进行操作(简单的轮询算法来决定使用哪个slave)。

       利用数据库的读写分离,Web服务器在写数据的时候,访问主数据库(master),主数据库通过主从复制将数据更新同步到从数据库(slave),这样当Web服务器读数据的时候,就可以通过从数据库获得数据。这一方案使得在大量读操作的Web应用可以轻松地读取数据,而主数据库也只会承受少量的写入操作,还可以实现数据热备份,可谓是一举两得。

    三、数据库分表、分区、分库

       1、分表

       通过分表可以提高表的访问效率。有两种拆分方法:

       垂直拆分

       在主键和一些列放在一个表中,然后把主键和另外的列放在另一个表中。如果一个表中某些列常用,而另外一些不常用,则可以采用垂直拆分。

       水平拆分

       根据一列或者多列数据的值把数据行放到两个独立的表中。

       2、分区

       分区就是把一张表的数据分成多个区块,这些区块可以在一个磁盘上,也可以在不同的磁盘上,分区后,表面上还是一张表,但是数据散列在多个位置,这样一来,多块硬盘同时处理不同的请求,从而提高磁盘I/O读写性能。实现比较简单,包括水平分区和垂直分区。

       3、分库

       分库是根据业务不同把相关的表切分到不同的数据库中,比如web、bbs、blog等库。

      分库解决的是数据库端 并发量的问题。分库和分表并不一定两个都要上,比如数据量很大,但是访问的用户很少,我们就可以只使用分表不使用分库。如果数据量只有1万,而访问用户有一千,那就只使用分库。

    参考:https://blog.csdn.net/qq_21993785/article/details/81017671?utm_source=copy 

              https://www.jianshu.com/p/dd33991f7fdf



  • 相关阅读:
    两种称谓
    HDU 1074

    Educational Codeforces Round 44
    nowcoder—Beauty of Trees
    nowcoder-练习赛16
    c++作业-8
    差的东西
    nowcoder-挑战赛14
    BZOJ2548 [CTSC2002] 灭鼠行动
  • 原文地址:https://www.cnblogs.com/ytc6/p/9712107.html
Copyright © 2011-2022 走看看