分库分表及ShardingShpere-proxy数据分片

为什么需要分库?

随着数据量的急速上升,单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈,所以需要考虑拆分数据库,将数据库分布在不同实例上提升数据库可用性。主要的原因有如下:

  1. 磁盘存储。业务量剧增,MySQL单机磁盘容量会撑爆,磁盘使用率过高的情况下甚至会影响性能,拆成多个数据库,磁盘使用率大大降低。
  2. 并发连接限制。单个数据库的连接存在上限,如果连接数超过上限,会出现connect refused,导致有些请求无法成功请求数据库。特别在高并发场景下,单机MySQL压力很大甚至扛不住而导致MySQL连接打满造成不可用,影响业务正常运行。

为什么需要分表?

随着单表数据量的增加,对于数据的查询和更新,即使在数据库底层有一定的优化,但是随着量变必定会引起质变,导致性能急剧下降。这时可以通过分表的方法,将单表数据按一定规则水平拆分到多个表中,减小单表的数据量,提升系统性能。
如果一个查询SQL没命中索引,千百万数据量的表可能会拖垮这个数据库。即使SQL命中了索引,如果表的数据量超过一千万的话,查询也是会明显变慢的。因为索引一般是B+树结构,数据千万级别的话,B+树的高度会增高,高度越高,磁盘IO次数越多,查询就变慢。

拆分方式

  1. 垂直拆分。垂直拆库可以理解为把单库里的不同表拆分至不同数据库。垂直拆表可以理解为将一个表里的部分列(可以是长度较长的、不常用的等)拆分至另一个表,使得每张表的职责更明确,数据更聚焦。
  2. 水平拆分。水平分库是指,将表的数据量切分到不同的数据库服务器上,每个服务器具有相同的库和表,只是表中的数据集合不一样。它可以有效的缓解单机单库的性能瓶颈和压力。水平分表指一按照某种规则(如hash取模、range),把表里的数据切分到多张同样职责的表中。

分库分表带来的问题

  1. 不同数据库存在于不同实例上,本地事务无效,需要使用分布式事务
  2. 跨数据库进行Join操作,需要将sql拆成多次查询。
  3. 跨节点排序。需要在每个数据库都排完序后,在应用层再次合并排序。
  4. 分页。需要在应用层额外处理。
  5. 分布式ID。分库分表需要保证id不重复,需要额外使用雪花算法或者uuid生成全局id。

ShardingShpere-proxy

ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。它站在数据库的上层视角,关注它们之间的协作多于数据库自身。
我们系统使用ShardingSphere-proxy,并部署为一个单独的分片服务。ShardingShphere生态中还有ShardingShpere-JDBC,其作为sdk的方式附载在业务项目中。主要是用shardingShpere-proxy的数据分片能力来提供逻辑SQL的功能。

在这里插入图片描述
数据分片
用户使用时,只需要传入基于逻辑库/表的sql操作即可,提升使用效率,简化流程。
数据分片流程:
sql 解析 - 词法解析和语法解析;
sql 路由 - 根据解析上下文匹配数据库和表的分片策略,并生成路由路径;
sql 改写 - 将逻辑 SQL 改写为在真实数据库中可以正确执行的 SQL;
sql 执行 - 使用多线程并发执行 sql;
结果归并 - 将从各个数据节点获取的多数据结果集,组合成为一个结果集并正确的返回至请求客户端;
在这里插入图片描述
https://shardingsphere.apache.org/document/current/cn/reference/sharding/route/

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

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

相关文章

Vite + React + tailwindcss + ts + 多Nodejs环境... 速搭

最近接触了前端代码,作为一个后端,能将其搭起来并用于生产,我感到很是欣慰。 本文纯安装速记与关键点记录,适合有一定经验且对前端React及生态有一些小了解,想要快速的将一个框架搭建起来的童鞋。可当成一个指引。 N…

华为OD机试 - 高效货运(Java JS Python C)

题目描述 老李是货运公司承运人,老李的货车额定载货重量为 wt。 现有两种货物: 货物 A 单件重量为 wa,单件运费利润为 pa货物 B 单件重量为 wb,单件运费利润为 pb老李每次发车时载货总重量刚好为货车额定的载货重量 wt,车上必须同时有货物 A 和货物 B ,货物A、B不可切割…

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

05-命令模式

意图(GOF定义) 将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求排队或者记录日志,以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

旅游管理虚拟情景实训教学系统演示

首先,虚拟情景实训教学系统为旅游管理专业的学生提供了一个全新的实践平台。在传统的旅游管理教学中,学生往往只能通过理论学习来了解相关知识,而无法亲身实践。虚拟情景实训教学系统则可以通过模拟真实的旅游场景,让学生能够亲身…

Linux环境下maven的安装

到官网下载maven 步入下面的地址选择合适的maven版本 https://dlcdn.apache.org/maven/ 以笔者为例,选择了3.5.4这个版本 将maven上传到Linux服务器并解压 tar -zxvf apache-maven-3.5.4-bin.tar.gz配置环境变量 我们使用vim编辑profile vim /etc/profile环境…

【数据结构(十一·多路查找树)】B树、B+树、B*树(6)

文章目录 1. 二叉树 与 B树1.1. 二叉树存在的问题1.2. 多叉树 的概念1.3. B树 的基本介绍 2. 多叉树——2-3树2.1. 基本概念2.2. 实例应用2.3. 其他说明 3. B 树、B树 和 B*树3.1. B树 的介绍3.2. B树 的介绍3.2. B*树 的介绍 1. 二叉树 与 B树 1.1. 二叉树存在的问题 二叉树…

react Hooks(useEffect)实现原理 - 简单理解

useEffect 语法: useEffect(setup, dependencies?) 含义: useEffect 是一个 React Hook,它允许你 将组件与外部系统同步。 useEffect 源码简单理解 一、mountEffect 和 upadateEffect useEffect 与其它 hooks 一样分为 mountEffect 和 upadateEffec…

I2C总线通信(温湿度实验)

1.使能GPIOF时钟 2.将PF14设置为输出,PF15也可以先设置为输出 3.设置输出速度最高档位速度 4.SI7006的初始化 5.读取温度、湿度 6.将读取到的温度湿度数据通过计算公式进行转换 7.将结果输出 main.c #include "si7006.h"extern void printf(cons…

linux bash shell变量操作符 —— 筑梦之路

1. 变量子串 ${var} 返回变量var的内容,单独使用时有没有{}一样,混合多个变量和常量时,用{}界定变量名 ${#var} 返回变量var内容的长度 ${var:offset} 从变量var中的偏移量offset开始截取到字符串结尾的子字符串,offset从0开始 ${…

工科数学分析(华南理工大学)

旷了三天课,估计要被薄纱了这下() ----------------引言 第一节 集合与实数集 比较重要的是实数具有稠密性。 即在两个实数之间存在无穷个其他实数, 然后是绝对值不等式 第一个经常用来放缩不等式,证明极限 第二…

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal(Ruizhou Sun、Yukun Su、Qingyao Wu)[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…

Debian 系统镜像下载

最近在看一些网络相关的文章需要用到 debian 11.x 的系统网上找了好多都发下载,在官网看一下 有个 11.8 的版本我无法下载,提示被最新的 debian-12.4.0 所代替,于是找到了这个链接 Index of /cdimage/unofficial/non-free/cd-including-fi…

imazing是什么软件

imazing是什么软件 iMazing 是世界上最值得信赖的软件,可以将您的信息、音乐、文件和数据从 iPhone 或 iPad 传输到您的 Mac 或 PC。 获得备份、数据提取、媒体和文件传输的强大能力,以及更多 iMazing 功能。 iMazing是一款第三方的苹果iOS设备管理软件。 iMazing- 2 Mac-安装…

web前端之若依开发经验

MENU 前言创建路由的细节 前言 1、官网地址 2、在线文档 3、演示地址 4、代码下载 5、野生版的若依开发文档 创建路由的细节 1、从系统管理进入菜单管理页面创建菜单,菜单创建成功后刷新页面,然而刚刚创建的菜单并不会出现。 2、解决创建完菜单不显示问题…

【计算机网络基础4】UDP协议、DNS协议、NAT协议、DHCP协议和HTTP协议

1、UDP协议 UDP用户数据报协议,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现…

死锁(面试常问)

1.什么是死锁 简单来说就是一个线程加锁后解锁不了 一个线程,一把锁,线程连续加锁两次。如果这个锁是不可重入锁,会死锁。两个线程,两把锁。 举几个例子,1.钥匙锁车里了,车钥匙锁家里了。2. 现在有一本书…

slot的理解

一. 什么是slot? 在Vue中,slot 是一种用于在组件之间进行内容分发的机制。它允许我们在组件的模板中定义具有特定名称的插槽,并在组件的使用者中填充相应的内容。 二. 使用场景 通过插槽可以让用户可以拓展组件,去更好地复用组件和对其做定…

在 Qt Creator 中编写 Doxygen 风格的注释

2023年12月10日,周日上午 如何生成Doxygen 风格的注释 在需要Doxygen 风格注释的函数上方输入 /**,然后按下 Enter 键。Qt Creator 将自动为你生成一个注释模板。 输入,Qt Creator会自动帮你补全Doxygen标签 不得不说,写了Doxyge…