返回顶部
首页 > 资讯 > 数据库 >如何理解MySQL热冷数据分离设计
  • 617
分享到

如何理解MySQL热冷数据分离设计

2024-04-02 19:04:59 617人浏览 八月长安
摘要

这篇文章主要讲解了“如何理解Mysql热冷数据分离设计”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解mysql热冷数据分离设计”吧!数据库发展简介数

这篇文章主要讲解了“如何理解Mysql热冷数据分离设计”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解mysql热冷数据分离设计”吧!

数据库发展简介

数据量的增长其实一直是随着互联网的发展呈现爆发式增长的,因为各种各样的数据都在不断的被原样或者是经过少量的更改和增补后拷贝到互联网的各个角落。为了适应互联网数据的海量增长,在后端架构意义上而言,数据库的发展也大致经历了「单库单表 -> 主从读写分离 -> 分表分库 -> NoSQL -> Newsql」这样的过程。

一开始,我们把数据都堆在一个数据表里;后来为了提高性能、增加数据扩展的能力,采用了「主从读写分离」和「分表分库」的方式,前者只需要在主从实例之间做数据同步而不会对既有业务有较大的影响,后者则需要用一套切合业务逻辑的方式合理的制定分表分库的策略;再后来出现的 NoSQL,打破了传统关系型数据库固有的一些限制,它们有不同的类型,有的是为了解决高性能读写的需求,有的则是为了解决海量数据存储的需求,还有的需要数据结构本身具备可扩展性;

NoSQL 的不同类型在不同的侧重点解决了不同的问题,而如今出现的 NewSQL 则倾向于把数据库看作是一个黑匣子服务,你还是可以遵照传统的数据库协议的使用方式(比如传统 MySQL 的使用方式)来使用它,但数据存储服务本身既可以同时具备较高的读写性能又可以轻易的实现横向扩展。NewSQL 并不是一个全新的东西,我们可以把它看作是之前积累的数据库技术结合分布式技术的集大成解决方案,它使得使用数据服务的人几乎不需要再考虑性能和扩展问题,而尽量在数据服务内部实现高可用、高性能、可扩展。

「热数据」和「冷数据」

在简单了解了数据库发展历程之后,再介绍一下我们目前在数据存储上遇到的问题和一些业务背景。

作为气象大数据服务商,随着我们积累的数据量和数据种类越来越多,我们发现我们已经迫切需要一个在全局层面统一的数据路径规划和规范。很多时候,我们从数据源获取到的数据,既需要马上分发给线上用户,也需要被内部项目使用,如果只是简单的按需实现,那数据流转会非常混乱。基于这种考虑,我们引入了「热数据」(「在线数据」)和「冷数据」(「离线数据」)的概念:

  • 「热数据」指的是需要即时对用户进行分发的数据,即从数据源抓取之后经过数据清洗,需要即时存储到可以快速分发的存储介质(如 Redis)供 api 或直接面向用户的系统使用。「热数据」线需要重点保障服务质量和稳定性,为了保证数据的时效性,在数据处理上也是优先级高的数据。「热数据」可能是临时或短期存储的,后来的数据可能会覆盖已有的数据。

  • 「冷数据」指的是不需要即时分发给用户的数据,这些数据甚至可能永远都不会原样分发给用户的,但它们需要经过长期的积累,使我们可以从中得出基于此的更高 level 的分析。「冷数据」典型的使用场景是供内部数据评估系统做数据准确度的评估分析,同时也可以给算法团队建模使用。设立这个数据线的原则是不影响「热数据」的服务质量,尤其是时效性和稳定性,同时也满足一些非线上项目的数据使用需求。

如何理解MySQL热冷数据分离设计

这其实也不是什么新鲜的概念,很多做数据服务的公司都有类似的设计,我们只是根据我们的业务特点借用了这样的概念,不过它们的含义可能与你在其他地方看到的类似概念的含义有所不同。

结合我们具体的业务场景来说,「热数据」线其实已经一直在有效运转了,即我们从数据源获取到数据然后尽快存储到高性能存储介质中,再通过Http协议分发出去,这些数据都是即时更新的最新的数据。而其中有一些类型的数据,我们还需要在可视化项目中查看历史变化情况,并能进行简单的聚合和计算,这意味着数据需要积累一段时间,那我们也需要一些可以持久化存储的介质。

拿天气实况来举例,我们在采集完数据之后,随即就存储最新的一份数据到Redis,而出于数据积累的角度考虑,我们同时也把新数据写入MySQL。这是之前我们的做法,然而随着数据量的极速扩大,问题很快就会出在MySQL上。对于「亿」级别行数往上的MySQL单表,操作会变得越来越困难,而大范围的抽数或者插入数据的操作都可能使得整个MySQL无法提供服务,这对于线上业务而言是不可接受的。

离线数据中心的实现

在提出了「冷数据」的概念之后,我们意识到那些久远的历史数据其实需要存放到「冷数据」的数据中心池子里,而线上MySQL只需要保留最近一段时间的数据即可。另外,为了不改变现有项目使用数据的方式,降低数据库使用者的门槛,不管是对于线上数据库还是「离线数据」的数据中心,我们都需要兼容MySQL单表的使用协议。

很快我们就开始考虑NewSQL的方案,TiDB很自然地进入了我们的视野,这是一个既可以兼容现有数据使用方式,又可以实现数据横向扩展的完美方案,但无奈搭建一个最小版本的TiDB 数据集群的成本,相比于目前我们把它作为一个「离线数据」存储中心的角色而言,还是有一些偏高,而我们的存量服务也基本都是基于阿里云的,所以最终我们选择了阿里云推出不久的云数据库PolarDB。其间我们还研究了很多其他数据库方案,比如DRDS、OceanBase、Google Cloud Spanner、Amazon Aurora等。

数据同步和数据过期

有了离线数据存储中心之后,我们开始考虑如何把「热数据」转化为「冷数据」,同时也使得线上数据库可以自动过期超出时间窗口的历史数据。另外,由于内部可视化项目也希望看到实时的实况数据,所以离线数据最好也能很快获得最新的实况数据。

既然是两个 MySQL(集群)之间的实时数据转移,很自然的就想到了我们可以做类似主从节点之间通过 binlog 的数据同步机制,这个同步可以做到秒级延迟,在实时性上是完全可以接受的。不过这不能是简单的数据同步,因为离线数据是不能同步线上数据的过期操作的。更具体的,我们可以概括成:MySQL 从节点同步主节点所有数据增添和数据修改的操作,而对于数据的删除操作不做同步。

在调研之后,我们发现TiDB提供的同步工具Syncer可以实现这一点,我们只需要在配置注明过滤掉DELETE的DML语句即可,示例如下:

[[skip-dmls]] db-name = "weather_data" tbl-name = "weather_now_history" type = "delete"

而数据过期方案则可以直接借助MySQL本身的EVENT和PROCEDURE机制完成。首先我们可以创建一个删除数据的PROCEDURE:

CREATE DEFINER=`weather`@`%` PROCEDURE `weather_data`.`del_old_data`(IN `date_inter` int) BEGIN   delete from weather_data.weather_now_history where datetime < date_sub(curdate(), interval date_inter day); END

这个PROCEDURE功能是删除weather_now_history表中date_inter天之前的数据。然后我们再创建一个EVENT:

CREATE EVENT del_old_data ON SCHEDULE EVERY 1 DAY STARTS '2018-12-25 10:08:35.000' ON COMPLETioN PRESERVE ENABLE DO call del_old_data(30)

这个EVENT则会每天调用一次名为del_old_data的PROCEDURE,并同时把date_inter 赋值为30。这意味数据库每天会删一次数据,使得线上数据库一直只保留最近30天的数据,而全量的数据是在数据写入时就实时同步到了离线数据中心,可谓完美。

持续改进

上述的具体业务场景更多的还是case by case的解决了「热数据」和「冷数据」的分离和转化问题,这意味着方案并不具有普适性,以后我们遇到其他的数据库或者不同的数据使用场景可能就不再适用。

另外,很多时候,「热数据」和「冷数据」的划分并不是那么明晰的,对于「冷数据」的需求有可能转变为「热数据」需求,我们需要可以灵活切换的机制,做到数据源只抓取一次(「热数据」和「冷数据」不要分别抓取),而抓取到的数据可以任意自由的流淌到「热数据」或「冷数据」线使用,这意味着我们在数据抓取和数据存储之间应该再做一层隔离。

要实现数据抓取和数据存储之间的隔离,我们可以采用「发布 / 订阅模式」:简单说,数据抓取服务在获取数据之后将数据发布到消息队列,后面的存储服务任意订阅这个消息队列再做存储,这样数据源只需要抓取一次,我们可以把它作为热数据使用,也可以作为冷数据使用,甚至可以即作为热数据又作为冷数据使用,切换起来也十分简单。这是后续系统架构可以改进的一个地方。

另外,离线数据中心仅仅使用 PolarDB 对于我们可能产生的数据量级而言也是远远不够的,我们还需要更低成本的数据存储方案来存储时间更久远、平时几乎不大会访问的一些需要被「归档」的数据,这个时候,一些基于列存储的 NoSQL 数据库可能可以派上用场。

数据治理需要一个长期持续的过程,我们还在结合自身的业务场景不断的摸索当中。

感谢各位的阅读,以上就是“如何理解MySQL热冷数据分离设计”的内容了,经过本文的学习后,相信大家对如何理解MySQL热冷数据分离设计这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: 如何理解MySQL热冷数据分离设计

本文链接: https://lsjlt.com/news/61910.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解MySQL热冷数据分离设计
    这篇文章主要讲解了“如何理解MySQL热冷数据分离设计”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解MySQL热冷数据分离设计”吧!数据库发展简介数...
    99+
    2024-04-02
  • Shopee x JuiceFS:ClickHouse 冷热数据分离存储架构与实践
    本文来自 shopee 技术团队 摘要 Shopee ClickHouse 是一款基于开源数据库 ClickHouse 做二次开发、架构演进的高可用分布式分析型数据库。本文将主要介绍 Shopee ClickHouse 的冷热分离存储...
    99+
    2020-11-26
    Shopee x JuiceFS:ClickHouse 冷热数据分离存储架构与实践
  • PHP 开发中 Elasticsearch 实现冷热数据分离与存储优化
    引言:在大数据时代,数据量的增长速度越来越快。对于开发者来说,如何优化数据的存储和访问效率成为一个重要的问题。在PHP开发中,Elasticsearch是一个非常强大的开源搜索和分析引擎,可以帮助我们实现数据的冷热分离和存储优化。本文将介绍...
    99+
    2023-10-21
    PHP elasticsearch 数据优化
  • mysql如何分离数据库
    mysql分离数据库的步骤:借助sql server工具来进行分离。先下载安装sql server工具。然后登录连接数据库。选择需要分离的【数据库】右键展开。选中数据库【右键】→【任务】→【分离】即可。...
    99+
    2024-04-02
  • 如何理解数据库集群读写分离
    本篇内容介绍了“如何理解数据库集群读写分离”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!“灵魂拷问:解决数...
    99+
    2024-04-02
  • 如何理解数据库读写分离架构?
    如何理解数据库读写分离架构?,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。RD:数据量太大,数据库扛不住了,帮忙申请一个从库,读写分离。D...
    99+
    2024-04-02
  • MySQL 如何设计统计数据表
    目录是否需要实时更新物化视图工具(Flexviews)计数表总结缓存型数据表通常在统计数据时会经常用到,因此也会叫统计性数据。举个例子来说,对于员工、部门数据表而言,我们可能会需要查询一个部门下有多少员工。这时候有三...
    99+
    2022-05-24
    MySQL 统计数据表 MySQL 设计数据表
  • 如何分离sql数据库
    这篇文章将为大家详细讲解有关如何分离sql数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 sql数据库分离:打开sql数据库控制台登录,登录...
    99+
    2024-04-02
  • sqlserver如何分离数据库
    在SQL Server中,可以使用数据库备份和还原的方法来分离数据库。以下是分离数据库的步骤: 打开SQL Server Man...
    99+
    2024-04-17
    sqlserver
  • 如何使用Webpack分离数据
    这篇文章主要为大家展示了“如何使用Webpack分离数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Webpack分离数据”这篇文章吧。制定向用户提供...
    99+
    2024-04-02
  • MySQL数据库设计时如何优化
    小编给大家分享一下MySQL数据库设计时如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  1、命名的技巧与规范  无论什...
    99+
    2024-04-02
  • Hadoop+Python+Django+Mysql热门旅游景点数据分析系统的设计与实现(包含设计报告)
    系统阐述的是使用热门旅游景点数据分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭...
    99+
    2023-09-10
    django mysql python
  • 如何分析SQL Server 数据库的设计
    如何分析SQL Server 数据库的设计,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、数据库设计的必要性在实际的软件项目中,如果系统中需要存储的数据量...
    99+
    2023-06-26
  • 如何利用mycat实现mysql数据库读写分离
    这篇文章主要介绍了如何利用mycat实现mysql数据库读写分离,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是MyCAT一个彻底开源的...
    99+
    2024-04-02
  • Redis如何实现数据库读写分离详解
    前言 Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广。Redis是一个key-...
    99+
    2024-04-02
  • mysql如何分别按年/月/日/周分组统计数据详解
    目录1.统计2.占位符补充:mysql如何指定日期按周分组,并按次数分类统计总结1.统计 我们可以使用date_format()函数格式化时间,然后进行分组操作 例如有一个学生表,结构如下 idnameageheight...
    99+
    2022-12-15
    mysql分组统计数据 mysql数据查询 mysql统计数据
  • MySQL如何统计每个分组的数据条数
    在MySQL中,可以使用COUNT函数来统计每个分组的数据条数。下面是一个示例查询: SELECT column_name1...
    99+
    2024-04-09
    MySQL
  • Kotlin 协程异步热数据流的设计与使用讲解
    目录一.异步冷数据流二.异步热数据流1.异步热数据流的设计1)SharedFlow接口2)MutableSharedFlow接口2.异步热数据流的使用1)MutableSharedF...
    99+
    2024-04-02
  • MySQL总结(九)数据库设计-详解
    数据库设计 1.数据规范化 1.1 什么是范式: 好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。 1.2 三大范式: 前关系数据库...
    99+
    2017-05-22
    MySQL总结(九)数据库设计-详解
  • SpringBoot详解MySQL如何实现读写分离
    目录前言一、主从数据源的配置二、数据源路由的配置三、数据源上下文环境四、切换注解和Aop配置五、用法以及测试六、总结前言 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作