ShardingSphere数据库中间件

数据库中的数据量猛增,访问性能也变慢了,优化迫在眉睫 ?
1. 关系型数据库本身比较容易成为系统瓶颈:单机存储容量、数据库连接数、处理能力都有限。
2. 当单表的数据量达到 1000W 100G 以后,由于查询维度较多,即使做了优化索引等操作, 查询性能仍下降严重。
方案 1
通过提升服务器硬件能力来提高数据处理能力,比如增加存储容量 、 CPU 等,这种方案成本很高,并且如果瓶颈在MySQL 本身那么提高硬件也是有很的。
方案 2
把数据分散在不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的;

分库分表概念:
分坤分表就是为了解决由于数据量大导致数据库性能降低的问题。
  1. 将原来独立的数据库拆分成若干数据库组成;
  2. 将原来的达标(存储近千万数据的表)拆分成若干个小表;

目的:使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

什么是分库分表

使用索引,缓存等,数据库的压力仍然很大,就需要使用到数据库拆分了,切分的目的就在于减少数据库的负担,缩短查询时间。

分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。当整个数据库读写出现性能瓶颈,例如数据库连接数被打满了(MySQL最大连接数默认150),或者并发量太大导致单个数据库已经无法满足日常的读写需求,就需要将整个库拆开。

分表:从单张表拆分成多张表的过程,将数据散落在多张表内。单表数据量非常大,存储和查询的性能就会遇到瓶颈了,如果你做了很多优化之后还是无法提升效率的时候,就需要考虑做分表了。一般千万级别数据量,就需要分表。

分库分表: 单表数据量大,所在库也出现性能瓶颈,就要既分库又分表。

什么时候分库分表

单表行数超过`500万`行或者单表容量超过`2GB`,才推荐进行分库分表。

应该**提前规划分库分表**,如果估算`3`年后,你的表都不会到达这个五百万,则不需要分库分表。分库的时候除了要考虑平时的业务峰值读写QPS外,还要考虑到诸如双11大促期间可能达到的峰值,需要提前做好预估。

一般情况下,单表数据量到达千万级别,就可以考虑分库分表了。具体是否需要分库分表还是要看具体的业务场景,例如流水表、记录表,数据量非常容易到达千万级、亿万级,需要在设计数据库表的阶段就进行分表,还有一些表虽然数据量只有几百万,但字段非常多,而且有很多text、blog格式的字段,查询性能也会很慢,可以考虑分库分表。

 


数据库拆分策略

业务场景

  • 垂直切分
    • 业务维度
垂直分割是将一个表按照列的方式拆分成多个表,减少单个表的记录数和列数,提高查询性能。垂直分割一般分为两种: 基于功能分割和基于范式分割。例如,将一个用户表拆分为登录信息表、用户信息表和账户信息

  • 水平切分
    • 数据维度
水平分割是将一个表按照行的方式拆分成多个表,将数据存储到多个服务器上,提高查询性能。水平分割一般按照主键或按照特定的列进行分割。例如,将一个订单表按照订单号拆分成多个表。

  • 混合切分
    • 业务+数据

读写分离: 读写分离是将对数据库的读操作和写操作拆分到不同的服务器上,减轻单个数据库的负载压力,提高查询性能。例如,将一个电商网站的读取操作分配到从数据库上,将写操作分配到主数据库上。
分片: 分片是将一个大型数据表按照某个维度拆分成多个小的数据表,并将数据存储到多个服务器上。分片一般按照 分片键进行分割,例如,将一个电商网站的订单表按照某个地理位置分割成多个子表。

ShardingSphere简介

Apache ShardingSphere是一款开源的分布式数据库中间件组成的生态圈,它由 Sharding-JDBC、 Sharding-Proxy Sharding-Sidecar (规划中)这 3 款相互独立的产品组成。
ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的 计算和存储能力,而并非实现一个全新的关系型数据库。        
1 Sharding-JDBC :被定位为轻量级 Java 框架,在 Java JDBC 层提供的额外服务,以 jar 包形式使用。
2 Sharding-Proxy :被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版 本,用于完成对异构语言的支持。
3 Sharding-Sidecar :被定位为 Kubernetes Mesos 的云原生数据库代理,以 DaemonSet 的形式代理所有对数据库的访问。

ShardingSphere-JDBC
ShardingSphere-JDBC ShardingSphere 的第一个产品,也是 ShardingSphere 的前身, 我们经常 简称之为:sharding-jdbc 。 它定位为轻量级 Java 框架,在 Java JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
适用于任何基于 Java ORM 框架,如: JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用JDBC。
基于任何第三方的数据库连接池,如: DBCP, C3P0, BoneCP, Druid, HikariCP 等。
支持任意实现 JDBC 规范的数据库。目前支持 MySQL Oracle SQLServer PostgreSQL

sharding-jdbc 的本质上就是实现 JDBC 的核心接口。


常用分库分表的工具

在选定了分表字段和分表算法之后,那么,如何把这些功能给实现出来,需要怎么做呢?

我们如何可以做到像处理单表一样处理分库分表的数据呢?这就需要用到一个分库分表的工具了。

目前市面上比较不错的分库分表的开源框架主要有三个,分别是sharding-jdbc、TDDL和Mycat。

1、Sharding-JDBC

现在叫ShardingSphere(Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款相互独立的产品组成)。它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

开源地址:https://shardingsphere.apache.org

2、TDDL

TDDL 是淘宝开源的一个用于访问数据库的中间件, 它集成了分库分表, 读写分离,权重调配,动态数据源配置等功能。封装 jdbc 的 DataSource给用户提供统一的基于客户端的使用。

开源地址:https://github.com/alibaba/tb_tddl

3、Mycat

Mycat是一款分布式关系型数据库中间件。它支持分布式SQL查询,兼容MySQL通信协议,以Java生态支持多种后端数据库,通过数据分片提高数据查询处理能力。

开源地址:https://github.com/MyCATApache/Mycat2

原文链接:http://t.csdnimg.cn/LPMDI


ShardingSphere-JDBC+mybatisplus
3333 smbms 为主库, 3334 smbms 为从库
2 个库中都需同时存在 smbms_user 表,要求结构相同
引入 jar

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.44</version>
</dependency>
<!-- mybatis-plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version>
</dependency>
<!--阿里数据库连接池 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version>
</dependency>
编写yml文件(注意缩进)
读写分离
server:port: 80
spring:shardingsphere:datasource:names: ds0,ds1 # 一主一从ds0:type: com.alibaba.druid.pool.DruidDataSourcexdriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456# 从数据源ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456masterslave:# 读写分离配置load-balance-algorithm-type: round_robin # 多个从库的负载均衡策略:轮询# 最终的数据源名称name: da# 主库数据源名称master-data-source-name: ds0# 从库数据源名称列表,多个逗号分隔slave-data-source-names: ds1props:sql:show: true #打印SQLmain:allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的
mybatis-plus:type-aliases-package: com.hz.pojoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false #驼峰映射
水平拆分
spring:main:allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的shardingsphere:datasource:names: ds0,ds1 # 一主一从ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456sharding:tables:user: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致actual-data-nodes: ds$->{0..1}.user$->{1..2} # 创建了两个表,下标0和1 如果在同一数据库下,只做分表 ds0.smbms_bill_$->{1..2}key-generator:column: id #主键idtype: SNOWFLAKE #生成策略雪花iddatabaseStrategy: #如果只分表,可不设置inline: # 指定表的分片策略shardingColumn: id #参与分片运算的列名algorithmExpression: ds$->{id % 2} #分片算法# 分表策略table-strategy:inline: #指定表的分片策略sharding-column: idalgorithm-expression: user$->{id%2 + 1} #分片规则props:sql:show: true #打印SQLmybatis-plus:type-aliases-package: com.hz.pojoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false #驼峰映射
server:port: 80

垂直拆分

spring:main:allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的shardingsphere:datasource:names: ds0,ds1 # 一主一从ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456sharding:tables:user:actual-data-nodes: ds0.user1 #指定关联的数据库bill:actual-data-nodes: ds1.bill1 #指定关联的数据库props:sql:show: true #打印SQLmybatis-plus:type-aliases-package: com.hz.pojoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false #驼峰映射
server:port: 80
读写分离 + 分库分表(水平拆分)
spring:main:allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的shardingsphere:datasource:names: ds0,ds1 # 一主一从ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456sharding:tables:bill: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致actual-data-nodes:  ds0.bill$->{1..2} # 创建了两个表,下标0和1key-generator:column: id # 主键IDtype: SNOWFLAKE # 生成策略雪花id# 分表策略table-strategy:inline: # 指定表的分片策略sharding-column: idalgorithm-expression: bill$->{id % 2 + 1} #分片规则user: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致actual-data-nodes: ds0.user$->{1..2} # 创建了两个表,下标0和1key-generator:column: id # 主键IDtype: SNOWFLAKE # 生成策略雪花id# 分表策略table-strategy:inline: # 指定表的分片策略sharding-column: idalgorithm-expression: user$->{id % 2 + 1} #分片规则masterslave:# 读写分离配置load-balance-algorithm-type: round_robin # 多个从库的负载均衡策略:轮询# 最终的数据源名称name: da# 主库数据源名称master-data-source-name: ds0# 从库数据源名称列表,多个逗号分隔 至少需要有一个slave-data-source-names: ds1props:sql:show: true #打印SQL
mybatis-plus:type-aliases-package: com.hz.pojoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false #驼峰映射
server:port: 80

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

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

相关文章

JS高频面试题(下)

11. 线程和进程的区别 进程是资源分配的最小单元&#xff0c;线程是代码执行的最小单元。 一个应用程序可能会开启多个进程&#xff0c;进程之间数据不共享&#xff0c;一个进程内部可以开启多个线程&#xff0c;线程之间的数据可以共享的&#xff0c;所以多线程的情况下&…

探索设计模式的魅力:深入理解面向对象设计的深层原则与思维

如何同时提高一个软件系统的可维护性 和 可复用性是面向对象对象要解决的核心问题。 通过学习和应用设计模式&#xff0c;可以更加深入地理解面向对象的设计理念&#xff0c;从而帮助设计师改善自己的系统设计。但是&#xff0c;设计模式并不能够提供具有普遍性的设计指导原则。…

运维神器Ansible的常用模块

引言&#xff1a;话不多说&#xff0c;今天分享一下Ansible的常用模块&#xff0c;建议收藏哦 1、ping模块 ping模块可以进行主机连通性测试 命令格式 ansible 主机或主机组 -m ping 例&#xff0c;成功显示如下&#xff1a; 2、command 模块 command模块可以直接在远程主机…

C#使用DateTime.Now.AddDays方法获取任一天的信息

目录 一、使用DateTime对象的AddDays方法获取任一天信息方法 二、举例说明获取昨天的信息 三、涉及到的知识点 1. MessageBox.Show(&#xff09;中信息分行的办法 使用DateTime.Now属性可以得到当前的日期信息&#xff0c;此时调用ToString方法&#xff0c;并在该方法中添加…

【Python编程工具】【ssh连接Docker容器】如何使用Docker容器里的python环境,如何调试在容器中的代码

文章目录 方案一览Gateway软件介绍启动容器配置apt源在容器中安装SSH服务器配置SSH服务器生成SSH密钥启动SSH服务为root创建密码连接到容器使用Gateway 方案一览 本篇博客将介绍如何在Docker容器中打开SSH连接服务&#xff0c;以及如何使用JetBrains Gateway软件进行代码调试。…

基于springboot+vue的社区医院信息平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

vp9协议笔记

vp9协议笔记&#x1f4d2; 本文主要是对vp9协议的梳理&#xff0c;协议的细节参考官方文档&#xff1a;VP9协议链接&#xff08;需要加速器&#xff09; vp9协议笔记 vp9协议笔记&#x1f4d2;1. 视频编码概述2. 超级帧superframe&#xff08;sz&#xff09;&#xff1a;2. fr…

VBA即用型代码手册之改变主窗口标题栏名称及隐藏工作表

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

JavaFX场景入门

目录 JAVAFX jdk1.8以上引入javafx类库 JDK11JAVAFX(eclipse) 小知识点 舞台Stage platform、screen类 Scene场景类 查看电脑屏幕宽高 Group容器 JAVAFX项目 Image javafx场景 javaFx文本 javaFX颜色 JAVAFX jdk1.8以上引入javafx类库 JDK11JAVAFX(eclipse) 方式…

threejs学习

重要概念&#xff08;场景、相机、渲染器&#xff09; 如下图所示&#xff0c;我们最终看到浏览器上生成的内容是通过虚拟场景和虚拟相机被渲染器渲染后的结果&#xff0c;下面首先介绍这三个概念&#xff0c;将贯穿所有简单复杂的threejs项目。 场景 Scene 虚拟的3D场景&a…

扫码登录流程

扫码登录 场景 在网页版qq邮箱&#xff0c;微信登录账号等时候&#xff0c;无需输入账号和密码&#xff0c;只需要在手机上扫码即可完成登录 登录分析 扫码登录涉及3种角色&#xff1a; PC端&#xff0c; 手机端&#xff0c; 服务端 涉及围绕这三端进行&#xff0c;每一端…

代码随想录算法训练营第四十二天|01背包问题、01背包问题(滚动数组)、416. 分割等和子集

题目&#xff1a;01背包问题 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:背包问题 题目链接&#xff1a;卡码题目链接 图释&#xff1a; //二维dp数组实现 #include <bits/stdc.h> using namespace std;int n, bagweight;// bagweight代表行李箱空…

打 jar 包运行 在windows 平台控制台和日志 乱码解决

--拒絕鷄巴囉嗦&#xff0c;直接解決問題 我们在Windows下运行jar包时&#xff0c;常常会出现乱码&#xff0c;主要分为dos窗口输出的日志中出现乱码和程序返回数据出现乱码。 dos窗口输出的日志中出现乱码 执行如下命令&#xff0c;将控制台输出编码改为UTF8&#xff1a; ch…

Python接口自动化测试实战

接口自动化测试是指通过编写程序来模拟用户的行为&#xff0c;对接口进行自动化测试。Python是一种流行的编程语言&#xff0c;它在接口自动化测试中得到了广泛应用。下面详细介绍Python接口自动化测试实战。 1、接口自动化测试框架 在Python接口自动化测试中&#xff0c;我们…

四、Flask学习之JavaScript

四、Flask学习之JavaScript JavaScript&#xff0c;作为一种前端脚本语言&#xff0c;赋予网页生动的交互性和动态性。通过它&#xff0c;开发者能够操作DOM&#xff08;文档对象模型&#xff09;实现页面元素的动态改变、响应用户事件&#xff0c;并借助AJAX技术实现异步数据…

山西电力市场日前价格预测【2024-01-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-25&#xff09;山西电力市场全天平均日前电价为274.83元/MWh。其中&#xff0c;最高日前电价为562.65元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

文章目录 第 2章感知机2.1 感知机模型2.2 感知机学习策略2.2.1 数据集的线性可分性2.2.2 感知机学习策略 2.3 感知机学习算法2.3.1 感知机学习算法的原始形式2.3.2 算法的收敛性2.3.3 感知机学习算法的对偶形式 实践&#xff1a;二分类模型&#xff08;iris数据集&#xff09;数…

vue3-深入组件-组件注册和props更多细节

组件注册 定义好的组件需要注册才能被使用。 注册方式有两种 全局注册 局部注册 全局注册 .component() 方法&#xff0c;让组件在当前 Vue 应用中全局可用。 在 main.ts 中 import ./assets/main.cssimport { createApp } from vue import { createPinia } from pinia i…

Nodejs前端学习Day1

妈的&#xff0c;学vue3需要15.0以上的nodejs 文章目录 前言一、学习目标二、学习目录三、为什么JavaScript可以在浏览器中被执行四、为什么JavaScript可以操作DOM和BOM五、浏览器中的JavaScript运行环境总结 前言 妈的&#xff0c;学vue3需要15.0以上的nodejs 一、学习目标 二…

递归和尾递归(用C语言解斐波那契和阶乘问题)

很多人都对递归有了解&#xff0c;但是为尾递归很少&#xff0c;所以这次来专门讲一讲关于尾递归的一些问题。 什么是尾递归 如果一个函数中所有递归形式的调用都出现在函数的末尾&#xff0c;我们称这个递归函数是尾递归的。因为在一些题目的做法中&#xff0c;我们可以发现…