| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Tendis(Redis)冷热混合存储怎么解决缓存击穿、雪崩、一致性3大难题 -> 正文阅读 |
|
[大数据]Tendis(Redis)冷热混合存储怎么解决缓存击穿、雪崩、一致性3大难题 |
导语 本文首先介绍由 IEG 技术运营部团队 & 腾讯云数据库团队开发的TendisX 冷热混合存储方案的整体架构,然后分析常用的解决缓存和数据库一致的方案存在的一些问题,最后从缓存一致性、击穿、雪崩、穿透、故障恢复、性能、业务接入复杂度等方面对这几个方案进行对比。 背景在数据高并发读写场景, 数据库大多情况无法满足业务要求。 Redis 由于数据结构简单,读取速度快, 常常作为后端数据库的缓存使用。但是在使用缓存的时候,业务需要考虑: 1)是先写缓存还是先写数据库? 2)写请求是否更新缓存?等等问题。 TendisX 冷热混合存储方案TendisX 是 IEG 技术运营部自研,主要解决 Redis 内存占用高和缓存不一致问题的 NoSQL 存储系统。 Proxy组件:负责对客户端请求进行路由分发,将不同的Key的命令分发到正确的分片,同时Proxy还负责了部分监控数据的采集,以及高危命令在线禁用等功能。 缓存Redis:缓存Redis组件基于 Redis 4.0 进行开发。Redis 具有以下功能:缓存全量的 Key;仅淘汰冷 Key 的 Value; 自动从 Tendisplus 恢复数据; Redis 限速。 存储Tendisplus:Tendisplus 是腾讯基于 RocksDB 自研的 兼容 Redis 协议的KV存储引擎,该引擎已经在腾讯集团内部运营多年,性能和稳定性得到了充分的验证。在混合存储系统中主要负责全量数据的存储和读取,以及数据备份,增量日志备份等功能。 缓存与数据库一致性的常规解决方案在使用缓存的过程中往往会由于不正确的使用方式,导致缓存和后端数据库数据不一致,本章将介绍缓存的常见使用方式以及业界的解决缓存和数据库不一致的方案。 缓存使用方式缓存作为一种广泛使用的技术, 常见的主要有以下三种使用模式: Cache Aside Pattern, Cache Through Pattern 和 Cache Back Pattern(具体介绍可以参考这篇文章Things You Should Know About Database Caching)。Cache Aside Pattern 是最常用的模式,Facebook 在 Scaling MemCache at Facebook 论文中也使用这种缓存模式。Cache Aside Pattern 采用先写数据库,再删除缓存,然而在某些情况也可能导致缓存和数据库的不一致。 在缓存+数据库的架构中,缓存和数据库的操作总共有以下几种顺序:
通过上面分析可以得出,业务方无论是先写缓存还是先写数据库,最终都有可能出现缓存和数据库的不一致。那到底如何才能使缓存和数据库达到一致的状态。针对这个问题, 业界通常使用下面两种解决方案: 1)采用延时双删策略 2)异步更新缓存策略 。 采用延时双删策略延时双删除策略会在写库前后删除缓存中数据,并且给缓存数据设置合理的过期时间, 从而可以保证最终一致性。写流程具体如下:
异步更新缓存策略(基于订阅binlog的同步机制)异步更新缓存策略通常会使用一个异步同步组件(比如 canal 或者我司的 MySync), 通过解析从库的 binlog 获取数据,并通过消息队列将其串行化写入到缓存。
读流程:
异步更新缓存策略通过消息队列的方式将并行化的操作串行化,从而解决了并发问题。但是也引入一些其他问题,比如缓存相对主库落后延迟较大。 TendisX 混合存储方案TendisX 中, 业务仅仅可以访问 Redis, 所有的数据恢复工作对业务不可见。因此业务可以简单的将其当做一个Redis 服务来用,而不用考虑各种缓存的问题。 Redis 与社区版不同的地方:
写请求流程如下:
方案对比下面主要从缓存问题、主备切换场景、性能以及业务接入复杂度方面,对比 TendisX 冷热存储和延时双删策略、异步刷新策略。 缓存问题TendisX 在使用过程中不会出现缓存穿透、缓存击穿、缓存雪崩和缓存不一致等问题。但是延时双删策略和异步刷新策略要看业务方如何处理,解决这些问题。 缓存穿透缓存穿透是指查询数据库不存在的数据。当查询缓存和数据库都没有的 Key 时,由于 TendisX 中 redis 缓存用户的所有 key, 因此可以直接通过 redis 判断该 key 是否存在,不会有缓存穿透的问题。 缓存击穿如果某些 Key 可能会在某些时间点被超高并发地访问,则它是一种非常“热点”的数据。缓存击穿是指大量的请求同时查询一个失效的热点数据,导致请求全部转发到数据库。
缓存雪崩缓存雪崩是指某一时刻发生大规模的缓存失效的情况,比如缓存故障或者缓存采用相同的过期时间,缓存在某一时刻同时失效, 请求全部转发给数据库。 缓存一致性延时双删策略
异步更新缓存策略 TendisX 混合存储 如果需要从 Tendisplus 中恢复数据,则请求 A 和 B 都阻塞。当数据恢复后,再唤醒阻塞的请求 A 和 B, 缓存和后端 Tendisplus 最终是一致的。 主备故障场景分析当 TendisX 中 redis master 故障时, 后端的 Tendisplus 可以切到对应的 redis slave。主备之间通过异步复制,可能会造成部分数据丢失。 TendisX 在 redis 主备和 redis 和 Tendisplus 同步的时候提供了限速,也就是说 slave 最多比 master 慢 2秒的数据(业务方在最差情况下丢失的数据)。 对于延时双删策略和异步刷新策略 数据可容忍的丢失程度。 性能分析延时双删策略和异步刷新策略的劣势:
TendisX的一些性能优势:
业务接入复杂度延时双删策略需要业务同时操作缓存和数据库,同时业务方也要保证第二次删除缓存失败后的重试,对业务来说使用比较麻烦,不友好。 总结对比下面通过一个表来直观的对比 TendisX 冷热混合存储和另外两种策略: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:01:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |