大型网站架构演变之9大阶段 什么是大型网站

前言
我们以Java Web为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变 。
该系统具备的功能:

  • 用户模块:用户注册和管理
  • 商品模块:商品展示和管理
  • 交易模块:创建交易和管理
正文
阶段一、单机构建网站
网站的初期,我们经常会在单机上跑我们所有的程序和软件 。此时我们使用一个容器,如Tomcat、Jetty、Jboss,然后直接使用JSP/Servlet技术,或者使用一些开源的框架如Maven + Spring + Struts + Hibernate、Maven + Spring + Spring MVC + Mybatis 。最后再选择一个数据库管理系统来存储数据,如MySQL、SqlServer、Oracle,然后通过JDBC进行数据库的连接和操作 。
把以上的所有软件包括数据库、应用程序都装载同一台机器上,应用跑起来了,也算是一个小系统了 。此时系统结果如下:
阶段二、应用服务器与数据库分离
随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,在服务器还没有超载的时候,我们应该就要做好准备,提升网站的负载能力 。假如我们代码层面已难以优化,在不提高单台机器的性能的情况下,采用增加机器是一个不错的方式,不仅可以有效地提高系统的负载能力,而且性价比高 。
增加的机器用来做什么呢?此时我们可以把数据库服务器和Web服务器拆分开来,这样不仅提高了单台机器的负载能力,也提高了容灾能力 。
阶段三、应用服务器集群
随着访问量继续增加,单台应用服务器已经无法满足需求了 。在假设数据库服务器没有压力的情况下,我们可以把应用服务器从一台变成了两台甚至多台,把用户的请求分散到不同的服务器中,从而提高负载能力 。而多台应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务 。著名的做故障切换的软件有KeepAlived,KeepAlived是一个类似于Layer3、4、7交换机制的软件,他不是某个具体软件故障切换的专属品,而是可以适用于各种软件的一款产品 。KeepAlived配合上ipvsadm又可以做负载均衡,可谓是神器 。
系统演变到这里,将会出现下面四个问题:
  1. 用户的请求由谁来转发到到具体的应用服务器?
  2. 有那些转发的算法和策略可以使用?
  3. 应用服务器如何返回用户的请求?
  4. 用户如果每次访问到的服务器不一样,那么如何维护session的一致性?
针对以上问题,常用的解决方案如下:
1、负载均衡的问题
一般以下有5种解决方案:
1、HTTP重定向
HTTP重定向就是应用层的请求转发 。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群
  • 优点:简单易用;
  • 缺点:性能较差 。
2、DNS域名解析负载均衡
DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP 。
  • 优点:交给DNS,不用我们去维护负载均衡服务器;
  • 缺点:当一个应用服务器挂了,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务商那里,网站无法做更多的改善和更强大的管理 。
3、反向代理服务器
在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器 。常用的Apache,Nginx都可以充当反向代理服务器 。