对于像我这样的小博客网站来说,日访问量仅百余,找个普通的主机托管完全可以满足需要,实在是不必过多考虑后端的问题。然而,腾讯网易这样的门户网站、淘宝这样的购物交易网站、人人网新浪微博等主要流行的社交网络应用,则不得不运用多种技术设计后端架构,才能支撑起百万甚至上亿级别的访问。

这里我在一个high level例举我所了解到的提升服务性能的相关技术,其中的每一项都可以展开讨论,有空我会专门详细整理一下和大家探讨。

  1. 负载均衡。多核心CPU现在已经广泛应用,但很多应用程序仍旧采用单进程(线程)的多路复用模型,同一时间只有一个CPU为这个进程(线程)服务,并不能充分发挥CPU的计算能力。我们可以想到的一个方案就是在不修改源码的条件下,在服务器上运行两个服务程序的实例(例如数据库实例),当然这个时候服务端口应该是不同的,然后在其前端放置负载均衡器将流量和连接平均分配到两个服务端口,可以简单的通过DNAT来实现负载均衡。提高单个服务器的处理能力终究会达到极限并不是长久之道,并且性价比不高。Google等大型企业都是使用廉价的普通机器组成集群,发挥集群的强大计算能力来提升整体性能。
  2. 镜像。镜像技术可以解决因不同网络接入商和地域带来的用户访问速度差异。例如很多网站在电信和教育网都搭建了镜像站点,数据实时更新或定点更新,保持同步。这其实也是一个负载均衡的手段,比如利用DNS解析针对不同地区的用户将域名指向到不同的IP上,让流量分散至各个不同的服务器。Alteon是一个硬件四层交换产品,价格昂贵但物有所值,能够提供非常优秀的性能和很灵活的管理能力。在软件上,也有HAProxy、LVP等解决方案。
  3. 缓存。Apache等服务器都有缓存机制,也可以用外加的Squid模块进行缓存。我们甚至可以使用内存来代替硬盘存储数据,从而降低读盘产生的延迟。Memcached便是一项缓存磁盘数据在主存的技术。
  4. 分离服务。例如将图片、音频视频从主服务器中分离出去,减轻主服务器的压力。很多大型网站都有独立的图片服务器,甚至有多台图片服务器。而对图片服务器、音视频流的处理则可以针对性地使用不同配置更加优化,比如Apache在配置ContentType时尽量少支持LoadModule,保证更高的系统消耗和执行效率。
  5. 数据库设计。同样可以将web服务和数据库服务分离,这也是典型部署方式。使用数据库集群和对象缓存策略,可以承载较大的访问量,比如2000用户,200个并发,百万级别的数据量。现在业界甚至都在逐渐抛弃关系型数据库,多使用key-value型NOSQL存储方案。
  6. 静态化。动态网页总是需要耗费更多的资源,例如要查询数据库,要即时计算生成页面等等。而消耗最小的就是纯静态的html页面,尽量使用静态页面这也是提升性能最简单最有效的手段。可以看到wordpress给每篇文章都分配了一个固定html链接,这其实是针对SEO的伪静态。真正的静态是像高访问流量的门户网站们做的那样,不是从数据库中读取新闻内容,而是真正地自动生成静态html网页,这也有利于缓存。对于系统中频繁使用数据库查询但是内容更新很小的应用,就可以考虑使用html静态化,这样可以避免大量的数据库访问请求。甚至对于社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop大杂烩、网易社区等都是如此。

未完待续。欢迎提供补充。