一个高性能,高并发,高可用的系统是如何演变来的

文章来自:PHP自学中心


大型电商系统或社交网站的系统架构从一开始就没有设计具有完整的高性能,高可用性,高可伸缩性等特性的。它是随着用户的增加和业务功能的扩展,逐步演变和完善起来的。

在此过程中,开发模式,技术体系结构和设计思想都发生了很大的变化。因此,随着业务的扩展,成熟的系统体系结构将逐渐得到改善。

例如淘宝,解决海量商品信息的搜索,订购和支付问题;例如腾讯,解决了亿万用户的实时消息传输。百度处理大量搜索请求。

他们都有各自的业务特性,系统架构也有所不同。不过我们也可以从这些不同的网站背景中,找出其中广泛运用在这些系统里共用的技术手段

下面我们可以通过介绍大型网站系统的演化过程,来认识这些技术。

1 最开始的网站架构

一个网站的最初开始,每个开发者都接触过。每个应用程序,数据库,静态文件等都会部署在一个服务器里。流量基本很小的网站,比如个人网站,博客等就可以这样部署。如图:

图片

2 应用、数据、文件分离

业务的扩展与需要,访问流量多了一点,一台服务器已经不能满足性能需求,这个时候我们就要把应用程序,数据库,文件等各自部署到独立的服务器上各自管理。并且根据用途配置不同的硬件。

这样就达到了满足性能需求的最佳效果了。基本小型企业,业务每天流量不到1w的都可以算是最佳的。如图:

图片

3 缓存改善网站性能

每个开发者在遇到性能瓶颈或者硬件性能有效的时候基本都会想到用缓存改善网站性能,经常用到的Nosql如:Memcached,Redis

使用缓存主要源于热点数据的存在,为了减少热点数据的访问路径与提高用户体验,我们可以对热点数据进行缓存,提高网站性能。

缓存实现的方式有:本地缓存,分布式缓存,还有 CDN、反向代理。

1 本地缓存:速度快,根据本地空间缓存数据量。

2 分布式缓存:Memcached、Redis

图片

4 使用集群改善应用服务器性能

集群就是同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事),那我们就可以用负载均衡来解决相应的问题,提高性能。

方式:常用的负载均衡技术硬件的有 F5,价格比较贵,软件的有 LVS、Nginx、HAProxy。

LVS 是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx 和 HAProxy 是七层负载均衡,可以根据报文内容选择内部服务器。

因此 LVS 分发路径优于 Nginx 和 HAProxy,性能要高。而 Nginx 和 HAProxy 则更具配置性,如可以用来做动静分离,比如根据请求报文特征,来选择静态资源服务器还是应用服务器。

应用服务器是网站的入口,会承载大量的请求,我们就在应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。如图:

图片

5 数据库读写分离和分库分表

这个相信大家都听过,但是会不会就不知道了。详细可以查看这篇文章:【进阶】Mysql分库分表方案,如何分,怎样分?

分库分表分为水平切分和垂直切分两种。

1 水平切分是对一个数据库特大的表进行拆分,例如用户表。

2 垂直切分则是根据业务的不同来切分,比如用户业务、商品业务相关的表放在不同的数据库中。

一个网站的流量的增加,也就是用户访问量的增加,访问量的增加则数据库就会成为最大的瓶颈。

然而改善数据库的性能,我们常用的手段是对数据库进行读写分离和分库分表。实现数据同步从而改善数据库性能。如图

图片

6 使用分布式文件系统

什么是分布式文件系统:分布式文件系统的全部不在同一台计算机,而是分散布置在多台计算机上。所以多个分散的小文件系统组合在一起,形成一个完整的文件系统。

分布式的特点:分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。

这里使用到分布式文件系统,想想就知道了,用户每天都在增加,业务量越来越大,而产生的文件越来越多,单台的文件服务器已经不能满足需求,这时就需要分布式文件系统的支撑。常用的分布式文件系统有 GFS、HDFS、TFS。具体就不介绍了。看图:

图片

7 使用 CDN 和反向代理提高网站性能

这一点也是很重要的。假如我们的服务器都部署在广州的机房,对于广东的用户来说访问是非常快的,而对于北京的用户访问就是较慢的了。

北京用户访问需要通过互联路由器经过较长的路径才能访问到广州的服务器,返回路径也一样,所以数据传输时间比较长。这个时候我们想到的就是:使用CDN解决。

CDN的特点就是将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,大减少了网络访问的路径。从而提高访问速度。

反向代理是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户。

如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取数据的成本。反向代理的话我们经常用到Nginx。

配置与部署具体可以查看文章:PHP使用Nginx实现反向代理,学一学吧

图片

8 将应用服务器进行业务拆分

随着业务进一步扩展,应用程序变得非常臃肿,我们就要将应用程序进行业务拆分。看到这里,小编建议你去看看:集群,分布式与微服务有什么区别。

为了应对日益复杂的业务场景,将整个系统业务分成不同的应用模块,应用之间通过超链接建立关系,业务之间通过消息进行通信或者共享数据库来实现。

纵向拆分:

  1. 将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统;

  2. 纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。

横向拆分:

  1. 将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务;

  2. 横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。

图片

9 业务拆分后演变为分布式服务

根据上面对应用程序进行横向拆分后,各个业务应用就独立部署起来了。各个应用都有独自的业务服务,而这些业务服务抽取出来利用分步式服务框架搭建分布式服务。

举例:分布式服务有:用户服务,商品服务,购物车,订单服务,支付与安全服务等。

图片

总结一下

随着网站的架构的设计,业务功能的扩展,最后演变成一个高性能,高可用,高伸缩,可扩展,可维护的分布式系统。

逐渐运用到的技能基本都涉及到了:文件分离,分布式缓存,负载均衡,集群,数据库读写分离,分库分表,分布式文件系统,反向代理,业务拆分,微服务等。

我想说的是一个高级程序员就必须具备这些技能吧。

本作品采用《CC 协议》,转载必须注明作者和本文链接
程序员的福利:免费获取 JetBrains 全家桶激活码 推荐:【点击这里获取 。。。激活码适用:AppCode, CLion, DataGrip, DataSpell, dotCover, dotMemory, dotTrace, goland, IntelliJ IDEA Ultimate, phpstorm, pycharm, ReSharper
Laravel00
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
资深程序猿 @ XX科技
文章
62
粉丝
37
喜欢
249
收藏
573
排名:282
访问:3.3 万
私信
所有博文
社区赞助商