【经验】mysql冷热数据分离

        使用mysql存储时,为了提升数据的查询效率,降低磁盘存储压力等,我们常常使用"冷热数据分离"分离的方案。即,将数据从所谓的“热表”(即经常有写入和查询操作的活跃表)迁移到“冷表”(用于存档或不常访问的数据表),并随后清理热表中的数据。下面我们从整体上了解一下对数据做冷热数据分离需要考虑哪些因素?常见的方案有哪些?

一、确认冷热数据区分标准

        冷热数据分离的标准可以根据不同的业务场景和需求来定制,但通常会基于以下几个核心维度来定义:

1. 访问频率:

        热数据:频繁访问的数据,如最近产生的交易记录、用户活动日志或实时分析所需的数据。

        冷数据:很少访问的数据,比如历史归档记录、旧的报告或备份数据。

2. 数据时效性:

        热数据通常指最近时期内产生且与当前业务操作紧密相关的数据。

        冷数据则是过了某个时效点,不再频繁用于日常操作的数据。

3. 业务重要性:

        关键业务流程中的数据可能被视作热数据,即使访问频率不高,因其对决策支持至关重要。

        辅助或历史参考性质的数据则可能划分为冷数据。

4. 数据更新频率:

        经常需要修改或增删的数据倾向于归为热数据。

        不再或极少需要更新的数据则为冷数据。

5. 存储成本与性能需求:

        需要快速访问以保证系统响应速度的数据应存储在高性能介质上,视为热数据。

        对访问速度要求不高的数据可以存储在成本较低、读写速度较慢的介质上,作为冷数据。

6. 合规与法律要求:

        某些数据可能因合规或法律要求必须保存一定期限,但并不频繁使用,这类数据会被归类为冷数据。

        实施冷热分离时,还可以设定具体的时间界限,如最近3个月的数据为热数据,超过3个月自动转为冷数据。此外,还可以结合数据的重要性、敏感度等因素综合判断。为了实现有效的分离,企业往往会利用分层存储技术,如将热数据存储在SSD或内存中,冷数据则存储在HDD或低成本云存储中。

二、冷热数据分离

1、分区表(Partitioning)

        适用场景:当数据量巨大且有明确的时间或范围划分标准时,可以使用MySQL的分区功能,将数据按时间或范围划分到不同的物理区域。这样,查询时可以直接定位到相应的分区,减少数据扫描范围。

        操作方式:根据业务需求(如按月、按季度)创建分区表,将热数据置于活跃的分区,冷数据自动归档到历史分区。

2、数据库分片(Sharding)

        适用场景:适合超大规模数据存储,将数据分布在多个数据库或表中,每个分片存储一部分数据。

        操作方式:可以基于某种规则(如用户ID取模)将热数据和冷数据分散到不同分片,热分片可以配置在高性能硬件上,冷分片则配置在低成本存储。比如,按城市分库,业务热点城市分布在高性能硬件;非热点城市使用低成本存储。

        但一般规模数据,数据量差异性不大时,使用此方案反而可能增大维护成本。

3、归档策略

        适用场景:定期将不再频繁访问的数据从热表迁移到冷表或归档表。

        操作方式:利用INSERT INTO...SELECT结合DELETE语句,或者编写脚本自动执行迁移和清理工作。可以设置定时任务(cron job)来自动化这一过程。

        归档策略在我们的业务中也比较常用,通过定时任务在低峰期跑数据。但因为涉及到数据迁移,所以业务和功能要兼容。并且需要合理设计处理时间范围数据量级、数据删除前要进行数据验证,并设计好回滚方案

4、使用中间件或代理层

        适用场景:当需要更灵活的路由控制和透明的数据迁移时。

        操作方式:如ProxySQL、MaxScale等,可以在中间件层面实现数据访问的路由,将查询重定向到正确的热或冷数据存储,同时在后台执行数据迁移而不影响前端应用。

        此方案的好处是路由灵活,弊端是需要加入中间件或一层路由转发,链路变长,复杂度增加,耗时可能增加。

5、使用专门的归档工具或服务

        适用场景:企业级环境,需要自动化、安全的数据归档和恢复能力。

        操作方式:如MySQL Enterprise Backup、Percona XtraBackup等工具,以及云服务提供商提供的数据归档解决方案,可以自动化备份热数据,并在必要时进行数据恢复或迁移。

6、 冷热存储分离

        适用场景:当硬件资源允许时,直接在物理存储层面进行冷热分离。

        操作方式:将热数据放在高速存储介质(如SSD),冷数据迁移到低成本、大容量的存储设备(如HDD或云存储)。配合MySQL的分区或分片策略,实现数据的物理隔离

7、 数据库复制

        适用场景:需要保持数据副本,或者将冷数据迁移到备用数据库服务器。

        操作方式:利用MySQL的主从复制或组复制功能,将热数据同步到一个或多个从库,然后在从库上执行数据迁移和归档操作。读写分离,降低对主库IO。

三、归档一般执行过程:

        分区、数据库分片还会涉及到分库分表等工具的选择,后面我将放到分库分表相关的文章中讲解。这里我们详细说明下归档策略的一般执行过程:

1、创建冷表结构:

        首先确保冷表的结构与热表相同。你可以使用如下的SQL命令来复制表结构:

CREATE TABLE cold_table LIKE hot_table;

 2、数据迁移:

        使用 INSERT INTO...SELECT 语句将热表的数据插入到冷表中。比如:

INSERT INTO cold_table
 SELECT * FROM hot_table
   WHERE some_condition;

        如果没有特定条件,直接移除 WHERE some_condition即可。

        但一般冷数据将分布到性能相对较弱的数据库集群中,所以实际迁移逻辑会更复杂,可能需要拆分开,连接不同的数据库。

3、数据验证:

        在执行删除操作之前,确保冷表中已经正确地包含了需要的所有数据。可以通过比较记录数或关键字段来验证。

        数据验证这一步非常重要,是数据迁移过程中保证完整性和正确性的关键步骤。

        虽然数据可以通过binlog或者备份恢复,但恢复过程需要一定时间,而且有一定风险。所以在迁移数据时,最好一步到位。

4、清理热表数据:

        一旦确认数据迁移无误,就可以从热表中删除已迁移的数据。如果之前迁移时有特定条件,同样应用这个条件来删除数据:

DELETE FROM hot_table
   WHERE some_condition;

        同样,如果没有特定条件,直接执行全表删除需谨慎

5、优化表:

        删除大量数据后,为了恢复性能和管理存储空间,建议对热表进行优化:

OPTIMIZE TABLE hot_table;

        如果不执行表优化,虽然表空间不会回收,但有新写入数据时,会占用此空间,不会占用新空间。所以我们有些数据删除后,并不会执行optimize操作,因为optimize操作可能锁表

optimize操作可能锁表:

        InnoDB引擎: InnoDB存储引擎在执行OPTIMIZE TABLE时,实际上会执行ALTER TABLE操作来重建表,这意味着它会创建一个新的表结构,并将数据从旧表复制到新表中,然后再删除旧表。在这个过程中,对于InnoDB表,如果表不是太大的话,默认的在线DDL操作(Online DDL)会让表在大部分时间内可读可写,但是,在操作的某些阶段可能会出现短暂的锁表情况,特别是如果表很大或者DDL算法选择不当,可能会导致长时间的锁表,影响写操作。

        MyISAM引擎: MyISAM引擎在执行OPTIMIZE TABLE时,会锁定整个表,直到操作完成。这意味着在优化期间,对该表的所有读写操作都会被阻塞。对于大型表,这可能会导致服务中断,因此在生产环境中应谨慎安排此类维护操作。

6、 事务处理:

        如果数据量大或者对数据一致性要求高,考虑在事务中执行这些操作,以确保数据迁移和删除操作的原子性。

7、计划任务或脚本:

        如果这是定期需要执行的任务,可以编写脚本并通过定时任务(如Linux的cron作业或Windows的任务计划程序)自动化执行。

开放手动归档入口:

        同时,为了方便处理异常数据,我们可以封装脚本核心内容,开放手动修改入口。

        有些异常情况下,如服务器宕机,Job突然挂掉,Job建连失败时,我们的归档执行可能无法从上次停止的地方开始,这时候研发或产品等可能需要根据指定条件手动对数据归档。

        这种修复数据的小工具对我们是非常重要的,我们既需要考虑正向编写业务,也需要考虑反向修复数据。有些突发异常来临时,这些小工具真的会解燃眉之急。

8、预估归档速度

        在正式归档前,我们需要预估归档速度,并根据待归档数据计算出归档耗时。因为我们多在低峰期时归档,如果数据太多,执行到高峰期,可能会影响正常业务执行。

总结:

        以上就是我对冷热数据分离方面概述,其实涉及的方面非常多,每一项展开都能“说个三天三夜”。考虑的方面其实也远不止这些,还有如何高效确定数据归档偏移?  如果数据误删除,可以通过哪些方式快速找回来等。有机会我们再继续说。

        有归档经验分享小伙伴可以留言一起交流。

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL冷热分离是一种将热数据和冷数据分开存储的策略。热数据指的是那些经常被访问的数据,而冷数据则是那些不经常被访问的数据。 根据引用的说明,如果每次访问都需要去移动链表,会对性能造成下降。因此,MySQL针对热数据区的数据转移也有相关的规则。 根据引用的描述,冷数据是指那些久远的历史数据,可以将其存放到冷数据数据中心池子中,而线上的MySQL只需要保留最近一段时间的数据。 通过冷热分离的策略,可以将热数据存放在高性能的存储介质中,提高数据的访问效率。同时,冷数据可以存放在较低成本的存储介质中,以节省成本和资源。这种策略还可以减少线上MySQL数据库的负载,提高数据库的整体性能和响应速度。 在冷热分离的过程中,为了不改变现有项目使用数据的方式,降低数据库使用者的门槛,需要兼容MySQL单表的使用协议,确保对线上数据库和离线数据数据中心的兼容性。 总结起来,MySQL冷热分离是一种将热数据和冷数据分开存储的策略,通过将热数据存放在高性能介质中,冷数据存放在低成本介质中,来提高数据库的性能和资源利用效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [什么是数据库的 “缓存池” ?(万字长文)](https://blog.csdn.net/bjweimengshu/article/details/113361587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [惊了! MySQL 热冷数据分离设计还能这样!](https://blog.csdn.net/uxiAD7442KMy1X86DtM3/article/details/110729642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王师傅66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值