| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL缓存策略详解 -> 正文阅读 |
|
[大数据]MySQL缓存策略详解 |
MySQL缓存方案前提:读多写少,单个主节点能支撑项目数据量;数据的主要依据是mysql。 一、MySQL缓存方案目的分析mysql 有自己缓冲层,它的作用也是用来缓存热点数据,这些数据包括索引、记录等。mysql 缓冲层是从自身出发,跟具体的业务无关。这里的缓冲策略主要是 lru。 mysql 数据主要存储在磁盘当中,适合大量重要数据的存储;磁盘当中的数据一般是远大于内存当中的数据。 1.1、缓存层的作用MySQL缓存方案用来缓存用户定义的热点数据 ,用户直接从缓存获取热点数据,降低数据库的读写压力。 1.2、缓存层选择缓存数据库可以选用 redis,memcached;它们所有数据都存储在内存当中,当然也可以将内存当中的数据持久化到磁盘当中。
服务器
MySQL
redis
1.3、场景分析(1)内存访问速度是磁盘访问速度10W倍,访问磁盘的速度比较慢,尽量使获取数据是从内存中获取。 二、提升MySQL访问性能的方式(1)读写分离。 2.1、MySQL主从复制
复制流程:
由于MySQL的主从复制是异步的,所以同一时刻主数据库和从数据库的数据可能存在不一致的现象,这就造成可能从数据库中读取的数据不是最新的。 2.2、读写分离
DML操作
读
读
读
读
复制
复制
复制
复制
从
从
从
主
从
应用层
读写分离会设置多个从数据库,从数据库可能会在多个机器中。 写操作依然在主数据库中,主数据库提供数据的主要依据。 读写分离通过设置多个从数据库解决读压力。 读写分离主要依据MySQL的主从复制原理,因为MySQL的主从复制是异步复制的,所以读写分离只能保证数据的最终一致性,不能保证实时一致性。 2.3、连接池连接池的定义:在服务端当中创建多个与数据库的连接线程。 2.4、异步连接在服务端创建一个连接,针对这个连接采用非阻塞IO。这种方式可以节省网络传输时间。 三、redis作为主数据库的常用方法
数据备份
server
MySQL
redis
kafka
获取数据
返回数据
server
redis
leveldb
持久化
随着技术提升,leveldb的方式被淘汰,使用了更完善的pika方式。pika内部使用的rocksdb,支持redis协议。
server
pika
四、缓存方案4.1、缓存和MySQL一致性状态分析没有缓冲层之前,对数据的读写都是基于 mysql;所以不存在同步问题;这句话也不是必然,比如读写分离就存在同步问
缓存和MySQL一致性状态分析
MySQL有,redis无
MySQL无,redis有
都有,但数据不一致
都有,数据一致
都没有
4 和 5显然是没问题的,现在需要考虑1、2以及3。 首先明确一点:获取数据的主要依据是 mysql,只需要将mysql 的数据正确同步到缓存数据库就可以了。 注意:以MySQL为主,保证缓存不可用,整个系统依然要保持正常工作;mysql 不可用的话,系统停摆,停止对外提供服务。 4.2、制定读写策略
同步问题
读策略
写策略
安全优先
效率优先
读策略:先读缓存,若缓存有,直接返回;若缓存没有,读mysql;若 mysql 有,同步到缓存,并返回;若 mysql 没有,则返回没有。
读
Y
N
N
server
redis
判断数据存在与否
返回
读MySQL
判断数据存在与否
Y
同步数据到redis
写策略:从安全优先方面考虑;先删除缓存,再写 mysql,后面数据同步交由 go-mysql-transfer 等中间件处理(将问题 3 转化成 1)。
写
删除redis对应数据
同步数据
server
MySQL
redis
同步策略
写策略:从效率优先方面考虑;先写缓存,并设置过期时间(如 200ms),再写mysql,后面数据同步交由其他中间件处理。
写
设置key过期时间
过期
同步数据
数据同步成功
数据同步失败
server
redis
200ms
删除脏数据
同步策略
MySQL
五、同步方案同步方案可以有: 5.1、canalcanal会考虑分布式问题,如果一个canal宕机了,会有从canal顶替上来,保证服务正常提供。
同步方案
同步
同步
canal client
canal
server
MySQL
redis
5.2、go-mysql-transfergo-mysql-transfer只有一个节点,相对canal简单些,没有解决分布式问题。要增强go-mysql-transfer的高可用,可以引入etcd、zk等。
同步
同步
server
MySQL
go-mysql-transfer
redis
操作步骤:
(3)修改go-mysql-transfer中的app.yml文件的规则配置,设置热点数据。
(4)写lua同步逻辑。 六、缓存方案的故障问题及解决6.1、缓存穿透假设某个数据 redis 不存在,mysql 也不存在,而且一直尝试读怎么办?缓存穿透,数据最终压力依然堆积在 mysql,可能造成mysql 不堪重负而崩溃。 解决方案: 6.2、缓存击穿缓存击穿是某些数据 redis 没有,但是 mysql 有;此时当大量这类数据的并发请求,同样造成 mysql 过大。
服务器
mysql
redis
服务器
服务器
服务器
解决方案: 6.3、缓存雪崩表示一段时间内,缓存集中失效(redis 无, mysql 有),导致请求全部走 mysql,有可能搞垮数据库,使整个服务失效。 缓存数据库在整个系统不是必须的,也就是缓存宕机不会影响整个系统提供服务。 6.4、缓存方案的弊端不能处理多语句的事务。redis不支持回滚,造成redis个MySQL的不一致。 七、总结
后言本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux系统提升感兴趣的读者,可以点击链接,详细查看详细的服务:C/C++服务器课程 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/22 15:24:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |