存储服务的演化与MySQL分库分表

文章目录

  • 一、存储服务的演化
    • 1.单体结构
    • 2.单表单库的数据量膨胀 -> 分库分表
    • 3.单个MySQL的读写压力过大 -> MySQL索引优化
    • 4.进一步缓解MySQL读写压力 -> 读写分离
    • 5.冷热数据分离 -> 使用Redis缓存
  • 二、MySQL分库分表
    • 1.策略
    • 2.需要注意的问题

一、存储服务的演化

1.单体结构

最初,服务只有一个MySQL存储。当用户通过浏览器发送请求时,请求会被发送到Java服务器上,这个后端的Java服务是使用Spring、MyBatis等框架编写的。后端服务会与MySQL进行交互,进行数据查询或写入操作。

在这里插入图片描述

2.单表单库的数据量膨胀 -> 分库分表

单表单库的数据量会不断增大,这个时候就可以考虑分库分表。分库分表的具体做法见下一章。

在这里插入图片描述

3.单个MySQL的读写压力过大 -> MySQL索引优化

如果我们碰到的是读多写少的场景,可以先尝试添加合适的索引。我在这篇博客中详细介绍了MySQL索引优化的内容。

4.进一步缓解MySQL读写压力 -> 读写分离

如果在为MySQL添加适当的索引后,单机仍然无法处理读取流量,可以考虑使用从库进行读写分离,以便多个从库共同分担读取流量。如果读写负载相对均衡,还可以考虑主从读写分离方案,这样主库只处理写入流量,从库只处理读取流量,从而减轻单个MySQL上的压力。

在这里插入图片描述

5.冷热数据分离 -> 使用Redis缓存

除了在全量数据上进行分治,还可以根据数据访问情况进行分治,将数据区分为冷热数据,并将经常访问的"热"数据放入更快的存储介质中,例如缓存。这样可以提高热数据的访问速度,减轻数据库的负载压力。

红色字体为读流程,蓝色字体为写流程。

在这里插入图片描述

二、MySQL分库分表

MySQL分库分表是一种在大规模数据存储和高并发访问场景下的数据库架构设计方法。它将一个大型的数据库拆分成多个小型的数据库(分库),并将每个数据库中的表进一步拆分成多个小表(分表),从而实现数据的水平拆分和分布式存储。

分库分表的主要目的是解决单一数据库在数据量和访问压力增大时的性能瓶颈和扩展性问题。通过将数据分散到多个数据库和表中,可以提高数据库的并发处理能力和查询性能。

1.策略

在MySQL分库分表中,通常采用以下策略:

  1. 垂直分库:将不同的业务数据存储在不同的数据库中。例如,将用户信息存储在一个数据库中,将订单信息存储在另一个数据库中。这样可以根据业务需求对不同的数据库进行独立的扩展和优化。

  2. 水平分表:将单个表按照某个规则(如范围、哈希、取模等)拆分成多个小表。例如,将订单表按照订单ID的范围进行拆分,将不同范围的订单存储在不同的表中。这样可以减少单个表的数据量,提高查询性能。

2.需要注意的问题

在进行MySQL分库分表时,有一些需要注意的问题:

  • 数据一致性: 分库分表可能导致数据的分散和拆分,需要确保数据在不同数据库和表之间的一致性。在进行跨库事务或跨表查询时,需要考虑数据的一致性处理。在分表场景下,需要确保生成的主键在不同表之间唯一且不重复。可以使用 分布式主键生成算法或者数据库自增主键 来保证主键的唯一性。

  • 跨库查询和事务: 在分库分表架构中,跨库查询和跨库事务是常见的需求。需要考虑如何处理跨库查询的性能和复杂性,除了要进行索引优化、查询路由优化等常规优化之外,还要选择合适的分布式事务管理方案。

  1. XA事务:XA是一种经典的分布式事务协议,它通过两阶段提交(Two-Phase Commit,2PC)协议来实现分布式事务的一致性。XA事务要求所有参与者(包括数据库、消息队列等)都支持XA协议。
  1. TCC事务:TCC(Try-Confirm-Cancel)是一种补偿型事务模式,它通过在业务逻辑中显式地定义Try、Confirm和Cancel三个阶段来实现分布式事务的一致性。TCC事务适用于对数据一致性要求较高的场景。
  1. 消息队列事务:一些消息队列中间件(如Apache Kafka、RabbitMQ)提供了事务性消息的支持。通过将事务性操作和消息发送放在同一个事务中,可以实现分布式事务的一致性。
  1. Saga模式:Saga是一种长事务处理模式,通过将一个大事务拆分为多个小事务,并使用补偿机制来保证事务的一致性。Saga模式适用于业务逻辑复杂、需要长时间执行的场景。
  1. 基于可靠消息的最终一致性:在一些分布式系统中,通过使用可靠消息队列和事件驱动的方式来实现最终一致性。每个参与者将操作转化为消息发送,并通过订阅和处理消息来实现最终一致性。

选择适合的分布式事务管理方案时,需要考虑业务需求、系统复杂性、性能要求和开发成本等因素。每种方案都有其优缺点,需要根据具体情况进行评估和选择。如果需要更详细的信息,可以使用搜索引擎进行进一步的调研。

  • 数据维护: 在分库分表后,可能需要进行数据迁移、回滚、扩容操作。需要考虑如何平滑地将数据从一个数据库或表迁移到另一个数据库或表,并确保数据的完整性和一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机汽车防盗报警的设计与实现

功能介绍 以STM32单片机作为主控系统;LCD1602液晶显示当前温度信息和参数等功能;3个LED指示灯表示:震动指示灯、人体感应指示灯、防盗模式开启指示灯;按键用来开启防盗模式,设置温度上下限;开启防盗后检测到…

T5模型: Transfer Text-to-Text Transformer(谷歌)

🔥 T5由谷歌发表于2019,《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》,最终版本发布在:JMLR。 一句话总结T5: 大一统模型,seq2seq形式完成各类nlp任务,大数据集…

uni-app image加载错误 404 替换为默认图片

双层v-for 使用item修改 aitem.cat_icon || defaultPic绑定图片src属性为aitem.cat_icon 如果aitem.cat_icon的值为空字符串或undefined&#xff0c;那么默认图片defaultPic被显示出来当图片加载错误时,触发handleImageError方法,将aitem传进去 <!-- 页面--><view …

小程序首页轮播图设计

效果图 微信小程序的数据详解 indicator-dots&#xff1a;是否显示面板指示点【默认false 】 indicator-color&#xff1a;指示点颜色【默认rgba(0, 0, 0, .3)】 indicator-active-color&#xff1a;当前选中的指示点颜色【默认#000000】 autoplay&#xff1a;是否自动切换…

Appium python 框架

目录 前言 流程 结构 具体说说 run.py 思路 其他模块 前言 Appium是一个开源的移动应用自动化测试框架&#xff0c;它允许开发人员使用多种编程语言&#xff08;包括Python&#xff09;来编写自动化测试脚本。Appium框架提供了一套API和工具&#xff0c;可以与移动设备进…

【Docker】Docker基本概念

Docker基本概念 1.Docker概述1.1 Docker是什么&#xff1f;1.2 Docker的宗旨1.3 容器的优点1.4 Docker与虚拟机的区别1.5 容器在内核中支持的两种技术1.6 namespace的六大类型 2.Docker核心概念2.1 镜像2.2 容器2.3 仓库 3. 知识点总结3.1 Docker是什么&#xff1f;3.2 容器和虚…

【Express.js】evp-express-cli

evp-express-cli evp-express-cli 是笔者结合自己的实践经验编写的一款 express 手脚架&#xff0c;以一种比较合适的流程构建的 express 架构。 文档 安装用法 命令新建项目运行模板 验证数据库RedisAuthRabbitMQSocketIONacos 开发工具 BabelEsintJestPkgPM2 资源配置日志异…

200行代码写一个简易的C++小黑窗贪吃蛇游戏

分享一个简易的小黑窗贪吃蛇,一共就两百行代码左右(包含注释),很适合初学者巩固语法来练练手. 如果后续需要其他功能也可以再添加. 先小小展示一下: 源码在文末免费领取. 使用工具: VS2019(不是用VS的也可以直接找出cpp和h文件复制到你们用的IDE,甚至是记事本都可以) 闲话…

基于linux下的高并发服务器开发(第二章)- 2.13 匿名管道通信案例

实现 ps aux | grep xxx 父子进程间通信 子进程&#xff1a; ps aux, 子进程结束后&#xff0c;将数据发送给父进程 父进程&#xff1a;获取到数据&#xff0c;过滤 pipe() execlp() 子进程将标准输出 stdout_fileno 重定向到管道的写端。 dup2 07 / 匿名管道…

【代码随想录 | Leetcode | 第七天】链表 | 链表相交 | 环形链表 II

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来链表相交和环形链表 II的分享✨ 目录 前言面试题 02.07. 链表相交142. 环形链表 II总结 面试题 02.07. 链表相交 ✨题目链接点这里 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找…

Python应用:什么是爬虫?

文章目录 什么是爬虫虫之初&#xff0c;性本善&#xff1f;出行社交电商搜索引擎政府部门总结 面向监狱编程爬虫的君子协议什么是君子协议君子协议是怎么产生的&#xff1f;君子协议是什么内容&#xff1f;如何查看一个网站的robots协议违反君子协议的案例 参考文献 2022年初的…

用Vue如何实现低代码开发平台?

前言 在众多开发技术中&#xff0c;Vue组件化开发技术以其卓越的灵活性和高效性备受瞩目。 低代码平台相信不少人知道它的存在&#xff0c;而且现在大部分公司都在开发自己的低代码平台&#xff0c;首先我们来看看低代码平台可视化界面&#xff1a; 官网&#xff1a;https://ww…

水库大坝安全监测系统是由什么组成的?

水库大坝是防洪抗灾的重要设施&#xff0c;它们的安全性直接关系到人民群众的生命财产安全。因此&#xff0c;水库大坝的安全监测必不可少。水库大坝安全监测系统是一种集成了数据采集、传输、处理和分析的技术平台&#xff0c;能够实时、准确地监测大坝的状态&#xff0c;及时…

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88057828

MySQL第五章、索引事务

目录 一、索引 1.1 概念 1.2 作用 1.3 使用场景 1.4 使用 1.5 案例 二、索引背后的数据结构 2.1 B-树&#xff08;B树&#xff09; 2.2 B树&#xff08;MySQL背后数据结构&#xff09; 三、事务 3.1 为什么使用事务 3.2 事务的概念 3.3 使用 3.4并发执行事务产生…

【深度学习】张量的广播专题

一、说明 张量广播&#xff08;tensor broadcasting&#xff09;是一种将低维张量自动转化为高维张量的技术&#xff0c;使得张量之间可以进行基于元素的运算&#xff08;如加、减、乘等&#xff09;。在进行张量广播时&#xff0c;会将维度数较少的张量沿着长度为1的轴进行复制…

Vue中的侦听器:数据变化的秘密揭示

一、侦听器&#xff1a;vue中想监听数据的变化 &#x1f680;&#xff08;一&#xff09;侦听器watch 如何侦听到某个变量值改变呢&#xff1f;使用watch配置项&#x1f6a7;&#x1f6a7;&#x1f6a7;watch&#xff1a;可以侦听到data/computed属性值的改变。语法&#xff…

fileclude

背景知识 文件包含漏洞 题目 分析上述代码 file2被放入file_get_contents()函数&#xff0c;且要求返回值为hello ctf file1是要包含的文件&#xff0c;放在include函数中 用php://filter伪协议读取源代码 构造payload&#xff1a; file1php://filter/readconvert.base64-…

数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

本章主要介绍图像处理中一个比较基础的操作&#xff1a;Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难&#xff0c;主要是结合OpenCV 4.5的API相关操作&#xff0c;为往下 "基于距离变换的分水岭图像分割" 做知识储备。 Canny边缘检测 在讲述轮廓之前&#xff0c;…

实现大文件传输的几种方法,并实现不同电脑间大文件传输

随着网络技术的快速发展&#xff0c;大文件的传输需求越来越多&#xff0c;如何在不同的电脑之间实现大文件的快速传输&#xff0c;是一个挑战&#xff0c;下面介绍几种常用的方法可以解决这个问题。 1、利用局域网传输&#xff1a;把两台电脑接入同一个网络环境&#xff0c;通…