文章目录
- 《看透springMVC》读书笔记——第一讲
- 单机类型
- CS结构(Client-Server)
- BS结构(Browser-Server)
- BS结构网络传输方式
- OSI七层模型/TCP/IP四层模型
- TCP/IP每层使用的协议规范
- 网站架构的演变
-
- 海量数据的解决方案
- 利用缓存
- 实现缓存的两种方式
- 使用缓存的两个核心要素:什么时候创建缓存,缓存什么时候失效
- 缓存的适用场合
- 利用页面静态化
- 数据库优化
- 分离活跃数据
- 批量读取和延迟修改
- 读写分离
- 分布式数据库
- NoSQL和Hadoop
-
- 高并发的解决方案
- 应用和静态资源分离
- 页面缓存
- 集群与分布式
- 反向代理
- CDN:特殊的集群页面缓存服务器
- 底层的优化
- 总结
- 底层的优化
- 总结
《看透springMVC》读书笔记——第一讲
单机类型
不需要联网,数据和软件都在本地
CS结构(Client-Server)
CS结构分为客户端和服务端,客户端产生的数据通过互联网保存到服务器上,由服务器统一管理数据
[外链图片转存失败(img-1UswJ57q-1565927742061)(G:\Blog\面试\Java web\看透springMVC\1564650540274.png)]
业务处理
服务器除了保管客户端产生的数据之外还可以处理业务,业务可以放在服务器上统一处理,也可以放在客户端处理,放在服务器上处理对服务器的性能要求比较高,但是具有一定的稳定性和安全性,同时完成软件的升级也比较方便。如果将业务放在客户端处理,对服务器的性能要求就没那么高,可以减少服务器的负担,节省服务器的资源
比如我们的QQ,微信等现在各大app,以及大型游戏都是基于CS结构
CS结构的缺点
- 软件提供商需要同时开发客户端和服务器两套软件体系。
- 客户使用的时候需要单独安装软件
- 升级的时候需要客户单独升级
BS结构(Browser-Server)
BS结构将客户端统一处理,做成一个浏览器,并且浏览器默认安装在用户的电脑里面,不需要用户单独进行安装,浏览器只是一个作为显示数据的作用,它通过特定的协议和服务器通信,将服务器的数据返回并显示。具体的业务逻辑也在服务器上处理
BS结构的特点
实现简单
BS结构网络传输方式
OSI七层模型/TCP/IP四层模型
TCP/IP每层使用的协议规范
网站架构的演变
应用和数据分离
最初是由一台主机包含了所有的服务器程序和数据,当数据和流量越来越大时,就需要将数据单独分离出来
海量数据的解决方案
利用缓存
海量数据无疑是对数据库造成的压力,所以我们的目标也是减轻数据库的压力,通过使用缓存可以将从数据库中获取的结果暂时保存起来,如果下次还要用到,就直接从缓存中取数据,而不用再次从数据库中获取数据流
实现缓存的两种方式
- 通过程序直接保存到内存:从数据库中的数据直接保存到本地内存,如果需要再次获取相同的数据那么可以直接从内存中获取,而不用从数据库中获取了。比如concurrentHashMap
- 使用缓存框架:Ehcache,Memcache,Redis
使用缓存的两个核心要素:什么时候创建缓存,缓存什么时候失效
-
什么时候创建
- 可以在第一次从数据库中获取到数据的时候创建缓存
- 也可以在程序启动的时候就创建缓存
- 也可以是缓存失效了创建
-
缓存什么时候失效
- 缓存可以设置定期失效
- 也可以在数据发生变化的时候失效(分为粗粒第失效和细粒度失效)
缓存的适用场合
由于缓存中的数据代表的数据库中的数据,如果数据库中的数据更新的很频繁,那么缓存如果又设置了定期失效(不会因为数据库中的数据发生了改变而失效),所以就会导致缓存中的数据和数据库中的数据不一致的现象
当然如何设置的缓存当数据库中的数据发生变化的时候就失效,并且是细粒度失效,那么同样也适用于一些实时性要求比较高的场合
利用页面静态化
页面静态化是直接将程序最后生成的页面保存起来,这样就不需要每次调用都重新生成页面,这样不但不需要重新查询数据库,连应用程序都不需要处理了
数据库优化
以上两种方式都是用缓存的方式将数据暂时存储起来,当下次需要数据的时候可以直接获取来达到节省开销,而数据库优化是直接针对数据库里面的逻辑操作进行优化
-
表结构优化
-
SQL语句优化:可以将处理大数据的SQL语句执行的时间记录下来进行分析和优化
-
分区:将一张表中的数据按照特定的规则分到多个区中
-
分表:如果一张表中有几种固定不变的类型,并且同时对所有类型的操作情况不多,那么就可以分表,否则最好不要分表,因为进行增删改查的时候还需要定位到哪张表,才能进行操作,进一步增加了开销
分表还可以将表中不同的类型进行分表,然后对于增删改操作锁定的范围就会小点(如果只是针对某些字段就行修改的话),但是如果是查找的话需要进行连表查找
-
索引优化
索引的作用是当数据发生变化的时候(增删改),将数据按照指定字段的顺序排列后保存到一个类似表的结构中,当下次需要查询以索引条件的数据的时候,就可以很快从索引中 找到对应记录的指针并从表中获取到结果
通过对某些字段建立索引可以提高查询速度,但是同时对于增删改增加了一定的消耗
-
建立存储过程
存储过程由于只用编译一次,并且可以在存储过程里面做一下复杂的操作,所以对于一些操作频率很高的业务中,可以通过利用存储过程来代替一些直接操作
分离活跃数据
批量读取和延迟修改
批量读取:将多次查询合并到一次中进行
将一次请求中的数据进行批量读取
将多个请求合并到一次执行
延迟修改:针对高并发且频繁修改的数据,如一些统计数据。可以先将需要修改的数据暂时保存到缓存中,然后定时将缓存中的数据保存到数据库中,但是程序在读取数据的时候可以同时读取数据库和缓存(但是这种情况会导致数据库有一段时间的数据不是最新的,并且保存缓存的机器不能出问题,否则会发生数据丢失)
读写分离
读写分离的本质是对数据库进行集群,也就是设置多个服务器来分散服务器的压力。一般用一台主服务器专门用于写操作,其他从服务器用于读操作。(写操作用一台服务器的原因是,当多台服务器同时写数据,会使得数据的同步变得非常的复杂)
当有很多从服务器时,可以将数据的同步分阶段进行,先同步一部分从服务器,然后再让从服务器去同步其他的从服务器
数据库同步有哪些方式?
-
热备的情况下,只有主数据中心承担用户的业务,此时备数据中心对主数据中心进行实时的备份,当主数据中心挂掉以后,备数据中心可以自动接管主数据中心的业务,用户的业务不会中断,所以也感觉不到数据中心的切换。
-
冷备的情况下,也是只有主数据中心承担业务,但是备用数据中心不会对主数据中心进行实时备份,这时可能是周期性的进行备份或者干脆不进行备份,如果主数据中心挂掉了,用户的业务就会中断。
-
双活是觉得备用数据中心只做备份太浪费了,所以让主备两个数据中心都同时承担用户的业务,此时,主备两个数据中心互为备份,并且进行实时备份。一般来说,主数据中心的负载可能会多一些,比如分担6070%的业务,备数据中心只分担40%30%的业务 。
分布式数据库
分布式数据库:将不同的表放到不同的数据库然后放到不同的服务器
这里可以按照业务对服务器进行划分,使得不同的业务调用不同的数据库
好处:如果一个请求里面需要调用多个表,那么可以分散到多台服务器处理,提高处理速度(解决的是单个请求里面业务逻辑很复杂的情况,将单个服务请求分配到多台服务器处理),对于每台服务器节点又可以使用读写分离减轻当需要处理多个请求的压力
分布式数据库需要考虑的问题是:多表查询和事务处理
NoSQL和Hadoop
RDBMS vs NoSQL
RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL) (SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
Hadoop的特点
- 将一张表中的数据分成多个部分,分别保存在不同的节点上
- 每个部分的数据块都同时保存在多个节点上
- 每个节点都不包含完整的数据,但是可以保存多张表的数据
优点:
- 多个节点可以并行的处理相同的数据
- 当一个节点宕机,数据不会丢失,因为其他节点都会有实时的备份
Hadoop对数据的处理是先处理每个数据块的内容,然后再处理每一个处理的结果合并到一起
高并发的解决方案
应用和静态资源分离
将静态资源比如图片、视频、js、css和一些资源文件保存到专门的服务器中
页面缓存
将生成的页面暂时缓存起来,不用每次请求都重新生成页面,并设置 一个缓存失效机制(设置一个缓存时间,或者在数据发生更改之后使得缓存失效),可以将缓存放入内存,或者借助其他专用服务器比如Nginx服务器,它具有自带的缓存功能,也可以使用专门的squid服务器
对于页面中一部分数据经常发生变化的情况:可以先生成静态页面,然后使用ajax读取并修改相应的数据
集群与分布式
什么是集群:集群是每台服务器都具有相同的功能,比如读写分离时,每一台从服务器的功能都相同,可以从任何一台从服务器中读取数据,当有多个请求时,可以分散服务器的压力
什么是分布式:分布式是将不同的业务放到不同的服务器中,处理一个请求可能会用到多台服务器,从而提高处理一个请求的速度。分布式就是根据业务进行分流
集群和分布式可以一起使用,比如在分布式中对于不同的业务可以分别对应使用一个集群来实现
集群的分类
集群需要考虑的问题
- 不同服务器之间session的同步(针对应用程序群)
- 负载均衡(将一个请求具体分配到哪个服务器中去处理)
反向代理
什么是反向代理:
反向代理就是客户端直接访问的服务器并不真正提供服务,它从别的服务器获取资源然后返回给用户
反向代理服务器和代理服务器的区别
- 代理服务器是我们用户主动使用的,比如我们正常获取国外的网站的时候,不能直接访问,那么我们可以使用代理服务器帮助我们去获取资源,然后返回给我们,代理服务器是为我们用户服务的,没有域名
- 反向代理服务器是服务器为了帮助服务器的工作而使用的,我们用户并不知道反向代理服务器的存在,反向代理服务器有自己的域名,我们访问它和正常的服务器没有任何的区别
反向代理服务器可以和实际处理请求的服务器在同一台主机上,而且一台反向代理服务器可以同时访问多台实际处理请求的服务器
反向代理服务器的作用
- 可以作为前端服务器与实际处理请求的服务器(比如Tomcat)集成
- 可以作为负载均衡
- 转发请求:将不同类型的资源请求转发到不同的服务器处理(比如将动态资源转发到Tomcat服务器,php等动态程序;将图片等静态资源的请求转发到静态资源的服务器)(可以在url地址结构发生变化后将新地址转发到原来的旧地址上)
CDN:特殊的集群页面缓存服务器
特殊之处:
- 服务器的位置:分布在全国各地
- 分配请求的方式:会将请求分配到最合适的CDN服务器(电信用户分配到电信服务器,移动分配到移动的服务器)(根据地域:北京的用户分配到北京的服务器,重庆分配到重庆的服务器)
具体如何实现上述的请求分配:不是通过负载均衡服务器分配,而是使用专门的CDN域名解析服务器在解析域名的时候进行分配。
具体的过程:
- 在ISP使用CNAME解析域名到一个特定的域名
- 使用CDN服务器将这个解析得到的特定的域名再次解析找到对应的CDN节点
底层的优化
Google制定了Quic,Spdy协议进行网络的数据传输,Quic比TCP效率高而且比UDP安全
Spdy协议在HTTP协议的基础上增加了很多新的特性,提高了传输的效率,Google现在使用的是HTTP/2
总结
如今的网站架构主要考虑的是两个方面:海量数据和高并发
解决方案:
-
使用缓存
-
使用多资源:多存储、多CPU、多网络
多资源分类:
- 单个资源处理一个请求(多存储的集群,多网络的CDN,)
- 多个资源合作处理一个请求(多CPU的分布式,静态资源分离)
…(img-4KYEDk3b-1565927742075)]
底层的优化
Google制定了Quic,Spdy协议进行网络的数据传输,Quic比TCP效率高而且比UDP安全
Spdy协议在HTTP协议的基础上增加了很多新的特性,提高了传输的效率,Google现在使用的是HTTP/2
总结
如今的网站架构主要考虑的是两个方面:海量数据和高并发
解决方案:
-
使用缓存
-
使用多资源:多存储、多CPU、多网络
多资源分类:
- 单个资源处理一个请求(多存储的集群,多网络的CDN,)
- 多个资源合作处理一个请求(多CPU的分布式,静态资源分离)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)