以一个网站为例:
网站一开始就是大型的吗?
我们应该一开始就设计一个大型网站吗?
①不知名小网站 -> 低访问量,一台服务器满足需求。
快速推出这个小网站,让人们认识到这个很有价值。
最快速的技术LAMP:Linux+Apache+MySQL+PHP
②随着网站的发展,越来越多的用户访问,面临问题:
性能越来越差
越来越多的数据导致存储空间不足
选择解决方式:应用服务与数据服务分离
原来一台服务器做全部事情,现在三台服务器分别做不同模块的事。
能带来什么好处嘞?
服务器对应的硬件需求不同:
应用服务器:更快更强大的cup(处理大量的业务逻辑)
数据库服务器:需要更快的硬盘和更大的内存(快速磁盘检索和数据缓存)
文件服务器:需要更大的硬盘(存储大量用户上传的文件)
③随着用户逐渐增多,网站再次面临挑战:
数据库压力太大导致访问延迟,进而影响整个网站的性能,用户体验受到影响
解决办法:使用缓存改善性能
缓存:
本地缓存:速度快、只能缓存少量数据、和应用程序争内存,从而降低应用程序性能
远程分布式缓存:按需去取、访问需要一次网络连接,需要用时间代价换得更大空间
常用缓存组件:
memcache
redis
④随着用户逐渐增多,单一应用服务器面临新的问题:
能处理的请求连接有限,网站访问高峰期,应用服务器成为整个网站的瓶颈。
tomcat7 可以做到700-800并发量,tomcat8以上可以做到3-4千并发。再往上就是瓶颈了。
在网站访问高峰期会出现拒绝服务,访问时间过长等问题。
解决方法:
应用服务器集群:改善网站的并发处理能力
这就是分流,相当于多个人工作干一件事,提高并发访问速度。
为什么不用更强的服务器呢?
再强的服务器越往上也是有瓶颈的,如果使用集群的方式,可以按需扩展,可以不断增加集群服务器数量,用廉价的服务器来组成集群,成本大大减少,按需扩展可以慢慢的投入其中,不需要一下投入很多。
负载均衡的实现方式有哪些?
现在需要负载均衡调度服务器来分发任务,则要求该服务器并发处理能力一定要强。
三种方式:
Nginx:性能优异,消耗的资源少,中小型公司一般采用它。
LVS:并发量超过Nginx之后,使用它
F5:中小型很少使用,大公司常用,它的能力优于软件方式,需要花钱
DNS负载均衡:利用域名解析过程,我的域名对应多个ip地址,当机器发送域名到域名解析器上,域名解析的时候,可以返回不同的ip地址给你,实现负载均衡。
⑤使用缓存后,虽然大大减轻了数据库的读压力,但是面临新的问题:
有一部分读操作(缓存访问不命中,缓存过期)和全部的写操作需要访问数据库,当用户达到一定规模后,数据库里因为负载压力过高成为整个系统的瓶颈。
常用解决方式:
数据库读写分离
数据库集群方式:
数据访问模块
应用程序不关心它主从数据库,照常编写代码,让数据访问模块来处理对数据库的读和写。
⑥用户规模越来越大,发布地域越来越广,地域网络环境差别很大,面临问题:
如何保证用户的访问体验,不至于因访问慢而流失客户?
不同地区的网络状态不同。
解决办法:
反向代理和CDN加速
CDN:内容分发网络,必须部署在运营商的服务器里。适用于静态资源,把静态资源提前缓存到各地运营商服务器里,当用户通过网络发送请求时,请求一定会走到运营商服务器中 ,进来后由CDN服务器来路由分发,如果该CDN服务器缓存上有,直接返回资源,不用去其他地方找了。
反向代理:
部署在我们的数据服务中心的,最外层的。反向代理和负载均衡可能是同一个
他们的方法就是提前缓存,避免访问到我们的应用服务器上。减轻我们的应用服务器负担。
反向代理和CDN加速带来的好处:
①加快用户访问的响应速度
②减轻后端服务器的负载压力
一个网页 包含的资源文件很多,样式文件、js等。这些都是可以把他们提前缓存起来的。
⑦发展问题:
单文件服务器、单数据库服务器,面临问题:
存不下日益 增长的数据
分布式文件系统和分布式数据库系统(分库分表)
分布式文件系统 是一个集群,可以按需扩展,一个两个甚至更多。每个读取分离服务器都是相同的copy数据,数据量太大 就存不下来。
接下来就是分库分表,分布式数据库系统服务器
分布式系统怎么做 ?
分库分表怎么做?
减轻数据库读写压力。
⑧随着业务的发展,数据储存需求和检索需求越来越复杂,面临问题:
存储字段差异较大,骷髅表。
复杂的文本检索
模糊查询,数据量大,性能很差。
使用NoSql和搜索引擎
分布式搜索引擎:解决存储多样化,各种模式。
搜索引擎:
搜索引擎:
lunce:apache开源的搜索引擎开发工具包,有搜索需要的项目,可以集成到自己的系统中,就是一个jar包,通过api来完成数据的索引与搜索。
solr:就是lunce下的子项目,它是一个开发好的搜索平台,人家做好的搜索系统,直接拿下来,部署就能用。搜索引擎基本功能都有。
elastisearch:也是基于lunce开发的,现成的、直接拿来就能用的,搜索平台。api差不多。
NoSql:
mongodb:一定要学好,
搜索和nosql,把elastisearch学好。提高身价。
⑨网站越来越好,业务不断扩大,越来越复杂。面临问题:
应用程序将变得务必庞大,迭代周期越来越快,牵一发而动全身, 怎么应对快速的业务发展需要?
消息队列服务器:来做解耦操作,应用服务器之间的通信服务
消息队列MQ
⑩业务规模不断增大,应用拆分越来越小,越来越多,面临问题:
应用间的关系越来越复杂,应用中存在大量相同的业务操作。
后端的数据库要被成千上万台应用服务器连接,数据库连接资源部不足。
分布式服务(服务化)
分布式服务器把公用模块独立出来,由它来连接数据库服务器。
如何做服务化?
如何做配置中心?
服务化的两种架构方式:SOA、微服务
齿轮代表一个服务提供者或者是服务的调用者,SOA关键是Enterprise Services Bus—ESB企业级消息总线
微服务架构没有总线,你需要调用谁,就和谁连接。彼此之间可以互连
SOA缺点是,都得通过总线服务中心点来处理,好处 可以统一管理。
微服务:想比较与SOA好处是没有中心点,服务之间可以彼此互调,治理过程有点难度
到这里已经是完全的分布式集群架构。
11、再往后需要什么呢?
数据挖掘、分析、推荐等业务需求,庞大系统的监控、问题分析等需求。
12、架构设计思想总结
1、分而治之
2、随网站所需灵活应对
3、业务发展驱动技术发展,技术发展反哺业务
4、软件系统的价值在于它能为用户提供什么价值,在于网站能做什么,而不在于它是怎么做的