目前应用商店上的很多社交应用,网游的后台服务都是分布式服务。那么究竟是什么催生了今天的分布式系统呢?文章的主要内容是谈谈大型网站服务架构的演进。01起步阶段的网站结构在互联网方兴未艾的互联网时代,网站基本上都是小网站。网站访问者不多,应用程序、数据库、文件等所有资源通常都在一台服务器上。这里我们以JavaWeb服务为例。网站开发者可以使用Tomcat等Web容器直接运行JSP程序,然后将数据存储在数据库中,文件直接存储在服务器的磁盘中。就像这样:02应用服务与数据分离随着网站业务的发展和用户数量的增加,一台服务器已经不能满足需求。大量的用户访问导致访问速度越来越慢,逐渐增加的数据也会导致存储空间不足。这时候就需要将Web应用和数据分离,分别存放在不同的服务器上:应用服务器、文件服务器和数据库服务器。这样不仅提高了单机的负载能力,也提高了容灾能力。03使用缓存提升网站性能随着用户的增多,网站将面临另一个挑战:数据库压力过大导致整个网站的访问效率进一步下降,用户体验受到影响。对于一个网站,80%的业务访问通常集中在20%的数据上。然后将这一小部分经常读取的数据提前缓存在内存中,而不是每次都去数据库读取。这样可以减轻数据库的访问压力,从而提高整个网站的访问速度。缓存分为本地缓存和分布式缓存服务器。前者速度较快但容量有限,而后者理论上可以扩展和扩大容量。04使用集群提升并发处理能力使用缓存后,数据访问压力得到缓解。但是,单个应用服务器能够处理的请求连接是有限的。在网站访问高峰期,应用服务器成为整个网站的效率瓶颈。因此,使用负载均衡处理器是必然的。通过负载均衡调度服务器,可以将浏览器的访问请求分发到应用集群中的任意一台服务器上。使用服务器集群的另一个好处是Web应用程序更新可以不被用户注意到。大多数应用程序使用软件来实现负载平衡。常见的软件有Nginx等。05数据库读写分离当用户量达到一定规模时,数据库由于负载压力大,成为网站的瓶颈。虽然之前使用缓存可以满足查询需求,但是大部分数据操作还是需要通过数据库来完成。目前主流数据库都提供主从热备份功能。通过配置两个数据库之间的主从关系,可以将一个数据库的数据更新同步到另一台服务器上。网站利用数据库的功能,实现数据库的读写分离,从而改善数据库的负载压力。应用服务器在写入数据时访问主库,主库通过主从复制机制将数据更新同步到从库,这样应用服务器在读取数据时,就可以从从库获取数据。为了方便应用程序访问读写分离的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库的读写分离对应用程序透明。06反向代理和CDN加速随着网站知名度的提高,用户规模的增加,网站业务不断增长。为了满足不同地区用户快速访问网站的需求,需要提高网站的访问速度。主要手段是使用CDN和反向代理。同时,随着Ajax技术的出现,Web应用程序将把数据(内容和图片)和页面框架(指HTML文件和其中的标签)结合起来。页面框架的内容存储在CDN服务器上,数据存储在数据库服务器上。当用户使用浏览器访问网站时,会显示页面框架,然后页面框架会发起HTTP请求加载数据。反向代理部署在网站中心机房。当用户请求到达中心机房时,首先访问反向代理。如果反向代理缓存了用户请求的资源,则直接返回给用户。所以CDN和反向代理的基本原理就是缓存。07分布式文件系统和分布式数据库系统的使用任何强大的单一服务器都无法满足大型网站不断增长的业务需求。分布式数据库是最好的网站数据库拆分方式,只有在单表数据量很大的情况下才会使用。在不到万不得已的情况下,网站的数据库拆分更常见的方法是业务拆分,将不同业务的数据部署在不同的物理服务器上。08使用NoSQL和搜索引擎随着网站业务越来越复杂,对数据存储和检索的要求也越来越复杂。网站需要使用一些非关系型数据库技术如NoSQL数据库和非数据库查询技术如搜索引擎。常见的NoSQL数据库有Mongodb、HBase等。09业务拆分大型网站为了应对日益复杂的业务场景,采用分而治之的方式将整个网站业务拆分成不同的产品线。例如,大型购物交易网站会将首页、店铺、订单、买家、卖家等拆分成不同的产品线,分配给不同的业务团队。10分布式服务随着业务拆分越来越小,存储系统越来越大,应用系统整体复杂度呈指数级增长,部署和维护难度越来越大。由于每个应用系统都需要进行很多相同的业务操作,比如用户管理、商品管理等,所以这些共享服务可以抽取出来独立部署。这些可重用的服务与数据库相连,提供通用的业务服务,而应用系统只需要管理用户界面,通过分布式服务调用通用的业务服务即可完成特定的业务操作。大型网站的架构进化到这个地步,基本上大部分技术问题都可以解决。
