ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[info] 分布式架构的演变过程 由单机计算机的架构——>分布式计算机架构 **前言:** * 一个成熟的大型网站系统架构并不是一开始就设计的非常完美的,世上没有完美的架构,也不是一 开始就具备高性能、高可用、安全性等特性,而是随着用户量的不断增加、业务功能的扩展逐步完 善演变过来的。在这个过程中,开发模式、技术架构等都会发生非常大的变化。而针对不同的业务 特征的系统,会有各自的侧重点,比如像淘宝这类网站,要解决的是海量商品搜索、下单、支付等 问题;像腾讯,要解决的是数亿级别用户的实时消息传输;百度所要解决的是海量数据的搜索。每 一类的业务都有自己不同的系统架构。 * 我们以电商系统的发展演变为例,分析架构演变历程。 关注的是数据量、访问量提升,网站结构发生的变化,而不是具体关注业务功能点。其次,这个过 程是为了让大家更好的了,解网站演进过程中的一些问题和应对策略。 * 假如我们系统具备以下功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易及支付结算 ### **第1版应用:单机负载** * 得回忆公司刚创业那会。那是很多年前,那天,公司成立了,老板兴致勃勃的租了一间民宅,买了 一台服务器。然后大伙几个就开干了。 * 大伙把所有软件和应用都部署在一台机器上,这样就完成一个简单系统的搭建,这个时候的讲究的 是效率。 * 我们在一台机子上装了lnmp,下图描述了我们这台服务器: **最初的架构,应用程序、数据库、文件都部署在一台服务器上:** ![](https://img.kancloud.cn/3c/c6/3cc6e6f1115c71de9926e898f98597bb_473x370.png) ### **第2版:单机负载越来越高,数据库服务器和应用服务器分离** * 随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,在服务器还没有超载的时候,我们应 该做好规划,提升网站的负载能力。假如代码层面的优化已经没办法继续提高,在不提高单台机器 的性能,增加机器是一个比较好的方式,投入产出比非常高。这个阶段增加机器的主要目的是讲 web 服务器和 数据库服务器拆分,这样不仅提高了单机的负载能力,也提高了容灾能力。并且根 据服务器的用途配置不同的硬件,达到最佳的性能效果。 **应用、数据、文件分离:** ![](https://img.kancloud.cn/05/20/05207d8f86d8373e8a592388b21017f6_653x425.png) ### **第3版:利用缓存改善网站性能** * 在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技 术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80% 的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问 路径,提高用户体验。 **利用缓存改善网站性能:** ![](https://img.kancloud.cn/db/93/db9340a6192f46075a8d47ff11d944ab_685x639.png) ### **第4版:使用集群改善应用服务器性能** * 随着访问量的继续增加,单台应用服务器已经无法满足需求。在假设数据库服务器还没有遇到性能 问题的时候,我们可以增加应用服务器,通过应用服务器集群将用户请求分流到各个服务器中,从 而继续提升负载能力。此时多台应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提 供服务。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用 服务器节点。 * 另外,我们还可以增加缓存服务器集群, 来提高访问速度并降低mysql等数据库的压力 **应用服务器集群和缓存服务器集群:** ![](https://img.kancloud.cn/a2/3e/a23eac16b8054341610ede2b7e5e7a79_656x422.png) ### **第5版:数据库压力变大,数据库读写分离** * 架构演变到这里,并不是终点。上面我们把应用层的性能拉上来了,但是数据库的负载也在慢慢增 大,那么怎么去提高数据库层面的负载呢?有了前面的思路以后,自然会想到增加服务器。但是假 如我们单纯的把数据库一分为二,然后对于后续数据库的请求,分别负载到两台数据库服务器上, 那么一定会造成数据库不统一的问题。 所以我们一般先考虑读写分离的方式, 。 * 分库分表不是这个阶段要考虑的,是数据库优化的终极技能,因为会带来一些难题,所以能不用就 不用。 **数据库读写分离:** ![](https://img.kancloud.cn/c9/c2/c9c2055e74d5ff73245ed5d79a7f07ae_694x417.png) ### **第6版:使用NoSQL和搜索引擎缓解读库的压力** * 数据库做读库的话,常常对模糊查找效率不是特别好,像电商类的网站,搜索是非常核心的功能, 即便是做了读写分离,这个问题也不能有效解决。那么这个时候就需要引入Nosql和搜索引擎了。 对于海量数据的查询和分析,我们使用NoSQL数据库加上搜索引擎可以达到更好的性能。并不是 所有的数据都要放在关系型数据中。 * 常用的NoSQL有MongoDB、HBase、Redis,搜索引擎有Lucene、Solr、Elasticsearch。 **NoSQL和搜索引擎:** ![](https://img.kancloud.cn/be/1a/be1ae1283aaaf81b4e1d9f3f7420b01b_696x492.png) ### **第7版:使用CDN和反向代理提高网站性能** * 假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访 问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互 联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。 对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近 的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿 * 而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务 器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取 数据的成本。反向代理有Squid、Nginx。 **使用 CDN和反向代理提高网站性能:** ![](https://img.kancloud.cn/6d/0b/6d0bd905a7b230d27b357f1a5d89e2a2_704x522.png) ### **第8版 将应用服务器进行业务拆分** * 随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分 为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信 或者共享数据库来实现。 **业务拆分:** ![](https://img.kancloud.cn/55/0d/550dc9f16379bdc16444e99d911cfc48_682x468.png) ### **第9版 数据库的水平、垂直拆分** * 我们的网站演进的变化过程,交易、商品、用户的数据都在同一个数据库中,尽管采取了增加缓 存,读写分离的方式,但是随着数据库的压力持续增加,数据库的瓶颈仍然是个最大的问题。因此 我们可以考虑对数据的垂直拆分和水平拆分。 **垂直拆分:把数据库中不同业务数据拆分到不同的数据库。** ![](https://img.kancloud.cn/f8/03/f8033428b4afd4bb8a2f6258cfbf6163_626x122.png) **水平拆分:把同一个表中的数据拆分到两个甚至跟多的数据库中,水平拆分的原因是某些业务数据量已平拆分的原因是某些业务数据量已 经** ![](https://img.kancloud.cn/d3/0b/d30b9cfc5b27171c705cd10e0751a3fc_642x173.png) ### **第10版 :服务拆分** * 这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服 务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务 框架搭建分布式服务。 **服务拆分:** ![](https://img.kancloud.cn/8e/9d/8e9d8530a24e09f53f44688938285ac6_687x485.png)