架构师训练营作业:第五周
分布式缓存架构
架构原理
什么是cache
原始数据的复制集,以便于访问。
Cache VS Buffer
Cache用于优化反复读操作
Buffer用于高速和低速设备的读写性能
无处不在的Cache
CPU Cache
OS Cache
数据库 Cache
JVM Cache
CDN Cache
代理与反向代理Cache
前端 Cache
应用程序Cache
分布式对象Cache
各种介质的数据访问延迟
内存:100ns
SSD磁盘搜索100us
网络数据包在同一个数据中心来回:500us
顺序读1MB网络数据:10ms
顺序从非SSD读取1M: 30ms
跨大下西洋数据包一个来回:150ms
缓存数据存储(Hash表)
Cache的关键指标
命中率
缓存键集合大小
缓存可使用的存储空间大小
缓存对象的生存时间TTL
常用的缓存实现形式
代理缓存/反向代理缓存
反向代理可以多层部署
内容分发网络CDN
就近部署,不同的运营商都需要部署
Read-through VS cache-aside
本地对象缓存
本地对象缓存构建分布式集群,即每个应用节点都保存一份本地缓存,并同步更新。
远程分布式对象缓存
MemCached 分布式缓存
通过客户端实现缓存的路由,缓存集群本身是share nothing的
一致性Hash算法
hash环:用箭头相连,箭头上的数字都在箭头指向的节点上。
虚拟节点:解决增加节点后的负载不均衡,实践中一般虚拟150到200个虚拟节点。
合理使用缓存
缓存优化的是读数据,因此不适合使用写数据
缓存适合多次读取的数据
不适合没有热点的访问
LRU: least recently used
数据不一致和脏读
缓存预热
缓存问题:
缓存雪崩:大量缓存丢失或失效
缓存穿透:原数据不存在的数据。
缓存击穿:针对某一特别热点服务器的缓存雪崩。
解决方法:
互斥锁。即多个客户端竞争访问原数据的锁,其他客户端等待。
永不过期,通过单独的线程完成更新
缓存中间件:redis vs memcached
Redis是在memcached的基础上发展而来
Redis支持复杂数据结构
支持多路复用一部IO
支持主从复制
Redis支持原生集群和share nothing集群模式
消息度列
缓存:优化读性能
消息队列和异步:优化写性能
异步和消息队列的本质:拆分、buffer
消息队列的优势:
异步处理,提升处理性能
削峰填谷
解耦,失败隔离和自我修复(生产者和消费者不直接依赖)
事件驱动架构EDA
类似设计模式中的观察者模式(也称作发布订阅模式)
主要的MQ产品
Rabbit MQ
Active MQ
Rocket MQ
Kafka
负载均衡
负载均衡的关键点
请求是如何分发到不同的服务器的
请求的路由规则
HTTP重定向负载均衡
优点:
简单
缺点:
性能差:每次请求都需要额外增加一次重定向请求
安全性差:内部应用服务器需要暴露给客户端
DNS负载均衡
DNS负载均衡一般配合实现多级负载均衡,DNS解析出来的是不同的负载均衡服务器的IP
反向代理负载均衡
缺点:运行于HTTP层,需要构建完整的HTTP报文,性能较差。不适合大规模集群的负载均衡。
IP负载均衡
修改TC/IP数据包的目标和源IP地址,实现转发。不需要构建HTTP报文
有点:不需要HTTP层的报文转换
缺点:需要传递返回报文(而返回报文通常很大),增加负载均衡服务器的压力。
链路层负载均衡
修改请求的目标mac地址,同时负载均衡服务器和应用服务器共享同一个虚拟IP地址。
响应报文不经过负载均衡服务器
负载均衡算法
轮询/加权轮询
随机/加权随机
最少连接
源地址散列(实现会话粘滞)
session管理
session复制(性能和容量差)
session绑定(无法高可用)
cookie记录session
远程session服务器(应用服务器实现share nothing)
问题
缓存的更新策略
一致性hash,如果节点的hash值相同怎么办?
异步处理的一致性问题,结果处理。
IP负载均衡如何映射返回报文的目标IP地址?(记录映射表)
评论