Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >亿级大表冷热分级的工程实践

亿级大表冷热分级的工程实践

原创
作者头像
后台技术汇
修改于 2024-02-06 01:49:50
修改于 2024-02-06 01:49:50
5.2K11
举报
文章被收录于专栏:后台技术汇后台技术汇

1、前言

1.1 方案背景

成熟的业务系统都会配套一个重要的旁路系统--操作日志,它用于监控和记录核心业务系统的操作,以确保系统的稳定性和安全性。

操作日志系统会通过MQ去解耦核心业务,通过采集各个微服务的操作数据,最终将数据持久化在DB等廉价媒介。

而随着业务的快速发展,数据量急剧增长,为了提高数据存储和查询效率,则需要根据业务场景选择不同的拆表方案。

思维导图
思维导图

1.2 面临问题

我们的业务系统也配套了操作日志系统,用来记录用户的日常代码评审事件。从2014年服务上线至今,随着业务的不断扩展,产生了许多大表,其中之一就是事件表events。

在运维工具看到事件表events已经比较臃肿,有几个亿的数据,表体积达几百GB;面临的问题有:

(1)业务慢sql问题:虽然在DB高可用设计上,对Mysql集群采用了读写分离,但事件表依旧存在“读慢写慢”的问题

>读数据(个别读sql执行时间>40s)

读数据
读数据

>写数据(写sql执行时间>1s)

写数据
写数据

(2)业务表拓展问题:单一大表支撑不了日益膨胀的数据增量,当下事件表日增量20w,半年增量1500w,问题迫切

(3)DB 运维:

  1. 运维给DB集群造成压力:过3亿的数据量,执行任何DDL背后都是一次巨大的计算量,操作导致的锁表时间过长,甚至会影响其它正常业务;
  2. 备份成本高:即使通过 rename 完成业务切换,事件表表350GB的体积,每次备份都是一个巨大的资源和时间开销,甚至阻塞迭代发布进度;
  3. 数据延迟大:甚至 DDL 变更期间,由于强同步配置,还会造成从库的数据延迟问题。

2、冷热分级存储

2.1 消费链路分析

如上文所说,旁路系统一般不直接和业务系统耦合,而是通过mq来进行解耦合。

你需要做到:

  • 摸清整套旁路系统的事件消费链路
  • 了解各个业务模块的接入方式(因为最终依赖业务数据进行测试验证)

2.2 方案讨论

按照表拆分原则可以分为3种方法:

  1. 水平拆分
  2. 垂直拆分(此前有介绍过:《大表垂直拆分的工程实践》
  3. 冷热分表

如下所示:

原理

好处

不足

水平分表

将一个大表按照某种规则(如行键范围)拆分成多个结构相同的小表

1.将数据分散到这些拆分出来的表中,解决了单一表数据量过大而产生的性能问题 2.避免IO争抢并减少锁表的几率

1.路由规则复杂 2.多次拆分和分表扩容难度大 3.跨库join的问题 4.分表存储不均匀(导致子表数据量过大)

垂直分表

将一个表按照字段分成多个表,每个表存储其中一部分字段

1.业务表功能划分明确 2.避免IO竞争减少锁表的概率,更好地提升热门数据的查询效率

事务处理较复杂

冷热分表

将一个表数据分为冷热两部分,分别采用不同的存储和访问策略

1.提高性能:通过将热数据存储在高性能的存储中,可以大大提高数据的访问速度,从而提高数据库的性能。 2.降低存储成本:将冷数据存储在低成本的存储中,可以降低存储成本,同时也可以释放出更多的高性能存储资源,用于存储热数据。 3.提高数据管理效率:通过将冷热数据分开管理,可以更好地控制数据的生命周期,如定期清理冷数据等,从而提高数据的管理效率。

1.保证数据的完整性和一致性的方案复杂 2.实现数据的迁移和管理要额外进行 3.仍然无法解决单表数据量过大的问题

2.3 需求分析

选取技术方案,要结合产品需求去落地,否则南辕北辙。

汇总一下产品需求:

  1. 考虑到操作日志数据的业务特殊性,用户高频查询的是近期热数据,极少数情况下会追溯到一年前甚至几年前的冷数据;
  2. 另外,我们有超过85w项目,部分项目处于稳定运营状态(一年内没有代码提交),这类“冷项目”也应要保留一定的操作记录,方便在项目维护期进行追溯;

最终,研发抽象出以下需求:

  1. 接受一年或者半年内的热数据范围,提高页面可用性
  2. 期望所有项目都至少能保留1w条数据(考虑到可能存在的代码维护性需求)
  3. 提供对冷数据查询提供能力

2.3.1 实施评估

2.3.1.1 水平分表
  1. 开发维护和时间成本都较大
  2. 存在活跃和不活跃项目,难以做到分表数据均匀
2.3.1.2 垂直分表
  1. 要重构模型,且迁移字段会涉及更多的业务兼容,会增加当前问题的复杂度
  2. events表的确也大字段,但短期待解决的是大数据量问题
2.3.1.3 冷热分表
  1. 当下大表从业务场景看,是日志类型的大表,提供建立冷表,保留近期热数据可读写,其他的过期数据进行冷存储。
  2. 既满足产品需求,也符合当下技术方案选择

综上所述,考虑了当前产品需求、开发成本和可扩展性,决定采用冷热分表存储的方案。

2.4 方案落地

确定冷热分表方案后,需要进行实施落地。这包括数据迁移、表结构调整、索引优化、应用程序代码修改等一系列工作。同时,需要考虑如何保证数据的一致性和完整性,以及如何进行故障恢复等问题。

2.4.1 冷热数据

2.4.1.1 热数据
  • 访问频次较高或创建时间较近的数据,通常以高速存储为载体,支持数据高效访问(我们保持Mysql作为热数据表)
2.4.1.2 冷数据
  • 访问频次较低的数据,通常可存储在冷数据盘即可降低数据的存储开销又可满足数据访问的需求。
2.4.1.3 冷热数据分界线

冷热分界线是一个在业务层面定义区分数据冷热的分界线,一般按数据量和查询时间覆盖范围,确定多长时间之前的数据需要转移到冷存储。另外,也要结合业务产品的需求,例如,对冷项目也有保留定量数据的兜底需求。

最终的冷热数据分界线规则如下:

  • 项目不足1万条数据&没有近1年数据:取全量数据;
  • 项目超过1万条数据&没有近1年数据:取1w条数据;
  • 项目不足1万条数据&有近1年数据:取全量数据;
  • 项目超过1万条数据&有近1年数据:取并集数据;
2.4.1.4 冷表模型评估

冷表模型和热表模型是可以存在差异的。

  • 尤其是聚合字段(一个json或者yaml格式的字符串、列表等,用于对不同业务进行补充性描述),会影响到索引覆盖,而新模型如果设计更加细致,可以加速索引覆盖
  • 结合需求紧急度,决定当下还是未来进行模型调整

2.4.2 冷数据存储介质

调研了当下有以下几种较合适的冷数据存储方案

  1. Mysql:当下使用的存储方案,满足最大的业务需求
  2. TDSQL:腾讯云提供的一种分布式关系型数据库服务
  3. HBase:Apache Hadoop生态系统的一部分,是一个分布式的、可伸缩的、大数据存储系统;同时非常适合存储冷数据,因为它允许高效地插入和读取大数据,同时为冷数据提供了压缩和分层存储的选项。

结合当下迫切需求和开发工作量,同时也使得开发成本好评估,我们觉得可以继续把冷数据存Mysql,切换冷数据源的任务还可以再讨论。

2.4.3 冷数据迁移方案

2.4.3.1 方案一:只迁移热数据
方案一
方案一

方案步骤:

  1. 将events当做冷表
  2. 新建hot_events作为热表
  3. 增量数据双写和存量数据迁移:将近一年的热数据写入hot_events
  4. 业务兼容:大部分接口调用指向hot_events
2.4.3.2 方案二:只迁移冷数据
方案二
方案二

方案步骤:

  1. 将events当作热表
  2. 新建cold_events作为冷表
  3. 迁移冷数据:计算冷热分界线(超一年或超1w条),冷数据写入cold_events
  4. 业务兼容:少量查冷数据的接口进行兼容
2.4.3.3 方案对比

原理

好处

不足

只迁热数据

events当作冷表,hot_events作为热表

迁移热数据量小

原有的复杂业务调用都要改,且迁移步骤复杂业务兼容工作量较大

只迁冷数据

events当作热表,cold_events作为冷表

迁移步骤简单原有的复杂业务调用不用任何调整,业务兼容工作量较小

迁移数据量大

最后我们选择方案二,即只迁移冷数据;虽然迁移冷数据量会大一点,但迁移任务本身不要求过高性能。

2.4.3.4 方案细化

具体实现细节大同小异,无非是查出冷数据,数据写入新表,删除旧表数据,但还是有以下的几个点需要注意下:

注意1:迁移任务幂等性

因为迁移任务执行过程中,往往可能有突发状况,比如,升级hotfix,下游业务发布影响等;这会导致任务中断,此时需要迁移任务天然支持重放。

注意2:事务性和一致性

为确保数据一致性,写入删除数据最好封装成一个事务,并且控制写入删除的粒度尽量小,最好写一条删一条。

注意3:try..catch..和事务框架冲突

迁移任务一般是异步执行,并且依赖线程池和事务框架来满足需求;

业务一般喜欢用大的try..catch..捕获迁移异常,而因为事务框架往往是通过捕获异常去实现回滚的(例如Spring-tx框架),这个冲突要注意下。

注意4:读sql性能

查冷数据本质就是读大表的sql,我们可以参考各部门的sql开发规范:

  • 注意索引覆盖
  • 注意回表次数,可以通过覆盖索引来查询数据
    • 第一步通过索引查询到主键,第二步通过主键取查询具体的记录(回表)
    • 使用覆盖索引能够在第一步就得到数据,避免回表
  • 注意order by column,如果跟索引覆盖字段不一致,则可能导致执行非常耗时
  • 如果有使用第三方ORM框架(比如PageHelper等),应该避免默认配置导致的冗余查询
注意5:读写数据频率
  • 建议使用单线程执行迁移,避免sql并发操作,避免DB负载过大;
  • 每批数据迁移完,可以适当设置Thread.sleep(),释放CPU资源,避免CPU消耗过高。
注意6:order by 导致的慢sql

真实迁移过程中,会产生慢SQL,比如,单个项目的索引命中的数据量>2000w,这时候的分页+排序的方式读数据将不可取,可以考虑下,遗留数据有序性是否有必要。

2.4.4 业务兼容

按使用场景划分,业务调用分为数据检索类和数据统计类,下面分别给出一点建议:

2.4.5 运维接口

为了防止线上意外情况,我们需要额外冗余一批接口来解决意外情况,比如:

  • 清理热表或者冷表脏数据
  • 手动批量迁移的能力

3、迁移效果

3.1 迁移效果

3.1.1 冷热表数据

经过一段时间的迁移,我们完成了既定目标:将冷数据迁移到了冷表,效果如下:

  1. 项目数量>87w,最终热数据有1亿5600w(考量到项目可维护性,给超过84w个项目至少保留了1w条数据,保留的热数据至少有1亿4000万)
  2. 通过冷热数据分离,冷表有效剥离了大表超过60%的数据,热表数据则保留了40%的数据,有效缓解了大表膨胀的压力
  3. 热表的可读写性能提高了巨大,解决了热表读写慢的问题

3.1.2 性能提升

从观测效果来看,因为大表导致超时的接口(nginx监控>45s),在做了冷数据迁移后,响应时间降低到了1.76s,因此大表冷热数据分级的效果还是很明显的。

迁移前
迁移后

4、总结与展望

冷热数据分级是一种有效的解决单表大数据存储和查询问题的方案,可以优化存储资源分配和提高查询效率,在实施过程中需要考虑以下几点:

  • 评估冷热表数据分界线(数据访问频率、重要程度和存储成本等方面)
  • 制定冷热分表方案,并进行持续的监控和SQL优化

在可预测的未来,我们还有几个地方可以做的更好:

  • 多级存储策略:未来可能会采用更复杂的分级策略,例如基于数据的访问频率、重要性或时效性进行多级划分,并采用不同的存储策略和介质
  • 冷表膨胀解决方案:虽然当下热表的可读写性能满足需求,并且实现了冷数据自动迁移,但冷表数据量还是在不断增长,届时要切换更低成本的存储介质,并做好业务兼容工作

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
11 条评论
热度
最新
有个问题单表迁移这些冷数据,那他们的关联表要去关联查咋办
有个问题单表迁移这些冷数据,那他们的关联表要去关联查咋办
111举报
与业务层面达成一致,不需要关联吧
与业务层面达成一致,不需要关联吧
回复回复点赞举报
二人
二人
回复回复点赞举报
检索需要查询所有范围的数据,冷表也是一个大表,聚合这两步的数据的时候,这种场景下还是很慢。怎么解决呢?
检索需要查询所有范围的数据,冷表也是一个大表,聚合这两步的数据的时候,这种场景下还是很慢。怎么解决呢?
11点赞举报
冷表一般情况下,不会使用关系型数据库,而是用更低成本的存储介质,将冷热数据进行分层存储,比如HBase方案; 另外,假设遇到冷表数据查询场景,建议直接导给用户,并在产品层面做说明,应该也能解决问题。
冷表一般情况下,不会使用关系型数据库,而是用更低成本的存储介质,将冷热数据进行分层存储,比如HBase方案; 另外,假设遇到冷表数据查询场景,建议直接导给用户,并在产品层面做说明,应该也能解决问题。
回复回复点赞举报
膜拜大佬
膜拜大佬
11点赞举报
🌝🌝🌝老哥谢谢
🌝🌝🌝老哥谢谢
回复回复点赞举报
厉害厉害
厉害厉害
11点赞举报
2024年祝你越来越稳
2024年祝你越来越稳
回复回复点赞举报
膜拜大佬
膜拜大佬
11点赞举报
geigei你真稳,开车又快又安全🌝🌝
geigei你真稳,开车又快又安全🌝🌝
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
数据架构:概念与冷热分离
关于架构,大家都有了解和理解。通常一个业务或项目,在做架构设计时,可能会包含业务架构和技术架构。其中技术架构是我们作为开发角色,在做设计时重点的工作内容。但还有架构类型的划分方式,会包括业务架构、技术架构、数据架构和应用架构四种。
程序员架构进阶
2021/05/09
1K0
麻了!亿级别大表拆分心路历程
笔者是在两年前接手公司的财务系统的开发和维护工作。在系统移交的初期,笔者和团队就发现,系统内有一张 5000W+ 的大表。
架构师修炼
2022/03/31
1.1K0
麻了!亿级别大表拆分心路历程
亿级大表垂直拆分:上云业务的工程实践
伴随着不断扩张的业务量,在数据库层面一般会经历数据拆分。解决问题的第一步,就是重新评估 DB 表结构设计的合理性。
后台技术汇
2023/09/25
1K0
亿级大表垂直拆分:上云业务的工程实践
实战 2000w 数据大表的优化过程,提供三种解决方案
当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题
码猿技术专栏
2023/05/01
3.1K0
实战 2000w 数据大表的优化过程,提供三种解决方案
存储优化--分区与冷热分离
本文是专题的第一篇文章,主要讲解优化数据存储,涉及到锁、批处理、重试机制以及数据一致性等问题。下面 我们就开始吧。
喵叔
2022/05/25
1.2K0
海量数据业务有哪些优化手段?
互联网时代,亿级用户各种网络行为产生大量数据,如何解决海量数据存储?如何高性能读写?解决思路有哪些,本文列举了常用的解决方案:
微观技术
2021/04/19
1.7K0
海量数据业务有哪些优化手段?
降本30%,酷家乐海量数据冷热分离设计与实践
作者 | 王小波 编辑 | 李忠良 降本增效一直是研发团队追求的目标之一,面对不断上涨的数据量,研发侧开始思考如何在不降低用户体验的情况下进行成本压减,冷热数据分离的架构思想引起了我们的注意。 背   景 定制家具业务是酷家乐最早的业务之一,定制家具的方案数据也同样沉淀了多年的数据;数据库从早期的 MongoDB 到切换到现在的 HBase;存储逻辑也从原来的全量保存演进到现在的分片增量保存。 随着数据量不断增大,带来的是巨大的成本压力与运维难度,目前定制 HBase 集群仅单副本数据量接近 15
深度学习与Python
2023/03/29
1.1K0
降本30%,酷家乐海量数据冷热分离设计与实践
TiDB + ES:转转业财系统亿级数据存储优化实践
本文详细介绍了转转业财系统亿级数据存储优化的实践。面对系统数据量大、慢查询多等挑战,转转业财采取了 TiDB 方案优化数据量问题,同时引入 Elasticsearch(ES)解决慢查询难题。实践表明,通过底层数据存储切换和 ES 接入,系统成功突破了存储瓶颈,显著提升了查询效率和响应速度,为大规模数据处理提供了有效的优化路径。
PingCAP
2024/05/13
2810
数据冷热分离技术
来源:https://blog.csdn.net/zwgdft/article/details/106291463
Spark学习技巧
2021/03/05
4.1K0
数据冷热分离技术
分库 / 分表闲聊
大中型项目,一旦数据量比较大,就要进行对数据的拆分了,一般有两种,垂直拆分与水平拆分。
BUG弄潮儿
2021/07/22
9680
技术 | 数据仓库分层存储技术揭秘
据IDC发布的《数据时代2025》报告显示,全球每年产生的数据将从2018年的33ZB增长到2025年的175ZB,平均每天约产生491EB数据。随着数据量的不断增长,数据存储成本成为企业IT预算的重要组成部分。例如1PB数据存储一年,全部放在高性能存储介质和全部放在低成本存储介质两者成本差距在一个量级以上。由于关键业务需高性能访问,因此不能简单的把所有数据存放在低速设备,企业需根据数据的访问频度,使用不同种类的存储介质获得最小化成本和最大化效率。因此,把数据存储在不同层级,并能够自动在层级间迁移数据的分层存储技术成为企业海量数据存储的首选。
CloudBest
2021/04/20
1.4K0
技术 | 数据仓库分层存储技术揭秘
业务单表 读写缓慢 如何优化?
陈某的知识星球开通了,一个相互交流的技术圈子,陈某会在星球中定期分享干货,如果你也想和球友一起打卡学习进阶,戳链接加入
码猿技术专栏
2023/05/01
4000
业务单表 读写缓慢 如何优化?
数据架构:数据冷热分离实践思考
上一篇文章数据架构:概念与冷热分离中介绍了数据架构的概念和意义。并抛出了数据冷热分离的问题。事实上,这并不是新的概念,各公司在很早之前就已经开始了落地实践。微软云有冷热 blob 存储,阿里云有 ots,都是为了在云服务层面提供冷热存储的解决方案。尽管有这些工具,如果很好地实现冷热分离,仍然是值得仔细思考和玩味的。
程序员架构进阶
2021/05/08
7720
获腾讯研发大奖,国产开源数据库TBase的最佳实践
P腾讯云数据库国产数据库专题线上技术沙龙已圆满结束,本期带来李巍分享的《TBase主要应用场景与最佳实践》直播视频和文字回顾。 关注“腾讯云数据库”公众号,回复“0416李巍”,即可下载直播分享PPT。 1 前言 大家好,我是李巍,腾讯云TBase架构师。今天跟大家分享的主题是:TBase主要应用场景与最佳实践,整体内容分为四部分。 第一部分:关于TBase。前几期TBase直播分享中已有详细介绍,后面我会简单分享下。 第二部分:TBase的选型。今天将主要从应用的角度上来介绍TBase是如何选型的。
腾讯云数据库 TencentDB
2020/07/08
1.6K0
MySQL大表优化方案
阿里云RDS FOR MySQL(MySQL5.7版本)数据库业务表每月新增数据量超过千万,随着数据量持续增加,我们业务出现大表慢查询,在业务高峰期主业务表的慢查询需要几十秒严重影响业务
Criss@陈磊
2020/11/05
1.8K0
MySQL大表优化方案
微信后台基于时间序的海量数据冷热分级架构设计实践
微信的后台数据存储随着微信产品特性的演进,经历了数次的架构改造,才形成如今成熟的大规模分布式存储系统,有条不紊的管理着由数千台异构机型组成的机器集群,得以支撑每天千万亿级的访问、键值以及 PB 级的数据。
用户8964349
2021/09/09
7200
订单数据越来越多,如何优化数据库性能?
“增删改查”都是查找问题,因为你都得先找到数据才能对数据做操作。那存储系统性能问题,其实就是查找快慢问题。
JavaEdge
2023/01/08
1.4K0
订单数据越来越多,如何优化数据库性能?
学会数据库的分库分表,吊打大厂面试官!
数据分片:https://shardingsphere.apache.org/document/current/cn/features/sharding/
小灰
2023/09/29
3930
学会数据库的分库分表,吊打大厂面试官!
分库分表常见问题和解决方案
分库分表是非常常见针对单个数据表数据量过大的优化方式,它的核心思想是把一个大的数据表拆分成多个小的数据表,这个过程也叫(数据分片),它的本质其实有点类似于传统数据库中的分区表,比如mysql和oracle都支持分区表机制。
终有救赎
2023/11/23
8020
分库分表常见问题和解决方案
微信后台基于时间序的海量数据冷热分级架构设计实践
1、写在前面 微信的后台数据存储随着微信产品特性的演进,经历了数次的架构改造,才形成如今成熟的大规模分布式存储系统,有条不紊的管理着由数千台异构机型组成的机器集群,得以支撑每天千万亿级的访问、键值以及 PB 级的数据。 作为以手机为平台的移动社交应用,微信内大部分业务生成的数据是有共性可言的:数据键值带有时间戳信息,并且单用户数据随着时间在不断的生成。我们将这类数据称为基于时间序的数据。比如朋友圈中的发表,或者移动支付的账单流水等业务生成的数据都满足这样的特征。基于时间序的数据都天然带有冷热分明属性―
用户1263954
2018/06/22
1.5K0
推荐阅读
相关推荐
数据架构:概念与冷热分离
更多 >
交个朋友
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档