随着互联网的不断发展,以及网站负载的不断增高,一个成熟网站的架构须要知足下面的几点,才能为用户提供稳定可用的服务前端
解决了上述问题以后,咱们须要达到一个什么样的目标和目的呢?程序员 每一个目标背后面临着技术、设计、维护等诸多方面的挑战; 而目标自己的指望值也会根据实际状况进行调整,这也意味着网站架构建设是个不断调整的过程。数据库 有了问题,也定了伟大的目标,那么网站在不一样阶段面对不一样的问题,是如何解决的?又是如何一步步成长为大型网站架构,实现这些伟大的目标呢?后端
解决了上述问题以后,咱们须要达到一个什么样的目标和目的呢?程序员
每一个目标背后面临着技术、设计、维护等诸多方面的挑战; 而目标自己的指望值也会根据实际状况进行调整,这也意味着网站架构建设是个不断调整的过程。数据库
有了问题,也定了伟大的目标,那么网站在不一样阶段面对不一样的问题,是如何解决的?又是如何一步步成长为大型网站架构,实现这些伟大的目标呢?后端
草根时期,快速开发网站并上线。固然,一般只是先试水,用户规模也没有造成,经济能力和投入也很是有限。应用程序、数据库、文件等全部资源都集中在一台 Server上,典型案例:基于 LAMP 架构的 PHP 网站;浏览器
优势:简单、快速迭代达成业务目标;缺点:存在单点、谈不上高可用;技术点:应用设计要保证可扩展;缓存
当网站发展到有必定的业务量和用户规模,网站的访问速度变慢,主要瓶颈是在数据库上,因此此时再用草根时代的架构显然已经不能知足咱们业务的需求了,那想提高网站速度,就须要解决数据库上的瓶颈,因而,缓存出场了。安全
单机时代+缓存服务器
优势:简单有效、方便维护;缺点:存在单点、谈不上高可用;技术点:客户端(浏览器)缓存、前端页面缓存、页面片断缓存、本地数据缓存/数据库缓存、远程缓存;网络
缓存分类:架构
页面缓存:客户端缓存,减小对网站的访问;本地缓存:访问速度快,但数据量有限,减小对DB查询;远程缓存:远程访问,能够集群,所以容量不受限制;
市场反响还不错,用户量天天在增加,数据库疯狂读写,逐渐发现一台服务器快撑不住了。因而,决定把数据服务和应用逻辑业务作分离。
数据库和应用逻辑分离
优势:简单有效、方便维护、提升不一样Server对硬件资源的利用率;缺点:存在单点、谈不上高可用;技术点:文件服务器部署、数据库服务器,扩展数据访问模块;
分离后三台 Server 对硬件资源的需求各不相同:
应用服务器:须要更快更强大的 CPU;数据库服务器:须要更快的硬盘和更大的内存;文件服务器:须要更大的硬盘;
单台数据库也感受快撑不住了,通常都会尝试作“读写分离”。因为大部分互联网“读多写少”的特性所决定的。Salve的台数,取决于按业务评估的读写比例
数据库读写分离
优势:简单有效、下降数据库单台压力;缺点:读写分离,增长程序难度,架构变复杂,维护难度增长;技术点:数据库主从同步部署,扩展数据访问模块,实现读写分离;
数据库层面是缓解了,可是应用程序层面也出现了瓶颈,因为访问量增大,加上早期程序员水平有限写的代码也很烂,人员流动性也大,很难去维护和优化。因此,很经常使用的办法仍是“堆机器”。
应用出现瓶颈 负载均衡集群
优势:增长服务器和HA机制,系统性能及可用性获得保证;缺点:应用之间缓存、Session一致性问题;技术点:负载均衡;
经过集群解决高并发、海量数据问题的经常使用手段,实现系统的可伸缩性。经过负载均衡调度器,可将用户访问分发到集群中的某台 Server 上,应用服务器的负载压力再也不成为整个网站的瓶颈
加机器谁都会加,关键是加完以后得有效果,加完以后可能会引起一些问题。例如很是常见的:集群应用之间页面输出缓存和本地缓存一致性的问题,Session保存的问题……
集中式缓存 Session集中存储
优势:应用之间缓存、Session一致,存储无限制,能够扩展;缺点:不如本地缓存访问快,缓存服务器、Session服务器等仍存在单点问题;技术点:缓存服务器部署、Session集中存储方案;
动静分离也是提升网站响应速度的一种经常使用方式。将动态请求与静态请求分离开,尽可能减小对应用服务器的压力。同时,能够再进一步对静态请求,进行缓存,以加快响应速度。能够须要开发人员配合(把静态资源放独立站点下),也能够不须要开发人员配合(利用7层反向代理来处理,根据后缀名等信息来判断资源类型)
动静分离好处
优势:减轻应用负载压力,针对静态文件缓存;缺点:静态文件缓存更新失效问题;技术点:动静分离、静态文件缓存方案;
使用反向代理和CDN加速网站响应:CDN和反向代理的基本原理都是缓存,区别在于:
使用 CDN 和反向代理的目的都是尽早返回数据给用户,一方面加快用户访问速度,另外一方面也减轻后端服务器的负载压力
使用CDN和反向代理加速网站响应
优势:减轻应用负载压力,异地缓存有效解决不一样地方用户访问过慢的问题;缺点:成本大幅增长,架构进一步复杂化,也维护难度进一步增大,静态文件缓存更新失效问题;技术点:CDN、反向代理方案;
到这里,已经基本作到了DB层面和应用层面的横向扩展了,能够开始关注一些其它方面,例如:站内搜索的精准度,对DB的依赖,开始引入全文索引、NoSQL NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具备更好的支持。应用服务器则经过一个统一数据访问模块访问各类数据,减轻应用程序管理诸多数据源的麻烦
到这里,已经基本作到了DB层面和应用层面的横向扩展了,能够开始关注一些其它方面,例如:站内搜索的精准度,对DB的依赖,开始引入全文索引、NoSQL
NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具备更好的支持。应用服务器则经过一个统一数据访问模块访问各类数据,减轻应用程序管理诸多数据源的麻烦
优缺点
优势:下降DB依赖;缺点:单点问题,谈不上高可用;技术点:NoSQL、搜索引擎、分布式;
到目前为止,一个可以承载日均百万级访问量的中型网站架构基本介绍完了
在作扩展知足了基本的性能需求后,咱们会逐渐关注“可用性”(也就是咱们一般听别人吹牛时说的SLA、几个9)。如何保证真正“高可用”,也是个难题。 对关键应用/服务,作集群冗余负载,这也是保证高可用比较经常使用的手段
在作扩展知足了基本的性能需求后,咱们会逐渐关注“可用性”(也就是咱们一般听别人吹牛时说的SLA、几个9)。如何保证真正“高可用”,也是个难题。
对关键应用/服务,作集群冗余负载,这也是保证高可用比较经常使用的手段
集群保证高可用
优势:集群负载,保证高可用;缺点:数据一致性、数据有状态问题;技术点:负载调度器、集群方案;
截止目前为止,都没有怎么去改动应用程序的架构,或者说通俗点,都不怎么须要大面积的修改代码。
若是上面那些手段都用光了,仍是支撑不住怎么办?不停的加机器也不是办法啊?
随着业务愈来愈复杂,网站的功能愈来愈多,虽然部署层面是采用的集群,可是应用程序架构层面仍是“集中式”的,这样会致使不少耦合,不便于开发、维护,并且容易“一荣俱损”。因此,一般会把网站拆分出不一样的子站点来单独宿主 经过分而治之的手段将整个网站业务分红不一样的产品线,如首页、商铺、订单、卖家、买家等拆分红不一样的产品线,分归不一样的业务团队负责。各个应用之间能够经过创建一个超连接创建关系,也能够经过消息队列进行数据分发
随着业务愈来愈复杂,网站的功能愈来愈多,虽然部署层面是采用的集群,可是应用程序架构层面仍是“集中式”的,这样会致使不少耦合,不便于开发、维护,并且容易“一荣俱损”。因此,一般会把网站拆分出不一样的子站点来单独宿主
经过分而治之的手段将整个网站业务分红不一样的产品线,如首页、商铺、订单、卖家、买家等拆分红不一样的产品线,分归不一样的业务团队负责。各个应用之间能够经过创建一个超连接创建关系,也能够经过消息队列进行数据分发
优势:下降耦合、分压;缺点:应用架构复杂;技术点:业务抽取拆分
应用、服务之间仍是会出现一些依赖问题,这时候,高吞吐量的解耦利器出现了
消息队列(服务间异步解耦 高吞吐量)
优势:提升吞吐量、应用、服务之间解耦;缺点:存在消息消费延迟问题;技术点:消息队列技术方案;
最后,再介绍一个大型互联网公司都用的绝技–分库分表。我的经验,不是业务发展和各方面很是迫切,不要轻易走这一步。 由于分库分表谁都会干,关键是拆完以后怎么办。目前,市面上尚未彻底开源免费的方案,能让你一劳永逸地解决数据库拆分问题。
最后,再介绍一个大型互联网公司都用的绝技–分库分表。我的经验,不是业务发展和各方面很是迫切,不要轻易走这一步。
由于分库分表谁都会干,关键是拆完以后怎么办。目前,市面上尚未彻底开源免费的方案,能让你一劳永逸地解决数据库拆分问题。
分库分表:
上面讲述了在网站业务发展的不一样阶段,会面临不一样的问题,针对不一样的问题,会选择不一样的架构。大型网站架构就是在不一样阶段时解决不一样问题的过程当中慢慢演进来的。
最后几句话,送给有缘的你: