最近一直再看网站的架构拓展和优化方面的文章,受益匪浅,加上自己的经验,梳理下。

数据库(MySQL)

当数据库的数据量很大的时候,一台机器已经无法满足的时候,我们会采用分库和分表的方法来解决。 怎么确定到底是分到哪个库和哪个表呢?

  • 取模,比如通过ID取模,确定分到对应的库和表。
  • 根据数量级划分库和表。这么做对于取模来说有优势,就是可扩展性高,万一后期数据量增加。

分库分表的话,一般会用DB Proxy的思路。部分库会有从库,用来备份,读写分离或者它用。 查询时减少join,sort等操作,加入limit,减少多余查询。减少查询次数,使用in操作。

Cache

Cache 可以缓存页面,数据。而大多应用 Cache 去缓存经常需要从数据库中查询的数据。 缓存并不是用的越多越好,而是要用得妙。什么叫妙呢?假如我们把很多无用的值,字段缓存到 Cache 中,那每次读写都需要花费时间,而且占用空间。妙就在于,只把有用的值写道 Cache 中。我曾经有一次把N个对象直接写到 Cache 中,导致很慢,修改后提高了好几秒。对于很多数据,可以批量读写,以提高速度。 用 Cache 的时候一定要记住一个词:命中率,可以通过打 log 看看命中率,以调整 Cache 策略。 有必要的时候将 Cache 设为长连接。当然,Cache 也可以分库。

怎么读写 Cache?

get的时候set,get的时候del

Web Server

很多人都会纠结到底使用哪个 Web Server,Apache?Nginx?Lighttpd?Squid?Resin? 太多太多可以选择的,到底使用哪个呢?几乎所有的 Web Server 可以分为两种:IO密集型和CPU密集型

  • IO密集型:Squid,Nginx
  • CPU密集型:Apache,Resin,Lighttpd

静态文件

最基本的将小图片合成大图片,一次请求。JS 文件进行压缩。 其次,使用 CDN 加速服务。如果有更大量的图片,可以使用开源的分布式文件系统。

终极绝招

加硬件~~~