大型网站技术架构之架构演化发展历程
前言:大部分来自《大型网站技术架构》,小部分来自个人见识,欢迎指正。
1.初始阶段:
最开始的时候,基本上就只有一个服务器。所有的资源,如:应用程序、数据库、文件等都在一台服务器上。这个时候基本还没什么访问量,或者说是处于开发阶段,还没有正式上线部署应用,所以计算、运行等资源还不用太多。
2.应用数据和数据服务分离
等到应用上线了之后,访问量会变得越来越多。这个时候一台服务器的不足之处或者说最开始的架构不合适的地方就会彰显出来。最明显的可能是存储和访问或响应速度,这个时候就要开始考虑优化最开始的架构和增加一些硬件资源了。可以将应用数据和数据服务分离,最简单粗暴的就是增加服务器,可以将资源拆分部署到不同的服务器,比如:应用服务器、数据库服务器和文件服务器。
当然,对于这三种服务器来说,各自的功能不同,所以对硬件的要求是不同的。比如应用服务器的话要处理大量的业务逻辑,所以对CPU要求比较高;文件服务器主要是存储用户上传的文件,所以对存储要求比较高,所以需要比较大的硬盘;而数据库服务器则对数据的写和读要求比较高,所以对内存要求比较高。
目前看来,这个架构还是比较稳定的,可以应对一定的访问量。但是一旦用户又多了起来,数据库的压力会比较大,导致访问可能延迟,所以还需要继续优化。
3. 使用缓存改善性能
在今天,缓存这个概念相信对于大家都不难理解,顾名思义就是缓存数据的,减轻数据库的压力。对于任何一个网站来说,总有一些业务是需求比较大,即有些功能用的比较多的,比如:对于淘宝来说,那些好评高的商品会访问比较多;对于百度,热门搜索会比较多,所以对于这部分数据,可以将他们放入缓存,减轻数据库的压力。
网站使用的缓存主要分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。本地缓存会跟应用争资源,所以不是很提倡。远程分布式缓存服务器可以使用集群的方式,部署大内存的服务器作为专门的缓存服务器。
常用的缓存数据库有Redis,memcached,mangodb等,其中,Redis的应用是最广泛的,它是非关系型数据库,即nosql,其实可以理解为不止数据库,主要是存放键值对,性能非常好,可以大大减轻数据库压力。
使用缓存之后可以减轻数据库的访问压力,但是对于单一应用服务器来说,处理的请求是有效的,所以达到一定访问量的时候,应用服务器会成为整个网站的瓶颈。
4.使用应用服务器集群改善网站的并发处理能力
当一个网站遇到瓶颈的时候,最简单的方式就是增加硬件资源,而对于增加硬件资源,最简单粗暴的就是增加服务器数量,搭建服务器集群。搭建服务器集群还要一个好处就是伸缩性比较好,后面可以直接再增加服务器即可。
可以通过负载均衡调度服务器分发不同的请求到任一应用服务器, Nginx可以实现负载均衡的功能,它还可以对不同的服务器设置不同的权重,即可以设置访问应用服务器的顺序。后面如果请求量再一次增大,可以直接添加新的应用服务器即可。
负载均衡器主要有下面几个作用:
- 通过设置过滤无效请求,可以使用lua或者C语言;
- 提供路由算法,合理分发请求到各个服务器;
- 限流,当用户请求过多的时候可以通过限流来防止服务器宕机。
5.数据库读写分离
在上面我们说过使用缓存减轻数据库压力,但是有时候一些特殊情况,比如缓存没命中(多线程情况下,参照:这个)或者缓存时间过期等,会导致一部分读操作和所有的写操作还是会访问数据库,这个时候数据库的访问压力还是很大。所以到了后期,我们需要优化数据库。比较常见的就是进行主从分离,将一台数据库的数据更新同步到另一台数据库。使用这个特点,可以实现数据库读写分离,改善数据库负载压力。
主从数据库分别执行写和读的功能,应用服务器写数据的时候,访问主数据库,然后主数据库同步数据到从数据库,等需要读取数据的时候,即访问从数据库。简单来说,就是主数据库主要执行insert、update和delete操作,而从数据库主要执行select操作。
6.使用反向代理和CDN加速网站响应
随着网站业务的发展,用户规模越来越大,而不同地区、不同设备等因素所影响,导致网速也有所不同,可能会出现访问盐池,网站响应过久等不好的情况。为了提高访问速度,除了增加服务器的带宽,还可以通过反向代理和CDN提高网站访问速度。
这两者的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己比较近的网络供应商的机房获取数据;而反向代理部署在网站的中心机房,当用户请求到达中心机房的时候,首先访问的是反向代理,反向代理会先查看本身是否具有响应用户请求的数据,如果有则直接放回给用户。
个人感觉CDN其实就是有点类似DNS,记录了一些服务器的IP,根据发出请求的IP,查找最近的服务器进行响应。CDN和反向代理一方面是为了提高用户访问速度,一方面也是为了减轻后端应用服务器的负载压力。
7.使用分布式文件系统和分布式数据库系统、NoSql和搜索引擎
后面发展到一定程度的时候,基本上都会对资源进行分布式处理,根据业务,将不同业务的数据库拆分到不同的数据库服务器。而对于数据的存储和检索需求也越来越复杂,所以也会采取NoSql和搜索引擎。
8.业务拆分和分布式服务
现在的分布式和微服务非常火热,当一个网站发展到后期很庞大的时候,就离不开这两者。可以根据不同的业务或者产品线,将一个网站拆分为多个功能模块,部署到不同的服务器上,不同模块之间可以通过消息队列或者服务调用(如dubbo和zookeeper)等实现交互。