突破数据存储瓶颈!转转业财系统亿级数据存储优化实践--图文解析

突破数据存储瓶颈!转转业财系统亿级数据存储优化实践–图文解析

原文链接:https://juejin.cn/post/7358704806779437097

原文作者:转转技术团队

业财系统:业务和财务一体化系统

与传统财务记账不同,一笔金额不再是写到记账簿上的一成不变的数字,而是在信息系统中随着业务变化不断发生变化的字段。业财系统除了定期生成财务数据,财务报表之外,还会根据不断变化的财务数据生成决策信息。

系统遇到的两大问题

1.数据量太大了,三年累计了大量数据,原有的数据库快承受不住了。(换数据库,由原来的mysql换成了tidb)

2.慢查询严重影响了系统性能,也拖慢了运行在同一台服务器上的其他系统。(使用es)

一,数据库选型方案

1.分库分表

在这里插入图片描述

无法采纳,原因

1:扩展困难,分片规则通常都是一次性定义好的,当前的业财系统承接的上游数据以后有很大的概率会增加新的业务,又要有新的数据出现。

2:业务来自上游不同的系统,不同系统都有自己的业务主键,业务主键无法统一,没有统一的业务主键作为分片键,查询时需要到每一个分片表中寻找数据,严重降低了查询效率。

3:跨库事务(要改代码)

比如说这种代码:

INSERT INTO table_name (column1, column2, column3) 
VALUES (value1, value2, value3), (value4, value5, value6), (value7, value8, value9);

如果是单库单表,这种一次添加多条的sql是有利于优化性能的,因为可以减少和数据库反复连接的次数。但如果涉及到分库分表,一次插入多条数据意味着要针对多个数据库,多个表,这样显然是要使用到跨库事务的,需要对源程序进行修改,对原来本不需要添加事务的业务代码添加跨库事务。影响系统的稳定性。

在这里插入图片描述

  • 分库分表的适用场景
  1. 数据库面临高并发访问的压力,又需要面对海量数据的存储问题,这时需要对数据库既采用分表策略,又采用分库策略,以便同时扩展系统的并发处理能力,以及提升单表的查询性能。
  2. 数据有统一的业务规则主键,使数据可以均匀分布。

Java开发分库分表的技术推荐:

单体项目:sharding-jdbc

微服务项目(必须是真的连同开发团队一起拆分的微服务项目):sharding-proxy

可参考视频:基于若依vue plus的分库分表:

https://www.bilibili.com/video/BV1Gh41137rv

https://www.bilibili.com/video/BV1MN411N7ru

https://www.bilibili.com/video/BV1XN411A7Tv

2.冷热库

在这里插入图片描述

热库:正在使用的数据库,高访问量,性能强

冷库:历史库,性能一般,存储量大,访问量低

如上图:热库定期将里面的1000万行用户几乎不会请求的数据迁徙到冷库,热库数据量减少,加快了查询速度,同时保存了历史数据。

本文项目中无法采纳的原因:

  1. 业财系统业务数据复杂,现阶段还会更改和查询历史数据,时间口径不统一,边界比较模糊,无法确认一个准确的边界。
  2. 考虑后续接入更多的业务数据,由于目前无法统一数据格式,那么可能就需要重新考虑边界等问题。

什么是边界:

举例:商品下单–付款–发货–收货–评价(自动好评),商品评价后,用户几乎不会再关注该商品的订单信息了,可以在评价后将数据库中的该条信息归档到性能稍差但数据存储量极大的“冷库”中。 冷库中的数据也能查,但速读要慢很多,这也是为什么我们过去搜索历史订单总是慢的原因。由于现在都是用了新一代的数据库,所以现在搜索历史订单的速度依然很快。

上面的例子中,商品已评价即为边界。

  • 适用场景
  1. 数据库中存在大量的历史数据,且查询频率比较低。
  2. 数据库的写入操作比读取操作更频繁。
  3. 数据库的存储成本较高,需要降低成本,把冷数据放到不值钱的存储介质中。

TiDB

新一代的NewSql数据库

SQL(Structured Query Language):数据库,指关系型数据库。主要代表:SQL Server、Oracle、MySQL、PostgreSQL。

NoSQL(Not Only SQL):泛指非关系型数据库,典型为KV存储。主要代表:MongoDB、Redis、CouchDB。

**NewSQL:**对各种新的可扩展/高性能数据库的简称。主要代表: Google Spanner,PingCAP TiDB, 阿里 oceanBase。

NewSQL可以简单理解为 分布式的关系型数据库

百度百科:

NewSQL 是对各种新的可扩展/高性能数据库的简称,包含OLTP,有些也包含OLAP,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性。

名词解析:

OLTP:OnLine Transaction Processing,联机事务处理系统,可以简单理解为对数据的增删改查等操作,数据量相对较少。常见:MySql,Oracle等

OLAP:OnLine Analytical Processing,联机分析处理系统,面向决策分析人员,针对存储的历史数据进行分析统计,常见的比如BI平台,数据可视化系统,风控平台等。常见:ClickHouse,Hive等

ACID:

在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。

  • Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

TiDB

  • 纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容,尤其支持高写入场景
  • 支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL
  • 默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
  • 支持 ACID 事务,对于一些有强一致需求的场景友好,例如:银行转账
  • 具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景
  • 不支持MySql存储过程,具体其他不支持的地方请查询官网

为什么TiDB支持高写入场景呢?因为其使用了不同于mysql的B+树的LSM树。

MySQL的B+树:

优点,查询速度快:保证了顺序查询,即便使用SSD硬盘,传统查询速度也要比顺序查询速度差的多。

缺点:插入数据慢,尤其是高写入插入的大量随机值,因为mysql需要维护B+树的平衡,所以每次插入值都需要规划B+树的结构。

原文链接:https://blog.csdn.net/weixin_43883685/article/details/109693823

下图高清地址:https://www.processon.com/view/link/5f48818e1e0853452d3fa33c

在这里插入图片描述

LSM-TREE

LSM树对写入过程做了优化,将大量数据先存放在内存中排序后再写入硬盘,每隔一段时间合并一次数据,有序的批量插入,大大提高了插入效率

数据写入时,并不会马上落入硬盘中,而是先存放在内存中,并对不断写入的数据进行排序,通常将其实现为平衡二叉树

在这里插入图片描述

当内存中的数据行程一定规模后,将内存中的Memtable写入硬盘,作为一颗独立的小树存在,不可修改

在这里插入图片描述

定期对硬盘中的SSTable进行合并

在这里插入图片描述

在这里插入图片描述

PD:
整个集群的管理中心,负责储存元数据,负责负载均衡以及分配全局唯一事务ID.(默认三个节点,高可用)

TiDB:
对外暴露MySql协议,接收并优化SQL请求,通过PD中存储的元数据找到对应TiKV中实际存放数据的TiKV节点并取得数据返回给用户

TiKV:

真正存储数据的地方,数据以NoSql数据库的KV形式存储。(TiKV Server默认三个节点,高可用)

Spark:

提供OLAP服务,接收Spark SQL,通过PD中存储的元数据找到对应TiKV中实际存放数据的TiKV节点并取得数据进行分析

TiDB部署方式:

https://cloud.tencent.com/developer/article/2363104

OceanBase

同样属于NewSql数据库

兼容常用MySQL/ORACLE功能及MySQL/ORACLE前后台协议,业务零修改或少量修改即可从MySQL/ORACLE迁移至OceanBase。

根据官方文档介绍支持MySql存储过程。

未采纳原因:要花钱,要花好多钱!

虽然有免费的社区版,但安装环境收费,文档不完整,开源社区活跃度不如TiDB

二 慢SQL的解决方案

使用ES

建立索引模型之后,我们需要考虑数据库(DB)与Elasticsearch(ES)之间增量数据的同步方式。

数据同步到ES中的几种方式

在这里插入图片描述

同步双写

数据写入到MySQL的时候,同时将数据写入到ES,需要改代码

异步双写

数据写入到MySQL的时候,通过MQ异步将数据写入到ES,需要改代码

定期同步

通过定时器,每隔一段时间同步一次数据,无法实现到秒级,MySQL中的数据无法和ES实时同步

数据订阅

读取mysql的binlog日志信息转为MQ,通过MQ消费程序不断消费MQ,每消费完一条消息,将消息写入到ES中;

不用改代码,没有感知;性能高;业务解耦,不需要关注原来系统的业务逻辑。

QL的时候,同时将数据写入到ES,需要改代码

异步双写

数据写入到MySQL的时候,通过MQ异步将数据写入到ES,需要改代码

定期同步

通过定时器,每隔一段时间同步一次数据,无法实现到秒级,MySQL中的数据无法和ES实时同步

数据订阅

读取mysql的binlog日志信息转为MQ,通过MQ消费程序不断消费MQ,每消费完一条消息,将消息写入到ES中;

不用改代码,没有感知;性能高;业务解耦,不需要关注原来系统的业务逻辑。

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

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

相关文章

【Python网络爬虫分步走】使用LXML解析网页数据

Python网络爬虫分步走 – 使用LXML解析网页数据 Web Scraping in Python - Using LXML to Parse Web Data By Jackson@ML Lxml作为Python的第三方库,提供易用的且功能强大的API,用来解析XML和HTML文档。事件驱动的API被用于分步骤解析。 本文简要介绍使用lxml库解析网页的基…

Digital电路仿真软件的安装

文章目录 1. Java环境的安装 2. Digital安装 3. 软件配置 1. Java环境的安装 电路仿真软件Digital是一款用于设计和仿真数字逻辑电路的工具。它可以帮助用户创建、测试和调试各种数字电路,提供可视化的电路编辑环境,使得设计过程更加直观和便捷。 D…

MySQL数据操作与查询- 连接查询

一、引入 1、为什么需要使用连接查询? 查询信息的来源如果来自多张表,则必须对这些表进行连接查询。 2、连接查询的分类 内连接和外连接。 二、内连接 1、概述 将两张表的记录组合在一起,产生一个新的结果。 (1&#xff09…

【Java】过滤器/拦截器

文章目录 两者区别request链路全过程 在实际开发中,过滤器和拦截器都是经常使用的技术,但一被提及到其区别时,整个人就愣住了,好像没有认真地对两者进行区别和总结,这两者之间也确实很容易混淆,因此结合了很…

Milvus Cloud 问答机器人 上线!构建企业级的 Chatbot

01. 背景 早些时候我们在社区微信群发出了一份关于Milvus Cloud 自动问答机器人的调研问卷。 调研受到了社区同学的积极响应,很快我们就收到了很多热心用户的回复。 基于这些回复,我们整理出了 Milvus Cloud Chatbot 的形态: 以功能使用和文档查询为核心 提供聊天和搜索双形…

version-manager最好用的SDK版本管理器,v0.6.2发布

项目地址:https://github.com/gvcgo/version-manager 中文文档:https://gvcgo.github.io/vdocs/#/zh-cn/introduction 功能特点: 跨平台,支持Windows,Linux,MacOS支持多种语言和工具,省心受到…

【Apache Doris】周FAQ集锦:第 5 期

【Apache Doris】周FAQ集锦:第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…

【云原生】Kubernetes----Kubernetes集群部署Prometheus 和Grafana

目录 引言 一、环境准备 二、部署node-exporter (一)创建命名空间 (二)部署node-exporter 1.获取镜像 2.定义yaml文件 3.创建服务 4.查看监控数据 三、部署Prometheus (一)创建账号并授权 &…

厂里资讯之app端文章查看

文章列表加载 需求分析 文章布局展示 表结构分析 ap_article 文章基本信息表 ap_article_config 文章配置表 ap_article_content 文章内容表 三张表关系分析 根据数据库设计的表生成对应的实体类 ap_article文章表对应实体 package com.kjz.model.article.pojos;import co…

2024.6.16 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、匹配问题 5、SuperGlue架构 5.1、注意力图神经网络(Attentional Graph Neural Network) 5.2、最佳匹配层(Optimal matching layer) 5.3、损失 6、实验 6.…

【教程】Linux设置进程的优先级

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 关键指令 sudo chrt -f <优先级> <指令> 示例脚本 当然也可以不是启动Python脚本&#xff0c;普通的指令都可以&#xff0c;可自行适当修…

38、基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

1、原理及流程 1&#xff09;原理 CNN&#xff08;卷积神经网络&#xff09;是一种深度学习模型&#xff0c;可以用于图像识别和分类任务。车牌自动识别系统的原理基本上就是使用CNN模型对车牌图像进行处理和识别。 首先&#xff1a;系统需要收集大量的含有车牌的图像数据作…

平板消解加热台-温度均匀,防腐蚀-实验室化学分析

DBF系列防腐电热板 是精致路合金加热板块表面经进口高纯实验级PFATeflon氟塑料防腐不粘处理&#xff0c;专为实验室设计的电加热产品&#xff0c;是样品前处理中&#xff0c;加热、消解、煮沸、蒸酸、赶酸等处理的得力助手。可以满足物理、化学、生物、环保、制药、食品、饮品…

黑马头条Minio报错non-xml response from server错误的解决方法

今天在写项目的时候&#xff0c;想测试minio上传文件功能是否正常&#xff0c; 但是每次都出现non-xml response from server的错误。 自己也在网上找了很多解决方法&#xff0c;大部分是说用户名和密码的配置问题&#xff0c;但是检查后发现并没有错误。 最后发现是自己的dock…

Bio-Info每日一题:Rosalind-07-Mendel‘s First Law(孟德尔第一定律 python实现)

&#x1f389; 进入生物信息学的世界&#xff0c;与Rosalind一起探索吧&#xff01;&#x1f9ec; Rosalind是一个在线平台&#xff0c;专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战&#xff0c;帮助用户从基础到高级掌握生物信息学知识。无论你是初…

53. QT插件开发--插件(动态库so)的调用与加载

1. 说明 在使用QT进行插件库的开发之后,还需要将这个插件库程序生成的so动态链接库加载到主程序框架中进行使用,才能达到主程序的模块化开发的效果。在前一篇文章插件创建中介绍了如何在QT中开发插件库,并提供外部接口调用。本篇博客的主要作用是模拟在主程序框架中加载动态…

深度学习Day-20:DenseNet算法实战 乳腺癌识别

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境&#xff1a;Python3.8编译器选择&#xff1a;Pycharm深度学习环境&#xff1a; torch1.12.1c…

在表格中渲染轮播图的方法;

效果图&#xff1a;代码&#xff1a; shop()function shop() {// render()$.ajax({url: "http://jingxun.zhbbll.asia/pc/Commodity/shop_list", //要请求的后端地址type: "GET", //数据发送的方式(POST或者GET)dataType: JSON,headers: {token: token,id…

双Token方案实现Token自动续期(基于springboot+vue前后端分离项目)

文章目录 前言一、双Token方案介绍1. 令牌类型与功能2.双Token方案的优点3.实现流程 二、具体实现1.后端实现1.1 jwt工具类1.2 响应工具类1.3 实体类1.4 过滤器1.5 controller1.6 启动类 2、前端实现2.1 登录页面2.2 index页面2.3 请求拦截器和响应拦截器 效果展示 前言 更多j…

【星座运势】本周财运分析,巨蟹座财富潜力大开!

大家好&#xff01;今天我们来谈谈巨蟹座本周的财富运势。经过调查和数据分析&#xff0c;我发现巨蟹座这周的财运潜力很大&#xff01;接下来&#xff0c;我将用通俗易懂的语言&#xff0c;通过代码说明&#xff0c;向大家展示巨蟹座的财富运势。 首先&#xff0c;我们需要通…