技术选型总结一
分布式缓存架构
架构原理与注意事项
缓存 cache 定义
缓存:存储在计算机上的一个原始复制集,以便于访问。
缓存时介于数据访问者与数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度。
缓存 cache 和缓冲 buffer 的区别
缓冲 buffer 是介于高速和低速设备之间的中间介质,但不是为多次读取使用,而是访问低速设备时,先将数据写入到一个 buffer 里面去,当准备好数据后,再从 buffer 中读取,达到快速读取或写入。
常见缓存使用场景
l CPU 缓存
l 操作系统缓存
l 数据库缓存
l Jvm 编译缓存
l CDN 缓存
l 反向代理缓存
l 前端缓存
l 应用程序缓存
l 分布式对象缓存
各种介质访问数据延迟
缓存数据存储(hash 表)
缓存关键指标
缓存命中率
l 缓存是否有效,依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称为缓存命中率。
l 如果查询一个缓存,10 次有 9 次能够查询到正确结果,那么命中率是 90%。
影响缓存命中率的主要指标
l 缓存键集合大小
缓存中每个对象使用缓存键进行识别,定位一个对象唯一方式通过键进行精确匹配。
例如:商品数据的缓存,sku 作为缓存键。统计学看,应用中缓存键越多,重用概率越小。如果想提高命中率,尽量减少缓存键数量。选择合适的缓存键。
l 缓存可使用内存空间
缓存可使用内存空间大小直接决定缓存对象的平均大小和缓存对象数量。由于缓存一般存储在内存中,缓存对象可用空间受到严格限制且相对昂贵。如果要缓存更多对象,要先删除老对象,在添加新对象。替换对象会降低缓存命中率,缓存对象越多,缓存命中率越高。
l 缓存对象生存时间
例如:缓存天气数据 15 分钟没有问题,如果时间久了,就可能过于陈旧。简单讲,对象缓存时间越长,缓存对象被重用的可能性就越高。
常见缓存实现形式
代理缓存
放在用户端的属于代理缓存,例如公司网络代理服务器。
反向代理缓存
例如 http 反向代理服务器,如果未命中缓存转发 web 服务器。
多层反向代理缓存
例如:外部流量->负载均衡服务器->反向代理服务器->前端 web 服务器->反向代理服务器缓存和负载均衡->web 服务器
CDN
CDN 提供商的数据中心-CDN 可以作为托管的反向代理服务器响应给客户端,如果未命中 CDN 缓存则向原 web 服务器发送请求。
CDN 局限于不同运营商在不同区域机房都需要部署。
AWS 支持 CDN 配置静态文件和动态内容
CloudFront 同时支持静态内容和动态内容
通读缓存-Read Through
l 代理缓存、反向代理缓存、CDN 均属于 Read Through
l Read Through 是在查询时更新缓存。当缓存失效时缓存服务自己来加载,从而对应用方是透明的。
l 通读缓存是获取数据的唯一的数据源,缓存未命中时,是由通读缓存代理访问
旁路缓存-Cache Aside
l 旁路缓存通常是一个独立的键值对存储。例如:对象缓存
l 读取时,先读缓存。如果命中,直接返回数据;未命中,则读数据库,然后取出数据后放入缓存,同时返回数据。
l 更新时,先更新数据库,成功后再让缓存失效。
l 旁路缓存是当客户端访问数据未命中时,由客户端自己直接访问 web 服务器。
浏览器对象缓存
webStorage 中的缓存对象。
本地对象缓存
l 对象直接存储在应用程序内存中。例如:hash 表
l 对象存储在共享内存,同机器中多个进程都可以访问。
l 缓存服务器作为独立应用和应用程序部署在同一服务器上。
本地对象缓存构建分布式集群
远程分布式对象缓存
MemCached 分布式对象缓存
l 3 台 memcached 服务器存储数据是不同的。数据写入时,通过 memcached 客户端计算 key-value 写入到哪台服务器上。
l 当数据存储不足时,可以通过增加服务器扩容,提供更多存储资源。
l 图示中架构被称为 Share-Nothing 架构,memcached 服务器之间不会互相通信,客户端在访问时计算去哪台服务器读写数据。
Memcached 分布式缓存访问模型
不足:Share-Nothing 架构,由于是通过余数 hash 路由计算的,导致扩容后路由结果与扩容前不一致情况,需在架构设计时考虑。
一致性 hash 算法
一致性 hash 算法描述见下图:
一致性 hash 扩容,只影响扩容节点和前一个节点之间的数据读写。
不足:
l 容易导致数据分布不均匀,hash 访问负载不均衡。
l 增加 1 台服务器,只能减轻一台服务器的压力,负载分摊不均衡
基于虚拟节点的一致性 hash 算法
每台服务器有一些虚拟节点,所有服务器虚拟节点散落在环上,保证数据在路由 hash 时,每台服务器都有数据存放。
缓存显著提升性能
l 缓存数据通常来自内存,比磁盘上数据有更快的访问速度。
l 缓存数据是最终形态,不需要计算,减少 CPU 消耗。
l 缓存降低数据库、磁盘、网络 IO 的负载压力,保护上述 IO 设备有更好的响应特性。
缓存-系统性能优化大杀器
l 技术简单。
l 性能提升明显。
l 应用场景多。
合理使用缓存
频繁修改的数据:由于频繁修改,应用可能还未来及读数据就已经失效或更新,虚增系统负担。一般来说,读写比例 2:1 以上,缓存才有意义。
无热点访问:缓存是有内存存储,由于内存资源宝贵,无法将所有数据缓存,如果应用无热点数据,不遵循二八定律,即大部分访问不是集中在小部分数据集上,那缓存无意义。因为大部分数据还未访问就已经被挤出内存。
LRU 算法
数据不一致和脏读:一般会给缓存中数据设置过期时间,一旦数据过期或从数据库中重新加载,因此应用需要容忍一定时间的数据不一致。有些场景数据延迟是可以接收,但某些场景是不允许的。如果是不允许数据延迟,可以采用策略是数据库更新时立即更新缓存,不过也会带来系统开销和事务一致性问题。因此数据更新时,删除缓存数据,是稳妥做法。
缓存雪崩:缓存服务器挂掉导致请求大量涌至数据库。
缓存穿透:大量缓存中不存在的请求 key 访问直接落到数据库,一般是恶意攻击。
缓存击穿:热点 key 在请求高峰失效,瞬间大量请求落到数据库。
缓存预热:缓存中存放的热点数据是通过 LRU 算法对不断访问的数据筛选淘汰出来的,但是这个过程花费时间较长,在这段时间内,数据库和服务器的负载都不太好。如果能在缓存中提前加载好热点数据,这种手段叫缓存预热。例如:可以对一些城市名称或热点商品,在流量峰值到达前加载到缓存。
Redis VS Memcached
l Redis 支持复杂数据结构;Memcached 只支持简单 key-value 存储。
l Redis 支持多路复用异步 IO 实现高性能;Memcached 是阻塞式的。
l Redis 支持主从复制,达到高可用。
l Redis 原生集群与 share nothing 集群模式;Memcached 只有 share nothing 集群模式。
Redis 集群
l Redis 集群预分好 16384 个槽,当需要在 Redis 集群存放一个 key-value 时,根据 CRC16(key)mod 16384 的值,决定将 key 放到哪个槽里。
l 集群把所有的物理节点映射到[0-16383]槽上(不一定平均分配),cluster 负责维护槽与服务器之间的映射关系。
l 客户端与 Redis 节点直连,客户端不需连接集群所有节点,连接集群中任何一个可以节点即可。
l 所有 Redis 节点彼此互联。
消息队列
同步调用与异步调用
同步调用:提交任务后,原地等待任务执行完毕,拿到结构后再执行下一步操作,程序是串行执行。
异步调用:提交任务后,不等待任务执行,继续向后执行。
消息队列构建异步架构
点对点模型
发布订阅模型
消息队列优点
l 实现异步处理,提升处理性能。
l 更好的伸缩性。
l 削峰填谷。
l 失败隔离、自我修复。
l 解耦。
事件驱动架构 EDA
例如新用户注册服务,发送新用户注册消息给一个消息队列,各种消费者可以订阅该消息,驱动后续逻辑处理。
负载均衡架构
HTTP 重定向负载均衡
HTTP 重定向负载均衡优点:实现简单。
HTTP 重定向负载均衡缺点:1.耗时问题:每次请求需要请求 2 次。2.安全问题:应用服务器集群暴露在公网。
DNS 负载均衡
DNS 服务器无需每次都进行域名解析。
DNS 服务器解析出来的 IP 地址是服务器应用内部的负载均衡服务的 IP 地址。
DNS 负载均衡优点:1 次请求调用,不需要重复请求。2.安全有保障,DNS 服务器返回的 IP 地址是服务器内部的负载均衡服务器的 IP 地址。
反向代理负载均衡
反向代理负载均衡适用于小型网站,反向代理服务器代理的是 HTTP 请求,这就需要等待多个 TCP 数据包构建成完整的 HTTP 请求后,才能继续向后转发。
IP 负载均衡
负载均衡服务器处理逻辑:1.负载均衡服务器不在负责将用户的多个 TCP 数据包构建成一个 HTTP 请求,应用层协议转换改由应用服务器完成。当负载均衡服务器拿到每个 TCP/IP 数据包后,将用户请求的源地址:由用户 IP 地址改为负载均衡器的地址。目标地址:由负载均衡目标地址改为具体某台应用服务器 IP 地址。
优点:1.处理简单,只需要做源地址和目标地址建立映射关系。2.可以支持更大并发。
缺点:1.请求包很小,但是响应包比较大(需要负载均衡服务器处理大量响应包)。
数据链路层负载均衡
数据链路层负载均衡服务器不再处理响应内容数据转换。由于负载均衡服务器和应用服务器集群目标 IP 地址使用的同一个,所有负载均衡服务器不再修改 IP 地址。
在数据链路层,负载均衡仅通过修改用户请求包中的 mac 地址,让指定应用服务器处理。
负载均衡算法
l 轮询
l 加权轮询
l 随机
l 最少连接
l 源地址散列
评论