1.1 冷热分离定义
冷热分离:就是在处理数据是将数据库分成冷库和热库两个库
冷库:指存放那些走到了终态的数据的数据库
热库:指存放还需要修改的数据的数据库
1.2 什么情况下使用
- 数据走到终态后,只有读没有写的需求,比如订单完结状态
- 用户能接受新旧数据分开查询,比如默认只让查询3个人月内的订单
1.3 冷热分离的思路
(一)如何判断一个数据到底是冷数据还是热数据?
3个角度去判断
- 时间维度
- 状态维度
- 组合字段
需要根据实际业务去定,需要注意两点
- 如果一个数据被标识为冷数据,业务代码不会再对它进行写操作;
- 不会同时存在读冷/热数据的需求。
(二)如何触发冷热数据分离?
- 直接修改业务代码,每次修改数据时触发冷热分离
- 如果不想修改原来的业务代码,可通过监听数据库变更日志 binlog 的方式来触发
- 通过定时扫描数据库的方式来触发
每种触发逻辑的建议场景
修改写操作的业务代码:建议在业务代码比较简单,并且不按照时间区分冷热数据时使用。
监听数据库变更日志:建议在业务代码比较复杂,不敢随意变更,并且不按照时间区分冷热数据时使用。
定时扫描数据库:建议在按照时间区分冷热数据时使用。
(三)如何实现冷热数据分离?
分离冷热数据的基本逻辑如下:
- 判断数据是冷是热;
- 将要分离的数据插入冷数据库中;
- 再从热数据库中删除分离的数据。
逻辑看起来简单,而实际做方案时,以下 3 点我们都得考虑
(1)一致性:同时修改多个数据库,如何保证数据的一致性?
(2)数据量:假设数据量大,一次性处理不完,该怎么办?是否需要使用批量处理?
(3)并发性:假设数据量大到要分到多个地方并行处理,该怎么办?
(四)如何使用冷热数据?
在功能设计的查询界面上,一般都会有一个选项供我们选择需要查询冷数据还是热数据。
如果界面上没有提供,我们可以直接在业务代码里区分。(说明:在判断是冷数据还是热数据时,我们必须确保用户不允许有同时读冷热数据的需求。)
整体解决方案
有用的话打赏一下?👇
评论