部件考虑
有些设备位于客户端或者网络边缘,能够迅速响应用户请求,避免给cpu和数据库带来压力,比如,本地缓存,内容分发网络,反向代理等。
有些设备处理能力能够线性扩展,易于伸缩,应尽量作为业务主体,如集群能够扩展的服务节点
有些设备对系统有全局性影响,需要时刻保持容错备份,比如服务注册中心,配置中心。
有些是单点设备,比如系统路由,网关,数据库等。
对系统进行流量规划时,应该考虑到部件特性
规划原则
尽量减少单点部件,尽量减少到达单点部件的流量
最简单的系统就是最好的系统
客户端缓存
服务器对于客户端请求的响应中附带一些条件,要求客户端在想要发出相同请求时,先判断是否满足条件,如果满足,就直接使用上一次服务器给予的响应来替代,不必重新访问。
通过不同条件,客户端缓存又分为:强制缓存和协商缓存
强制缓存
比如收到请求的10分钟内有效,那么除了用户主动刷新页面,对于新开窗口,浏览器地址输入,前进,后退均可生效。
HTTP的Header参数实现强制缓存
Expires
Header参数是一个截止时间参数。
问题:
受限客户端时间。
无法描述不缓存。
无法让私有资源不被代理服务器,内容分发网络缓存。
Cache-Control
如果expire和cache-control起冲突,会以cache-control为准。
参数:
- max-age和s-maxage:缓存有效时间,以秒为单位,s-maxage的s是share的缩写,意味着在CDN,代理中持有缓存的有效时间。
- public和private:private不允许CDN等缓存。
- no-cache:不缓存
协商缓存
需要浏览器和服务器协商一次,检查客户端的资源是否过期了,会有另外的开销。和强制缓存是并行运行的。
有两种检查资源是否过期的模式:根据修改时间,根据资源唯一标识是否发生变化。他们都是通过一组成对出现的Header来实现的。
Last-Modified和IF-Modified-Since
服务端返回资源会带上Last-Modified的Header,客户端下一次请求相同资源时,就会带上IF-Modified-Since(即获得资源的Last-Modified),如果服务器发现这段时间没有修改,就返回304/Not Modified,无消息体,从而节省流量。
ETage和If-None-Match
ETage代表资源的唯一标识,相比于Modified更精密,因为modified是秒级。
但是通过哈希算ETage也会消耗资源。
传输链路
基于传输链路的设计原则:
- 减少请求数量,因为每个http请求都需要建立tcp连接。
- 扩大浏览器的并发请求,现代浏览器一般支持6个对于相同域名的并发请求,通过将资源分布在不同域名上,从而实现并发请求。
- 压缩传输
tcp连接复用
HTTP/2支持了每个域名维持一个TCP连接,一个HTTP响应当作一个个流,每个数据帧带有流ID,根据流ID可以在浏览器将数据帧重新组装成一个完整的HTTP响应。
对于小而多的文件,一个tcp好用(HTTP2),但是对于大文件,不如多tcp连接快。
压缩HTTP响应
域名解析是透明多级分流系统中重要的环节
DNS查询"icyfenix.cn"
DNS服务返回一个CNAME,"icyfenix.cn.cdn.dnsv1.com"。
递归查询CNAME,返回"icyfenix.cn"的全部的全国的DNS地址。
典型的 CDN 部署中,第一次 DNS 查询是为了获取 CDN 的 DNS 服务器地址,而第二次 DNS 查询则是通过 CDN 的 DNS 服务器获取实际的 IP 地址,CDN的DNS服务器会根据用户的位置等信息返回最优的CDN服务器地址,它可能是一个也可能是一组。
内容分发网络:CDN
仅从网络传输的角度看,一个互联网系统的速度取决于这四点:
- 网站服务器接入网络运营商的链路所能提供的出口带宽。
- 用户客户端接入网络运营商的链路所能提供的入口带宽。
- 从网站到用户所经过的不同运营商之间的带宽。
- 从网站到用户的物理链路传输时延。
除了第二条,其他都可以通过CDN实现。
内容分发:CDN获取源站资源的方式
在DNS服务器的协助下,无论是用户还是服务器,内容分发网络都完全是透明的,在两者不知亲的情况下,由CDN节点接管了用户向服务器发出的资源请求。
这其中的问题就是,CDN节点中必须有用户要的资源,其中包括两个内容"如何获取源资源","如何保证资源是最新的"。
CDN获取源站资源的方式就叫做内容分发。
主要有两种方式:
- 源站主动分发(Push),预加载。
- CDN被动回源(Pull)
CDN的应用
CDN能做的事情:
- 加速静态资源分发
- 安全防御,如果只使用CDN,而隐藏服务器的IP,恶意攻击就无法触及到服务器。
- 状态缓存
- 修改资源的内容,比如可以压缩,修改Header参数等。
负载均衡:就是将进入网关的流量合理分配给多个服务器
经历过"域名"-"CNAME"-"最优CDN地址"(这个是DNS的负载均衡),在网络边缘的CDN才进行负载均衡(这是网关层面的负载均衡)。
无论在网关内部建立了多少层负载均衡,从形式上也只能分为两种:四层负载均衡和七层负载均衡,层是对OSI网络模型来说的。
四层负载均衡(链路层的负载均衡)
修改MAC地址在链路层分流
特点是维持同一个TCP连接。
请求进入负载均衡器中,通过修改请求帧的MAC地址,在局域网内将请求送到服务器,由于帧的用户信息没变,服务器直接对用户响应。
想要实现的话需要服务器写入响应的ip地址和负载均衡器的相同,因为这样用户才能判断是自己发出的那个请求的响应。
IP隧道协议在网络层分流
网关给用户的请求再次封装,目标ip为服务器地址,服务器接收到后进行两次拆包,直接给用户响应。
要求服务器写入响应的ip地址和网关的相同。
通过修改请求的ip让服务器和网关通信,然后网关和用户通信
会带来较大的性能损失
七层负载均衡(应用层)
四层的负载均衡使用的都是一个数据帧,也就是通过修改帧的内容来实现的(即维持一个TCP连接)。
应用层的负载均衡需要网关和用户建立TCP,网关和服务器建立TCP,性能一定比不了四层。
七层代理的强大功能:
- CDN能做的,它都能做,静态资源缓存,安全防护等等。
- 更智能化的路由
- 微服务的治理很多都在七层实现
负载均衡的算法策略
- 轮询
- 权重轮询
- 随机均衡
- 权重随机
- 哈希MAC或者IP
- 测试服务器的响应速度进行均衡
- 最少连接均衡(通过记录服务器连接数)