大型分布式系统中的缓存架构
作者:陈彩华
来自:51cto技术栈(ID:blog51cto)
本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。
缓存概述
缓存的分类
缓存主要分为四类,如下图:
缓存的分类
CDN 缓存
CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中。
在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
应用场景:主要缓存静态资源,例如图片,视频。
CDN 缓存应用如下图:
CDN 缓存优点如下图:
反向代理缓存
反向代理位于应用服务器机房,处理所有对 Web 服务器的请求。
如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。
如果没有缓冲则先向 Web 服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向 Web 服务器的请求数,从而降低了 Web 服务器的负载。
应用场景:一般只缓存体积较小静态文件资源,如 css、js、图片。
反向代理缓存应用如下图:
反向代理缓存应用图
开源实现如下图:
开源实现
本地应用缓存
指的是在应用中的缓存组件,其最大的优点是应用和 Cache 是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等。
在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适。
同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。
应用场景:缓存字典等常用数据。
缓存介质如下图所示:
编程直接实现如下图:
编程直接实现
Ehcache
基本介绍:Ehcache 是一种基于标准的开源缓存,可提高性能,卸载数据库并简化可伸缩性。
它是使用最广泛的基于 Java 的缓存,因为它功能强大,经过验证,功能齐全,并与其他流行的库和框架集成。
Ehcache 可以从进程内缓存扩展到使用 TB 级缓存的混合进程内/进程外部署。
Ehcache 应用场景如下图:
Ehcache 的架构如下图:
Ehcache 架构图
Ehcache 的主要特征如下图:
Ehcache 主要特征
Ehcache 缓存数据过期策略如下图:
Ehcache 过期数据淘汰机制:即懒淘汰机制,每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做 TTL 比较来判断是否过期。
Guava Cache
基本介绍:Guava Cache 是 Google 开源的 Java 重用工具集库 Guava 里的一款缓存工具。
Guava Cache 特点与功能如下图:
Guava Cache 的应用场景如下图:
Guava Cache 应用场景
Guava Cache 的数据结构如下图:
Guava Cache 结构特点
Guava Cache 的缓存更新策略如下图:
Guava Cache 缓存更新策略
Guava Cache 的缓存回收策略如下图:
Guava Cache 缓存回收策略
分布式缓存
指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存。
分布式缓存的主要应用场景如下图:
分布式缓存的主要接入方式如下图:
分布式缓存接入方式
下面介绍分布式缓存常见的 2 大开源实现 Memcached 和 Redis。
Memcached
Memcached 是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的 Hash 表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
Memcached 的特点如下图:
Memcached 的基本架构如下图:
Memcached 基本架构
缓存数据过期策略:LRU(最近最少使用)到期失效策略,在 Memcached 内存储数据项时,可以指定它在缓存的失效时间,默认为永久。
当 Memcached 服务器用完分配的内存时,失效的数据被首先替换,然后是最近未使用的数据。
数据淘汰内部实现:懒淘汰机制为每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做 TTL 比较来判断是否过期。
分布式集群实现:服务端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。 Memcached 的分布式,是由客户端程序实现的。
Memcached 分布式集群实现
Redis
Redis 是一个远程内存数据库(非关系型数据库),性能强劲,具有复制特性以及解决问题而生的独一无二的数据模型。
它可以存储键值对与 5 种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能。
Redis 还可以使用客户端分片来扩展写性能,内置了 复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions) 和不同级别的磁盘持久化(persistence)。
并通过 Redis 哨兵(Sentinel)和自动分区(Cluster)提供高可用性(High Availability)。
Redis 的数据模型如下图:
Redis 数据模型
Redis 的数据淘汰策略如下图:
Redis 数据淘汰策略
Redis 的数据淘汰内部实现如下图:
Redis 数据淘汰内部实现
Redis 的持久化方式如下图:
Redis 底层实现部分解析如下图:
启动的部分过程图解
Server 端持久化的部分操作图解
底层哈希表实现(渐进式Rehash)如下图:
Rehash 执行流程
Redis 的缓存设计原则如下图所示:
Redis 与 Memcached 的比较如下图:
Redis 与 Memcached 比较
下面主要介绍缓存架构设计常见问题以及解决方案,业界案例。
分层缓存架构设计
缓存带来的复杂度问题
常见的问题主要包括如下几点:
数据一致性
缓存穿透
缓存雪崩
缓存高可用
缓存热点
下面逐一介绍分析这些问题以及相应的解决方案。
数据一致性
因为缓存属于持久化数据的一个副本,因此不可避免的会出现数据不一致问题,导致脏读或读不到数据的情况。
数据不一致,一般是因为网络不稳定或节点故障导致问题出现的常见 3 个场景以及解决方案:
缓存穿透
缓存一般是 Key-Value 方式存在,当某一个 Key 不存在时会查询数据库,假如这个 Key,一直不存在,则会频繁的请求数据库,对数据库造成访问压力。
主要解决方案:
对结果为空的数据也进行缓存,当此 Key 有数据后,清理缓存。
一定不存在的 Key,采用布隆过滤器,建立一个大的 Bitmap 中,查询时通过该 Bitmap 过滤。
缓存雪崩
缓存高可用
缓存是否高可用,需要根据实际的场景而定,并不是所有业务都要求缓存高可用,需要结合具体业务,具体情况进行方案设计,例如临界点是否对后端的数据库造成影响。
主要解决方案:
分布式:实现数据的海量缓存。
复制:实现缓存数据节点的高可用。
缓存热点
一些特别热点的数据,高并发访问同一份缓存数据,导致缓存服务器压力过大。
解决:复制多份缓存副本,把请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器压力
业界案例
案例主要参考新浪微博陈波的技术分享,可以查看原文《百亿级日访问量的应用如何做缓存架构设计?》
技术挑战
Feed 缓存架构图
架构特点
新浪微博把 SSD 应用在分布式缓存场景中,将传统的 Redis/MC + MySQL 方式,扩展为 Redis/MC + SSD Cache + MySQL 方式。
SSD Cache 作为 L2 缓存使用,第一降低了 MC/Redis 成本过高,容量小的问题,也解决了穿透 DB 带来的数据库访问压力。
主要在数据架构、性能、储存成本、服务化等不同方面进行了优化增强。
陛下...看完奏折,点个赞再走吧!
大型分布式系统中的缓存架构相关推荐
- 快速掌握:大型分布式系统中的缓存架构
关注我们获得更多内容 " 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 缓存概述 缓存概述 缓存的分类 缓存主要分为四类,如下图: 缓存的分类 CDN 缓存 CD ...
- 理解分布式系统中的缓存架构(下)
承接上一篇<理解分布式系统中的缓存架构(上)>,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计常见问题以及解决方案,业界案例. 1. 分层缓存架 ...
- 理解分布式系统中的缓存架构(上)
本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 1. 缓存概述 缓存概述 2. 缓存的分类 缓存主要分为以下四类 缓存的分类 2.1 CDN缓存 基本介绍 CDN(Conte ...
- 深入理解分布式系统中的缓存架构(下)
转载自 深入理解分布式系统中的缓存架构(下) 承接上一篇<理解分布式系统中的缓存架构(上)>,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计 ...
- 深入理解分布式系统中的缓存架构(上)
转载自 深入理解分布式系统中的缓存架构(上) 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 1 缓存概述 2 缓存的分类 缓存主要分为以下四类 2.1 CDN缓存 基本 ...
- 深入浅出分布式系统中的缓存架构
缓存,已经是一个老生常谈的技术了,在高并发读的情况下对于读服务来说可谓是抗流量的银弹. 高并发三大利器:缓存.限流.降级. 今天我们就来谈谈缓存.对于缓存,我的理解是让数据更接近于用户,目的是让用户的 ...
- 【分布式】Zookeeper在大型分布式系统中的应用
一.前言 上一篇博文讲解了Zookeeper的典型应用场景,在大数据时代,各种分布式系统层出不穷,其中,有很多系统都直接或间接使用了Zookeeper,用来解决诸如配置管理.分布式通知/协调.集群管理 ...
- 深入理解分布式技术 - 分布式系统中的缓存
文章目录 缓存无处不在 缓存的分类 前端缓存 网络传输缓存 服务端缓存 数据库缓存 缓存无处不在 缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis.Memcached 等后端存 ...
- 大型网站应用中MySQL的架构演变史
没有什么东西是一成不变的,包含我们的理想和生活!MySQL作为一个免费的开源的关系型数据库,深受大家喜爱,从最初的无人问津到当下的去IOE,都体现出了MySQL举足轻重的作用.今天我们就从淘宝的发展来 ...
最新文章
- 【Docker】容器的几种网络模式
- 中国矿业大学计算机英语复试,中国矿业大学2020计算机科学与技术学院考研复试科目参考书目...
- SAP MM 初阶之供应商寄售采购模式下ERS功能的测试
- angular4创建html,Angular 4 Http服务
- 简单试用了一下 dynamips 7200路由模拟器
- 黄褐斑的处理(转载)
- Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树
- cat命令详解_好程序员Python培训之详解eval好与坏
- 剑指offer-python解答
- 写给想做好社区网站人员的一本书
- 29_2020年12月29日疫情一览
- python json转换为dict的编码问题_python中json和字符编码的转换
- python小学教材全解_小学教材全解三年级下数学
- 女人,百花千红你最美
- windows自带桌面远程控制
- 颜色匹配 opencv版
- Vue-生命周期(函数)
- 基于Ace的Markdown编辑器
- matlab多元回归分析怎么计算,matlab在多元线性回归分析中的相关计算
- 雷神的微软平台安全宝典---第二章 简介
热门文章
- 单片机c语言的按键程序,51单片机按键扫描C程序
- 用pycharm写python_使用Pycharm编写第一个python程序
- 解题报告:【kuangbin带你飞】专题四 最短路练习题
- matlab处理图像位置,MATLAB图像处理:我的直方图的最后一个位置出现了
- 不同平台上安装python一样吗_在多个平台如何安装Python
- jquery实用应用之jquery操作radio、checkbox、select
- 关于如何在使用easyui的时候添加一个操作列的问题
- 『中级篇』docker容器安装wordpress(37)
- leetCode 46. Permutations 回溯问题 | Medium
- JQUERY知识总结