网站的扩展和优化
最近一直再看网站的架构拓展和优化方面的文章,受益匪浅,加上自己的经验,梳理下。
数据库(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 加速服务。如果有更大量的图片,可以使用开源的分布式文件系统。
终极绝招
加硬件~~~