# 128. 商品详情页动态渲染系统:大型网站的多机房 4级 缓存架构设计

多机房缓存,主从缓存集群通过同步,各个机房读取自己机房的从集群,防止跨集群访问集群

# 本地缓存

使用 nginx shared dict 作为 local cache,http-lua-module 的 shared dict 可以作为缓存, 而且 reload nginx 不会丢失

也可以使用 nginx proxy cache 做 local cache

双层 nginx 部署,一层接入,一层应用,接入层用 hash 路由策略提升缓存命中率,比如

  • 库存缓存数据的 TP99 为 5s,本地缓存命中率 25%,redis 命中率 28%,回源命中率 47% (回源就是数据直连服务 + 主集群)
  • 一次普通秒杀活动的命中率,本地缓存 55%,分布式 redis 命中率 15%,回源命中率 27%

使用 hash 路由策略,最高可以提升命中率达到 10%;(分发层把同一个商品 ID 分发到同一个应用层 nginx 上)

全缓存链路维度化存储,如果有 3个 维度的数据,只有其中 1个 过期了,那么只要获取那 1个 过期的数据即可, nginx local cache 的过期时间一般设置为 30min,到后端的流量会减少至少 3 倍

# 4 级缓存的作用是什么?

  • nginx 本地缓存:抗热点数据,小内存缓存访问最频繁的数据

  • 各个机房的 redis 集群:

    抗大量离散数据,采用一致性 hash 策略构建分布式 redis 缓存集群

  • tomcat 中的动态服务本地 jvm 堆缓存

    • 支持在一个请求中多次读取一个数据,或者与该数据相关的数据
    • 作为 redis 崩溃的备用防线
    • 固定缓存一些访问频繁更改较少的数据,比如分类、品牌等数据
    • 对缓存过期时间为 redis 过期时间的一半
  • 主 redis 集群

    • 命中率非常低,小于 5%; (为什么?应该是跟过期时间有关系把?前 2级 缓存都没有到这里一般也不会有?)
    • 防止主从同步延迟导致的数据读取 miss;从集群还未同步到,会通过数据直连服务请求主集群
    • 防止各个机房的从 redis 集群崩溃之后,全量走依赖服务会导致雪崩,主 redis 集群是后背防线
  • 主 redis 集群:采取多机房一主三从的高可用部署架构

    如上图:redis 集群部署采取双机房一主三活的架构:

    • 机房 A :部署主集群 + 一个从集群,
    • 机房 B :部署一个从集群(从机房 A 主集群)+ 一个从集群(从机房 B 从集群)

    双机房一主三活的架构,保证了机房 A 彻底故障的时候,机房 B 还有一套备用的集群,可以升级为一主一从

    如果采取机房 A 部署一主一从,机房 B 一从,那么机房 A 故障时,机房 B 的一从承载所有读写压力,压力过大,很难承受