每一个可以努力的日子,都是一份厚礼。
大型网站的后端架构设计
对于像我这样的小博客网站来说,日访问量仅百余,找个普通的主机托管完全可以满足需要,实在是不必过多考虑后端的问题。然而,腾讯网易这样的门户网站、淘宝这样的购物交易网站、人人网新浪微博等主要流行的社交网络应用,则不得不运用多种技术设计后端架构,才能支撑起百万甚至上亿级别的访问。
这里我在一个high level例举我所了解到的提升服务性能的相关技术,其中的每一项都可以展开讨论,有空我会专门详细整理一下和大家探讨。
- 负载均衡。多核心CPU现在已经广泛应用,但很多应用程序仍旧采用单进程(线程)的多路复用模型,同一时间只有一个CPU为这个进程(线程)服务,并不能充分发挥CPU的计算能力。我们可以想到的一个方案就是在不修改源码的条件下,在服务器上运行两个服务程序的实例(例如数据库实例),当然这个时候服务端口应该是不同的,然后在其前端放置负载均衡器将流量和连接平均分配到两个服务端口,可以简单的通过DNAT来实现负载均衡。提高单个服务器的处理能力终究会达到极限并不是长久之道,并且性价比不高。Google等大型企业都是使用廉价的普通机器组成集群,发挥集群的强大计算能力来提升整体性能。
- 镜像。镜像技术可以解决因不同网络接入商和地域带来的用户访问速度差异。例如很多网站在电信和教育网都搭建了镜像站点,数据实时更新或定点更新,保持同步。这其实也是一个负载均衡的手段,比如利用DNS解析针对不同地区的用户将域名指向到不同的IP上,让流量分散至各个不同的服务器。Alteon是一个硬件四层交换产品,价格昂贵但物有所值,能够提供非常优秀的性能和很灵活的管理能力。在软件上,也有HAProxy、LVP等解决方案。
- 缓存。Apache等服务器都有缓存机制,也可以用外加的Squid模块进行缓存。我们甚至可以使用内存来代替硬盘存储数据,从而降低读盘产生的延迟。Memcached便是一项缓存磁盘数据在主存的技术。
- 分离服务。例如将图片、音频视频从主服务器中分离出去,减轻主服务器的压力。很多大型网站都有独立的图片服务器,甚至有多台图片服务器。而对图片服务器、音视频流的处理则可以针对性地使用不同配置更加优化,比如Apache在配置ContentType时尽量少支持LoadModule,保证更高的系统消耗和执行效率。
- 数据库设计。同样可以将web服务和数据库服务分离,这也是典型部署方式。使用数据库集群和对象缓存策略,可以承载较大的访问量,比如2000用户,200个并发,百万级别的数据量。现在业界甚至都在逐渐抛弃关系型数据库,多使用key-value型NOSQL存储方案。
- 静态化。动态网页总是需要耗费更多的资源,例如要查询数据库,要即时计算生成页面等等。而消耗最小的就是纯静态的html页面,尽量使用静态页面这也是提升性能最简单最有效的手段。可以看到wordpress给每篇文章都分配了一个固定html链接,这其实是针对SEO的伪静态。真正的静态是像高访问流量的门户网站们做的那样,不是从数据库中读取新闻内容,而是真正地自动生成静态html网页,这也有利于缓存。对于系统中频繁使用数据库查询但是内容更新很小的应用,就可以考虑使用html静态化,这样可以避免大量的数据库访问请求。甚至对于社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop大杂烩、网易社区等都是如此。
未完待续。欢迎提供补充。
这篇文章由lovelucy于2011-04-07 16:40发表在后端架构。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。除特殊说明外文章均为本人原创,并遵从署名-非商业性使用-相同方式共享创作协议,转载或使用请注明作者和来源,尊重知识分享。 |
批评不自由
则赞美无意义
Mozilla Firefox 41.0 Mac OS X 10.10 大约9年前
查了下php5.5之后的版本在编译安装的时候可以加上 -enable-opcache选项, php 的功能越来越强大了
Mozilla Firefox 41.0 Mac OS X 10.10 大约9年前
php 里面可以用使用 op 缓存,如 xcache,把php的操作码缓存下来。
对于有搜索功能的可以使用第三方的工具,sphinx 全文检索,避免sql 里面的like 语句。
Google Chrome 45.0.2454.101 Mac OS X 10_10_5 大约9年前
php5.5 以后,就自带 Zend opcache 缓存了