2019独角兽企业重金招聘Python工程师标准>>>
架构演进面临的挑战及解决思路
——来自《10分钟搞懂互联网系统演进规律:支撑亿级用户的架构都是这样来的!》
互联网主要面对的技术挑战,用一句话概括:就是用户不断上升产生的并发访问压力以及数据存储压力,所以系统需要更强的处理能力才能解决这些问题。
而系统处理能力提升,主要有两种途径:
1.垂直伸缩:
提升单台服务器的处理能力,比如用更快频率的cpu,用更多核的cpu,用更大的内存,用更快的网卡,用更多的磁盘组成一台服务器,使单台服务器的处理能力得到提升,通过这种手段提升系统的处理能力。
缺点如下:
a.当垂直伸缩达到一定程度以后,继续增加计算需要花费更多的钱。
b.垂直伸缩是有物理极限的,即使是大型机,也有自己的物理极限,它不可能无限地伸缩下去的。
c.操作系统的设计或者应用程序的设计制约着垂直伸缩,最多只能达到一个点无法继续提高。
在大型互联网出现之前,传统的软件,比如银行、电信这些企业的软件系统,主要是使用垂直伸缩这种手段实现系统能力提升的,在服务器上增强,提升服务器的硬件水平。当某种类型的服务器能力提升到了瓶颈以后,就会用更强大的服务器,比如说从服务器升级到小型机,从小型机提升到中型机,从中型机提升到大型机,服务器越来越强大,处理能力越来越强大,当然价格也越来越昂贵,运维越来越复杂。
2.水平伸缩:
单机的处理能力并不提升,也不使用更昂贵的更快的更厉害的硬件,而是通过更多的服务器,将这些服务器构成一个分布式集群,通过这个集群,统一对外提供服务,以此来提高系统整体的处理能力。
水平伸缩优点:
a.只要架构合理,能够添加服务器到集群中,你的系统就是永远可以正常运行。
b.它没有极限,它的成本也不会说到了某个临界点就突然增加。而且逐渐的增加服务器,获得相同的计算处理能力,只会比以前的服务器更便宜,不会更贵,因为硬件的价格总是在不断地下降的。
c.应用程序运行在一个服务器上,是为单一服务器而设计的,而增加服务器的话只是让程序部署在更多的服务器上,所以也不需要对应用程序进行太多的改变,应用程序不会受到硬件制约。
在互联网行业中多采用水平伸缩的手段。
一、大型网站软件系统的特点
- 高并发、大流量:PV量巨大
- 高可用:系统7*24小时不间断服务
- 海量数据:文件数目巨大
- 用户分布广泛,网络情况复杂:运营商网络难互通
- 安全环境恶劣:黑客攻击
- 需求快速变更,发布频繁:快速适应市场,满足用户需求
- 渐进式发展:慢慢地运营出大型互联网站
二、大型网站架构演化发展历程
2.1、初始阶段的网站架构
应用程序、数据库、文件等所有的资源都集中在一台服务器上,典型案例:基于LAMP架构的PHP网站。
如果用户访问量越来越多,会导致性能越来越差,数据存储空间不足。
2.2、应用服务和数据服务分离
随着业务发展,单台服务器不再满足需求,将应用和数据分离后成三台服务器(应用服务器、文件服务器和数据库服务器)。应用服务器需要处理大量的业务,因此需要更快更强大的CPU;数据库服务器需要快速磁盘检索和数据缓存,因此需要更快的磁盘和更大的内存;文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘。
当用户访问巨大,会导致数据库压力太大,访问延迟,影响网站性能,用户体验差。
2.3、使用缓存改善网站性能
网站访问特点80%的业务访问集中在20%的数据上,因此可以通过使用缓存的方式,减少数据库的访问压力,提高网站的数据访问速度。缓存分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存。本地缓存访问速度快,但缓存数据量有限;远程分布式缓存可以使用集群方式,容量不受限制。
单一应用服务器能够处理的请求连接有限,在网站访问高峰期,应用服务器会成为整个网站的瓶颈。
2.4、使用应用服务器集群改善网站的并发处理能力
使用集群是网站解决高并发、海量数据问题的常用手段。改善系统性能,从而实现系统的可伸缩性。通过负载均衡调度服务器,可以将用户的访问请求分发到集群中的任何一台服务器上,使应用服务器的负载压力不再成为网站的瓶颈。
2.5、数据库读写分离
网站在使用缓存后,绝大部分数据读操作访问都可以不通过数据库就能完成,但仍有一部分读操作(缓存访问不命中、缓存过期)和全部的写操作需要访问数据库,在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。
大部分主流数据库都提供主从热备功能,通过配置两台数据库主从关系,将一台数据库服务器的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。
2.6、使用反向代理和CDN加速网站响应
CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。
使用CDN和反向代理的目的都是尽早返回数据给用户,一方面加快用户访问速度,另一方面也减轻后端服务器的负载压力。
2.7、使用分布式文件系统和分布式数据库系统
随着网站业务的发展,两台数据库服务器仍然无法满足需求,文件系统也一样。分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。不到不得已,网站更常用的数据库拆分手段是业务分库,将不同业务的数据库部署在不同的物理服务器上。
2.8、使用NoSQL和搜索引擎
随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系型数据库技术如NoSQL和非数据库查询技术如搜索引擎。NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的支持。应用服务器则通过一个统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
2.9、业务拆分
通过分而治之的手段将整个网站业务分成不同的产品线,如淘宝将首页、商铺、订单、卖家、买家等拆分成不同的产品线,分归不同的业务团队负责。各个应用之间可以通过建立一个超链接建立关系,也可以通过消息队列进行数据分发。
2.10、分布式服务
既然每一个应用系统都需要执行许多相通的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。
三、大型网站架构演化的价值观
3.1、大型网站架构技术的核心价值是随网站所需灵活应对
大型网站架构技术的核心价值不是从无到有搭建一个大型网站,而是能够伴随小型网站业务的渐进发展,慢慢地演化成一个大型网站。
3.2、驱动大型网站架构技术发展的主要力量是网站的业务发展
业务成就了技术,事业成就了人,而不是相反。
四、网站架构设计误区
4.1、一味追随大公司的解决方案
大公司的经验和成功模块值得学习借鉴,但不能盲从。
4.2、为了技术而技术
技术是为业务而存在的,除此毫无意义。
4.3、企图用技术解决所有问题
技术是用来解决业务问题的,而业务的问题,也可以通过业务的手段去解决。比如12306真正的问题其实不在于它的技术架构,而在于它的业务架构。