02-一遍文章读懂大型网站的架构演进——分布式系统常用解决方案(一)

        在上一章节中我们了解了分布式系统的相关内容,对分布式系统有了一个初步认识,但是只停留在理论层面上,这一章节我们将讨论大型网站的演进过程。即随着用户量以及业务量的不断增加,网站规模越来越大,就需要不断更新技术架构,是网站能够满足日益增长的业务需求。

        我们将根据一个网站的发展来展开今天对大型网站架构的讨论,下面我们将重点讨论大型分布式网站需要哪些技术的支撑,才能应对日益增长的业务处理需求。


1、首先我们需要做一个交易类的网站,网站内容基本包含以下内容。

  • 用户注册登录、管理、信息维护等
  • 商品展示、维护
  • 订单、购物车、结算等
  • 。。。

        有了这些模块之后,我们的网站可以访问了,也能完成一些交易,基本架构就是一个应用程序包含所有模块,并且访问本机的数据库。

2、单机负载告警,数据库与应用分离

        当我们的网站被推广后,用户越来越多,但是单机的访问最大限度只能支持少量用户在线,服务器负载持续增高。这是我们应该考虑将应用和数据库分离开来,即应用和数据库部署在不同机器上,通过网络获取和保存数据。两台服务器分别运行数据库和应用,性能得到了提成。

3、应用服务器告警、集群部署

        对着业务量的增大,应用所在的服务器最大支持的并发数是有限的,当超过这个并发数后,系统就会出现变慢、响应时间长等问题,甚至宕机。这是我们应该考虑将应用服务器由一台变为多台,采用集群部署的方式。让多台服务器共同处理用户的请求,这样我们的网站性能一下提升了很多倍。

集群部署架构图

        这是我们就会想到有以下问题需要解决:

  • 如何将用户请求均衡的分发至集群中的各个服务器?
    • 通过DNS和增加负载均衡设备来解决,这里我们采用负载均衡来解决。即用户先来请求负载均衡服务器,负载均衡服务器会决定将这次请求转发至集群中的哪一台应用服务器,这里涉及到负载均衡算法,我们后面在做讨论。
    • 负载均衡算法:轮询、加权轮询、随机、加权随机、原地址哈希法、最小连接数法,关于这六种负载均衡算法请参考我的其他博客:https://blog.csdn.net/xulong_08/article/details/81360196
    • 添加负载均衡后的网站架构如下图所示

  • 负载均衡每次讲请求转发至不同服务器,如何解决Session的问题?关于Session共享的解决方案,我将专门写一遍文章来详细介绍,敬请期待!
    • Session Sticky:通过源地址哈希法,将同一客户端的所有请求都转发至同一个服务器去处理,这样就能保证每次请求都在同一机器上。
    • Session Replication:在服务器中配置Session共享,用户登陆后,立即将Session复制到集群中的每一台服务器上,这样用户的每次请求无论转发至哪一台机器,都可以获取到用户Session信息。
    • Session集中存储:将session的信息保存至其他缓存服务器,需要session信息时,从缓存服务器上获取,这样每一台机器都可以方位缓存服务器,都能获取到session信息。
    • Cookie Based:将Session信息保存到Cookie中,用户每次请求都从Cookie中获取,这样也能保证每次请求无论在那台服务器上,都可以获取到session信息。
  • 解决了以上问题,我们网站变成了集群模式,大大提高了所能承受的并发数量。

4、数据库压力变大,读写分离

经过集群部署方式,我们的网站接受了大量的用户请求,但是所有的应用服务器都连接到单机数据库上,数据库的数据量和访问量都在大量增长。经过分析,我们会发现大部分网站的业务都是读多写少,这样我们可以考虑将数据库使用读写分离的方式来部署。即将数据库部署在多台服务器上,一部分承担读库的工作、一部分承担写库的工作。

数据库读写分离

这种方式提高了数据库读写性能,但是有以下问题需要解决:

  • 我们需要保读库和写库数据一致,存在数据复制问题,既要保证时效性还要保证准确性。大部分的数据库系统都提供了数据的复制机制,但是当有大量更新时,复制过程中会有一些延迟。
  • 读写分离后,需要在应用中的读写业务选择不同的数据源。

读写分离并非只局限在数据库层面,有更多的场景可以利用读写分离解决数据库压力,即将原有数据库中数据提前加载到其他地方,不直接读取数据库中的数据。例如,搜索引擎就可以看做一个读库。

搜索引擎可减少一些数据库压力,可看做读库

5、使用缓存增加数据读取速度

尽管到目前为止我们的网站可支持大量并发了,但是作为一个大型网站需要注重用户体验,要求高并发情况下快速响应,并且需要考虑到数据库负载问题,尽管我们已经使用来了读写分离,但是数据库的性能似乎总存在一个瓶颈,很难得到大幅度提升。我们应该寻找一种能够减少数据库压力并且能够快速读取的数据替代品。这时缓存应运而生,缓存直接读取内存中数据,速度要比硬盘中快得多,我们可以将一部分常用的数据存在缓存在,这样就不用每次使用这些数据都到数据库中查询了,大大减少了数据的读操作。

加入缓存后的网站架构图

由于缓存存取速度相当快,应用范围逐渐扩大,不仅用于数据缓存,还要用于页面缓存、公共存储等

  • 数据缓存:以Key-Value的形式存储,由于缓存空间有些且昂贵,所以只存储一些热点数据,使用缓存应该注意不能影响正常的业务逻辑,在读取数据时先判断缓存中是否存在。还要注意数据修改的同步问题。
  • 页面缓存:对于访问量特别大的页面,比如首页,就可以缓存整个页面,直接返回给用户。
  • 公共存储:对于一些集群中需要共享的数据,如Session集中存储方式中,可使用缓存存贮session信息。

这边文章就先写到这,本文中我们共讨论了应用于数据库分离、集群、读写分离、缓存这几种大型网站的解决方案,如果你有任何疑问或者建议,请留言或通过邮件联系我:[email protected]

下一章节我们将讨论分布式存储系统、数据库拆分、应用拆分、服务化、消息中间件等内容。。。敬请期待^v^

猜你喜欢

转载自blog.csdn.net/xulong_08/article/details/81359364
今日推荐