当前位置: 首页 > news >正文

冷热数据分离

优质博文:IT-BLOG-CN

一、背景

随着机票业务的快速发展,订单量持续增长对业务性能带来影响,需要进行冷热数据分离。目前机票订单模块主要使用Mysql(InnoDB)作为数据库存储,历史订单信息状态修改频率低并占用大量数据库存储空间,期望历史数据与生产最新的数据进行分离,当前数据库保留最近一个月的数据作为热库,历史交易存在另一个库作为冷库。减少因在线存储空间不足扩容导致停服不可用的时长。

如何判断一个数据是冷数据还是热数据?
需要根据自己业务系统来区分了,一般而言是根据主表中的一个或者多个字段进行标识区分,比如订单的时间,这个是时间维度,可以将3个月之前的数据定义为冷数据,最近3个月的数据定义为热数据。当然也可以是状态维度,比如订单的状态,已完结的订单定义为冷数据,未完结的订单定义为热数据。同样的也可以将时间维度和状态维度组合起来,比如下单时间大于3个月且订单状态为已完结的定义为冷数据,反则为热数据。

我的冷热数据怎么拆分的:已过起飞时间 + 订单状态=“完成”的数据都是冷数据,其余为热数据。

二、方案选型

业务代码修改

这种方案是在业务代码层面判断是否进行冷热数据分离,对代码的侵入性比较高,在数据修改时触发冷热分离。因机票QPS很高,如果更新状态时,需要进行进行冷热数据分离,删除热库中的数据,并将数据写入冷库中,需要使用到分布式事务。会增加系统和数据库的压力。不适用

监听binlog日志

需要监听binlog日志的方式进行触发,当订单状态修改了,则触发冷热分离。比较适合实时性要求高的系统,这里虽然不会影响业务的响应时间。但是冷热数据分离的操作实时操作的,会给数据库造成压力。不适用,但是有用

怎么读取binlog中的内容,我们通过公司内部开发的DRC服务,这里简单看下重要流程:
【1】在pom.xml中添加MySQL Binlog Connector Java的依赖

<dependency><groupId>com.github.shyiko</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.25.0</version>
</dependency>

【2】连接MySQL并读取binlog,注册了一个事件监听器来处理WriteRowsEventData事件。还可以根据需要处理其他类型的事件,例如UpdateRowsEventDataDeleteRowsEventData分场景进行业务处理。

import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.*;public class BinlogReader {public static void main(String[] args) throws Exception {String hostname = "localhost";int port = 3306;String username = "root";String password = "password";BinaryLogClient client = new BinaryLogClient(hostname, port, username, password);client.registerEventListener(event -> {EventData data = event.getData();if (data instanceof WriteRowsEventData) {WriteRowsEventData writeRowsEventData = (WriteRowsEventData) data;System.out.println("Write event: " + writeRowsEventData);// 处理写入事件handleWriteEvent(writeRowsEventData);} else if (data instanceof UpdateRowsEventData) {UpdateRowsEventData updateRowsEventData = (UpdateRowsEventData) data;System.out.println("Update event: " + updateRowsEventData);// 处理更新事件handleUpdateEvent(updateRowsEventData);} else if (data instanceof DeleteRowsEventData) {DeleteRowsEventData deleteRowsEventData = (DeleteRowsEventData) data;System.out.println("Delete event: " + deleteRowsEventData);// 处理删除事件handleDeleteEvent(deleteRowsEventData);}});client.connect();}private static void handleWriteEvent(WriteRowsEventData eventData) {// 在这里处理写入事件的业务逻辑// 例如:将数据写入另一个数据库或消息队列}private static void handleUpdateEvent(UpdateRowsEventData eventData) {// 在这里处理更新事件的业务逻辑// 例如:更新缓存或同步到另一个系统}private static void handleDeleteEvent(DeleteRowsEventData eventData) {// 在这里处理删除事件的业务逻辑// 例如:从缓存中移除数据或同步到另一个系统}
}

WriteRowsEventData类通常包含以下属性:
【1】tableId:表示发生写入操作的表的ID,它通常由MySQL内部生成,用于在二进制日志中快速查找表的元数据。
【2】includedColumns:一个位图,表示哪些列包含在写入操作中。位图中的每一位对应一个列,值为1表示该列包含在写入操作中,值为0表示该列不包含在写入操作中。
【3】rows:一个列表,包含所有被写入的行的数据。每一行的数据通常以数组的形式存储,数组中的每个元素对应表中的一个列值。这些数据通常是经过编码的,需要根据表的元数据进行解码。

举个例子,如果你在MySQL中有一个表users,包含三个列idnameemail,并且你插入了一行数据(1, 'Alice', 'alice@example.com'),那么WriteRowsEventData可能会包含如下信息:
【1】tableId:假设为1234
【2】includedColumns:位图表示三个列都包含在写入操作中。
【3】rows:包含一个数组[1, 'Alice', 'alice@example.com']

定时任务

该方案可以根据“起飞时间”进行区分,同时可以避免业务高峰期,并且与业务代码进行解耦。适用,结合binlog,每次获取1000条数据分批处理

我们的方案

监听binlog日志,当订单号状态发生变化,并且已过起飞时间时,将订单号存放至MongDB中,夜间2点批量读取MongoDB中的订单号执行数据冷热数据分离业务逻辑。

我们这里时存储在MongDB后期消费,部分系统是通过Kafka进行消息实时消费的,定时任务校验数据的一致性,对遗漏的数据进行校验。批量查询也是根据场景,可能需要对冷热数据库一并查询,需要封装统一的接口方法,当冷热数据存在冲突时,以热库的数据为准。

特殊场景处理逻辑:
【1】冷库数据理论上不存在更新操作,但是部分业务场景特殊,需要对冷库中的数据先进性Delete操作再进行Insert操作,而不是Update操作。这里场景接入的是Kafka
【2】当冷热库存在相同的数据时,以热库数据为准。冷库的数据来源只有热库数据同步到冷库。批量查询如果对顺序由要求时,业务代码查询到数据后,需要根据需求在内存中进行排序。

相关文章:

冷热数据分离

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着机票业务的快速发展&#xff0c;订单量持续增长对业务性能带来影响&#xff0c;需要进行冷热数据分离。目前机票订单模块主要使用Mysql(InnoDB)作为数据库存储&#xff0c;历史订单信息状态修改频率低并占用大量数据库存储空间&…...

朝花夕拾:多模态图文预训练的前世今生

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;时间来到2024年&#xff0c;多模态大模型炙手可热。在上一个时代的【多模态图文预训练】宛若时代的遗珠&#xff0c;本文的时间线从2019年到2022年&#xff0c;从BERT横空出世讲到ViT大杀四方&#xff0c;…...

亳州自闭症寄宿制学校,关注孩子的学习和生活

在特殊教育领域&#xff0c;自闭症儿童的教育与成长一直是社会各界关注的焦点。近年来&#xff0c;随着对自闭症认识的加深&#xff0c;越来越多的寄宿制学校应运而生&#xff0c;致力于为这些特殊的孩子提供全面、个性化的教育服务。在安徽亳州&#xff0c;这样的学校正努力为…...

Root me CTF all the day靶场ssrf+redis漏洞

Rootme CTF all the day靶场ssrfredis漏洞 一、环境介绍1、漏洞地址2、漏洞介绍 二、 搭建环境三、测试过程3.1 读取系统文件3.2 探测开放的服务器端口(dict协议)3.3 redis未授权访问3.3.1 利用redis来写ssh密钥&#xff08;gopher协议写入&#xff09;3.3.2 利用redis写定时任…...

C#中Json序列化的进阶用法

本文所有json序列化&#xff0c;都使用的Newtonsoft.Json包 1 JsonIgnore 在 Newtonsoft.Json 中&#xff0c;如果你不想将某些属性转换为 JSON 字符串&#xff0c;可以使用多种方法来实现。以下是几种常见的方法&#xff1a; 1.1 使用 [JsonIgnore] 特性 [JsonIgnore] 特性…...

IO相关的常用工具包

常用工具包Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包。 作用:提高IO流的开发效率。 使用步骤: 1、在项目中创建一个文件夹&#xff1a;lib 2、将jar包复制粘贴到lib文件夹 3、右键点击jar包&#xff0c;选择Add as Library--->点击OK …...

Spring Boot集成RBloomFilter快速入门Demo

在大数据处理和缓存优化的场景中&#xff0c;布隆过滤器&#xff08;Bloom Filter&#xff09;因其高效的空间利用和快速的查询性能而被广泛应用。RBloomFilter是布隆过滤器的一种实现&#xff0c;通常用于判断一个元素是否存在于一个集合中&#xff0c;尽管它存在一定的误判率…...

布局性能优化

布局使用不当回导致卡顿、掉帧、响应慢等问题 一、布局流程 1、应用侧会根据前端UI描述创建后端的页面节点树&#xff0c;其中包含了处理UI组件属性更新、布局测算、事件处理等逻辑 2、页面节点树创建完成后&#xff0c;UI线程会对每个元素进行测算&#xff08;Measure&#…...

智云人才推荐与管理系统

1.产品介绍 产品名称&#xff1a;智云人才推荐与管理系统 主要功能&#xff1a; 智能人才匹配引擎 功能描述&#xff1a;利用先进的人工智能算法&#xff0c;根据企业岗位需求&#xff08;如技能要求、工作经验、教育背景等&#xff09;自动从海量人才库中筛选并推荐最合适的…...

git在远程分支上新建分支

需求&#xff1a; 在远程分支release/test的基础上创建一个新的分支test_20241009 确保本地仓库的信息是最新的 git fetch origin执行了 git fetch&#xff0c;本地仓库已经包含了 origin/release/test 的最新信息。当基于这个远程跟踪分支创建新分支时&#xff0c;会得到一个包…...

用Python实现的高校教师资格考试题库程序

最近朋友参加了高校教师资格考试&#xff0c;在考试前需要刷题来保证通过。但是教资网站上的题库只有接近考试才更新&#xff0c;并且官方题库的刷题效率还是有点低。 &#x1f446;官方题库的样子 于是想到了是否能够将官方题库内容记录下来&#xff0c;然后自己创建一个高效…...

OpenVINO基本操作流程

环境配置&#xff1a; conda env list:可以查看有哪些环境 conda activate intel:启动某个环境 pip list&#xff1a;可以查看此环境下都下载了哪些软件包 from openvino.inference_engine import IEcore#从OpenVINO推理引擎中导入IECore类 import numpy as np import cv2 1&…...

Spring MVC 注解详解:@RequestBody,@RequestParam 和 @PathVariable

Spring MVC 提供了一系列注解&#xff0c;用于简化请求数据的获取和处理。了解并掌握这些注解的使用&#xff0c;对于开发RESTful API和处理HTTP请求至关重要。本文将详细介绍 RequestBody&#xff0c;RequestParam 和 PathVariable 注解&#xff0c;并附带具体的代码示例&…...

MySQL 8 中的 sql_mode

MySQL 8 中的 sql_mode 设置&#xff1a;提升数据库安全性与性能 在现代数据库管理中&#xff0c;MySQL 是一个广泛使用的开源关系型数据库。随着数据的增长和复杂性增加&#xff0c;良好的数据库配置显得尤为重要。sql_mode 是 MySQL 提供的一个强大功能&#xff0c;它可以帮…...

13种pod的状态

13种pod的状态 生命周期 Pending:Pod被创建后进入调度阶段,k8s调度器依据pod声明的资源请求量和调度规则,为pod挑选一个适合运行的节点。当集群节点不满足pod调度需求时,pod将会处于pending状态。Running:Pod被调度到节点上,k8s将pod调度到节点上后,进入running状态。S…...

2025考研今天开始预报名!攻略请查收

2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程&#xff1f;需要准备哪些信息&#xff1f; 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段&#xff1a; 网上预报名时间为10月9日至10月12日&#xff08;每日9&#xff1…...

JS中的Promise经典题目解析

这段代码很有代表性&#xff0c;涵盖了多个 JavaScript 知识点&#xff0c;特别是不同异步操作的执行优先级。 async function async1() {console.log(async1 start);await async2();console.log(async1 end); }async function async2() {console.log(async2); }console.log(s…...

【机器学习】金融预测 —— 风险管理与股市预测

我的主页&#xff1a;2的n次方_ 在金融领域&#xff0c;机器学习&#xff08;ML&#xff09;已经成为了不可或缺的工具。金融预测&#xff0c;尤其是风险管理和股市预测&#xff0c;涉及海量数据和复杂模式的分析&#xff0c;而这些正是机器学习擅长处理的领域。通过分析历…...

Bootstrap 5 分页组件使用教程

Bootstrap 5 分页组件使用教程 引言 Bootstrap 5 是一个流行的前端框架,它提供了一套丰富的组件和工具,用于快速开发响应式和移动优先的网页。分页组件是 Bootstrap 5 中用于分割长列表或数据集的重要部分,它可以帮助用户更容易地浏览内容。本文将详细介绍如何在您的项目中…...

Linux 安装 NVM 并配置 npm 加速,开发 node 项目不再愁

由于需要在 linux 机器上完成 node 项目的构建&#xff0c;需要安装 nodejs, 想着不同项目需要使用不同的版本&#xff0c;索性安装一下 nvm 吧&#xff0c;因为之前在 windows 上已经安装过 nvm-windows, 应该很容易上手&#xff0c;我尝试了官网提供的几种方式&#xff0c;最…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...