数据库层持久化

news2024/11/17 7:30:40

数据持久化层
冷热分离

  • 冷热分离:将常用的“热”数据和不常使用的“冷”数据分开存储

  • 冷热分离就是在处理数据时将数据库分成冷库和热库,冷库存放那些走到终态、不常使用的数据,热库存放还需要修改、经常使用的数据

  • 业务需求出现了以下情况,就可以考虑使用冷热分离的解决方案。

  • 1)数据走到终态后只有读没有写的需求,比如订单完结状态。

  • 2)用户能接受新旧数据分开查询,比如有些电商网站默认只让查询3个月内的订单,如果要查询3个月前的订单,还需要访问其他的页面

  • 冷热分离的实际操作过程中,需要考虑以下问题。

  • 1)如何判断一个数据是冷数据还是热数据?
    主要采用主表里一个字段或多个字段的组合作为区分标识
    如果一个数据被标识为冷数据,业务代码不会再对它进行写操作。
    不会同时存在读取冷、热数据的需求。

  • 2)如何触发冷热数据分离?
    1)直接修改业务代码,使得每次修改数据时触发冷热分离
    建议在业务代码比较简单,并且不按照时间区分冷热数据时使用
    2)通过监听数据库变更日志binlog的方式来触发。
    具体方法就是另外创建一个服务,这个服务专门用来监控数据库的binlog,一旦发现ticket表有变动,
    就将变动的工单数据发送到一个队列,这个队列的订阅者将会取出变动的工单,触发冷热分离逻辑
    建议在业务代码比较复杂,不能随意变更,并且不按时间区分冷热数据时使用
    3)通过定时扫描数据库的方式来触发。
    这个方式就是通过quartz配置一个本地定时任务,或者通过类似于xxl-job的分布式调度平台配置一个定时任务。
    这个定时任务每隔一段时间就扫描一次热数据库里面的工单表,找出符合冷数据标准的工单数据,进行冷热分离

    建议在按照时间区分冷热数据时使用
     ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4677e00cb80e4395abb5d1b97280fc14.png)
    
  • 3)如何实现冷热数据分离?
    分离冷热数据的基本逻辑:
    1)判断数据是冷是热。
    2)将要分离的数据插入冷数据库中。
    3)从热数据库中删除分离的数据。
    注意数据的“最终一致性”,保持每一步操作的幂等性,操作的原子性,锁,多线程等。

  • 4)如何使用冷热数据?

  • 在判断是冷数据还是热数据时,必须确保用户没有同时读取冷热数据的需求
    
  • 5)历史数据如何迁移?
    单独处理历史数据。

  • 数据库的分区:并不是生成新的数据表,而是将表的数据均衡分配到不同的硬盘、系统或不同的服务器存储介质中,实际上还是一张表

  • 数据库分区有以下优点。

  • 1)比起单个文件系统或硬盘,分区可以存储更多的数据。

  • 2)在清理数据时,可以直接删除废弃数据所在的分区。同样,有新数据时,可以增加更多的分区来存储新数据。

  • 3)可以大幅度地优化特定的查询,让这些查询语句只去扫描特定分区的数据。比如,原来有2000万的数据,设计10个分区,每个分区存200万的数据,那么可以优化查询语句,让它只去查询其中两个分区,即只需要扫描400万的数据。

查询分离

  • 即每次写数据时保存一份数据到其他的存储系统里,用户查询数据时直接从中获取数据
    在这里插入图片描述
    考虑使用查询分离场景:
    1)数据量大:比如单个表的行数有上千万,当然,如果几百万就出现查询慢的问题,也可以考虑使用。
    2)查询数据的响应效率很低:因为表数据量大,或者关联查询太过复杂,导致查询很慢的情况。
    3)所有写数据请求的响应效率尚可:虽然查询慢,但是写操作的响应速度还可以接受的情况。
    4)所有数据任何时候都可能被修改和查询:这一点是针对冷热分离的,因为如果有些数据走入终态就不再用到,就可以归档到冷数据库了,不一定要用查询分离这个方案

  • 查询分离的实现思路:
    1)如何触发查询分离?
    2)如何实现查询分离?
    3)查询数据如何存储?
    4)查询数据如何使用?
    5)历史数据如何迁移?
    在这里插入图片描述

-如何触发查询分离?

  • 查询分离的触发逻辑分为3种
    1)修改业务代码,在写入常规数据后同步更新查询数据
    2)修改业务代码,在写入常规数据后,异步更新查询数据
    3)监控数据库日志,如有数据变更,则更新查询数据
    在这里插入图片描述
    在这里插入图片描述

  • 如何实现查询分离?
    考虑使用MQ(Message Queue,消息队列):MQ的具体操作思路为,每次程序处理主数据写操作请求时,
    都会发一个通知给MQ,MQ收到通知后唤醒一个线程来更新查询数据

  • 3)查询数据如何存储?
    Elasticsearch实现大数据量的搜索查询,当然还可能用到MongoDB、HBase这些技术

  • 4 )查询数据如何使用
    因Elasticsearch自带API,所以使用查询数据时,在查询业务代码中直接调用Elasticsearch的API即可。
    数据查询更新完前,查询数据不一致怎么办?
    1)在查询数据更新到最新前,不允许用户查询。
    2)给用户提示:“您目前查询到的数据可能是2秒前的数据,如果发现数据不准确,可以尝试刷新一下。”这种提示用户一般都能接受。

    1. 历史数据迁移

MQ+Elasticsearch的整体方案
1)使用异步方式触发查询数据的同步。当工单修改后,会异步启动一个线程来同步工单数据到查询数据库。
2)通过MQ来实现异步的效果。MQ还做了两件事:①服务的解耦,将工单主业务系统和查询系统的服务解耦;②削峰,当修改工单的并发请求太多时,通过MQ控制同步查询数据库的线程数,防止查询数据库的同步请求太大。
3)将工单的查询数据存储在Elasticsearch中。因为Elasticsearch是一个分布式索引系统,天然就是用来做大数据的复杂查询的。
4)因为查询数据同步到Elasticsearch会有一定的延时,所以用户可能会查询到旧的工单数据,所以要给用户一些提示。
5)关于历史数据的迁移,因为是用字段NeedUpdateQueryData来标识工单是否需要同步,所以只要把所有历史数据的标识改成true,系统就会自动批量将历史数据同步到Elasticsearch

分表分库

  • 分表是将一份大的表数据进行拆分后存放至多个结构一样的拆分表中;

  • 分库就是将一个大的数据库拆分成类似于多个结构的小数据库

  • 如果使用分表分库,有3个通用技术需求需要实现。
    1)SQL组合:因为关联的表名是动态的,所以需要根据逻辑组装动态的SQL。比如,要根据一个订单的ID获取订单的相关数据,Select语句应该针对(From)哪一张表?
    2)数据库路由:因为数据库名也是动态的,所以需要通过不同的逻辑使用不同的数据库。比如,如果要根据订单ID获取数据,怎么知道要连接哪一个数据库?
    3)执行结果合并:有些需求需要通过多个分库执行后再合并归集起来。假设需要查询的数据分布在多个数据库的多个表中(比如在order1里面的t_order_1,order2里面的t_order_9中),那么需要将针对这些表的查询结果合并成一个数据集

  • 1)Proxy模式:
    这种设计模式将SQL组合、数据库路由、执行结果合并等功能全部放在了一个代理服务中,
    而与分表分库相关的处理逻辑全部放在了其他服务中,
    其优点是对业务代码无侵入,业务只需要关注自身业务逻辑即可
    在这里插入图片描述

  • 2)Client模式:
    这种设计模式将分表分库相关逻辑放在客户端,
    一般客户端的应用会引用一个jar,然后在jar中处理SQL组合、数据库路由、执行结果合并等相关功能。

    在这里插入图片描述

  • 分表分库方案5个要点
    1)使用什么字段作为分片主键?
    2)分片的策略是什么?
    分片策略分为根据范围分片、根据Hash值分片、根据Hash值及范围混合分片
    3)业务代码如何修改?
    4)历史数据如何迁移?
    5)未来的扩容方案是什么?

  • 数据迁移方案的基本思路为:
    旧架构继续运行,存量数据直接迁移,增量数据监听binlog,然后通过canal通知迁移程序迁移数据,等到新的数据库拥有全量数据且校验通过后再逐步切换流量到新架构。

  • 数据迁移解决方案的详细步骤如下

    1)上线canal,通过canal触发增量数据的迁移。
    2)迁移数据脚本测试通过后,将老数据迁移到新的分表分库中。
    3)注意迁移增量数据与迁移老数据的时间差,确保全部数据都被迁移过去,无任何遗漏。
    4)此时新的分表分库中已经拥有全量数据了,可以运行数据验证程序,确保所有数据都存放在新数据库中。

  • 扩容方案主要依赖以下两点。

    1)分片策略是否可以让新表数据的迁移源只有一个旧表,而不是多个旧表?这就是前面建议使用2n分表的原因——以后每次扩容都能扩为2倍,都是把原来一张表的数据拆分到两张表中。
    2)数据迁移。需要把旧分片的数据迁移到新的分片上,这个方案与上面提及的历史数据迁移一样,此处不再赘述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计Python+LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能

基于TensorFlow-LSTM的股票预测系统开题报告 一、研究背景与意义 随着信息技术的飞速发展,股票市场作为现代经济活动的重要组成部分,其价格波动受到广泛关注。投资者们迫切希望通过科学的方法预测股票价格,以优化投资决策,实现利…

华为数通——链路聚合

链路聚合:又称为端口汇聚,是指两台交换机之间在物理上将两个或多个端口连接起来,将多条链路聚合成一条逻辑链路,从而增大链路带宽,多条物理链路之间能够相互冗余。 作用:增加链路带宽,同时提供…

模型泛化性测试

文章目录 准备工作场景描述训练数据集获取与训练 测试结论测试方案外机进行平移外机进行旋转外机即平移又旋转该螺纹孔位置 准备工作 场景描述 场景搭建如下如所示: 在该场景中,将机器人安置在桌子左上角处(以面对显示器的视野&#xff09…

【Windows】“ONLYOFFICE 桌面编辑器 8.1 新特性大揭秘:全新 PDF 编辑器、幻灯片版式和更多更新“

【Windows】“ONLYOFFICE 桌面编辑器 8.1 新特性大揭秘:全新 PDF 编辑器、幻灯片版式和更多更新” 大家好 我是寸铁👊 【Windows】“ONLYOFFICE 桌面编辑器 8.1 新特性大揭秘:全新 PDF 编辑器、幻灯片版式和更多更新”✨ 喜欢的小伙伴可以点点…

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服…

通过言语和非言语检索线索描绘睡眠中的记忆再激活茗创科技茗创科技

摘要 睡眠通过重新激活新形成的记忆痕迹来巩固记忆。研究睡眠中记忆再激活的一种方法是让睡眠中的大脑再次暴露于听觉检索线索(定向记忆再激活范式)。然而,记忆线索的声学特性在多大程度上影响定向记忆再激活的有效性,目前还没有得到充分探索。本研究通…

2024年G2电站锅炉司炉证模拟考试题库及G2电站锅炉司炉理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年G2电站锅炉司炉证模拟考试题库及G2电站锅炉司炉理论考试试题是由安全生产模拟考试一点通提供,G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材,G2电站锅炉司炉大纲整理而成…

Linux_应用篇(22) 音频应用编程

ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能!本章我们来学习 Linux 下的音频应用编程, 音频应用编程相比于前面几个章节所介绍的内容、 其难度有所上升, 但是笔者仅向大家介绍…

基于C# .NET 的数字图像处理系统开发

嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加3512724768。 《面向对象程序设计》-基于C# .NET 的数字图像处理系统开发 (一)实习的目的 根据《面向对象程序设计》理论课授课内容,是使学生…

ps基础入门

1.基础 1.1新建文件 1.2创建指定形状 1.4移动工具 1.41移动画布中的任意元素 1.42移动画布 1.43修改画布大小 1.44修改图像大小 1.5框选工具 1.6矩形工具 1.7图层 1.71图层颜色修改 1.72…

【UE5.1 角色练习】12-坐骑——Part2(让角色骑上坐骑)

目录 前言 效果 步骤 一、坐骑的父类 二、将角色附加到坐骑 三、添加坐姿 四、骑上坐骑 五、从坐骑上下来 前言 在上一篇(【UE5.1 角色练习】11-坐骑——Part1(控制大象移动))基础上继续实现角色骑上坐骑的功能。 效果 …

计算机网络期末复习——简明扼要介绍考点及相关知识

期末复习的方法论:一般来说,期末复习都是“理论”结合“实践”。 理论,在于要对期末考点有基本的把握。可以询问老师或者师兄,总之要知道考试的重点在哪里。对照教材,勾画考试重点,删去不重要的琐碎知识点。…

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写 很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。 蓝山山 年龄:24 号码:12345678910 地址:上海市 邮箱:jianliji…

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语…

2024年【低压电工】考试题库及低压电工考试报名

题库来源:安全生产模拟考试一点通公众号小程序 低压电工考试题库是安全生产模拟考试一点通总题库中生成的一套低压电工考试报名,安全生产模拟考试一点通上低压电工作业手机同步练习。2024年【低压电工】考试题库及低压电工考试报名 1、【单选题】()仪表…

C++之STL(六七)

1、变动性算法 #include <vector> #include <iostream> #include <list> #include <algorithm>using namespace std;void print_element(int n) {cout << n << ; }void add_3(int& n) {n n 3; }int fun(int n) {return 2 * n; }boo…

麻了!一觉醒来,代码全挂了。。

作为⼀名程序员&#xff0c;相信大家平时都有代码托管的需求。 相信有不少同学或者团队都习惯把自己的代码托管到GitHub平台上。 但是GitHub大家知道&#xff0c;经常在访问速度这方面并不是很快&#xff0c;有时候因为网络问题甚至根本连网站都打不开了&#xff0c;所以导致…

python创建websocket服务器,实现循环发送消息

WebSocket协议是在2008年由Web应用程序设计师和开发人员创建的&#xff0c;目的是为了在Web浏览器和服务器之间提供更高效、更低延迟的双向通信。它允许客户端和服务器在任何时候发送消息&#xff0c;无需重新建立TCP连接。WebSocket可以在Web浏览器和服务器之间传输文本和二进…

Linux命令----wc,uniq,sort的用法

1.wc的用法&#xff1a;wc 命令用于计算文件中的行数、单词数和字节数。 常用选项 -l&#xff1a;只显示行数-w&#xff1a;只显示单词数-c&#xff1a;只显示字节数-m&#xff1a;只显示字符数&#xff08;与 -c 类似&#xff0c;但处理多字节字符&#xff09;-L&#xff1a…

吴恩达机器学习 第三课 week1 无监督学习算法(下)

目录 01 学习目标 02 异常检测算法 2.1 异常检测算法的概念 2.2 基于高斯模型的异常检测 03 利用异常检测算法检测网络服务器的故障 3.1 问题描述 3.2 算法实现 3.3 问题升级 04 总结 01 学习目标 &#xff08;1&#xff09;理解异常检测算法&#xff08;Anomaly Det…