ShardingSphere数据库中间件

这篇具有很好参考价值的文章主要介绍了ShardingSphere数据库中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

什么是分库分表

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

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

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

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

ShardingSphere数据库中间件,SpringBoot,数据库

什么时候分库分表

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

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

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

 


数据库拆分策略

业务场景

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

ShardingSphere数据库中间件,SpringBoot,数据库

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

ShardingSphere数据库中间件,SpringBoot,数据库

  • 混合切分
    • 业务+数据

ShardingSphere数据库中间件,SpringBoot,数据库

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

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 的核心接口。

ShardingSphere数据库中间件,SpringBoot,数据库


常用分库分表的工具

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

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

目前市面上比较不错的分库分表的开源框架主要有三个,分别是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

原文链接:


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.DruidDataSourcex
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
        # 从数据源
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin # 多个从库的负载均衡策略:轮询
      # 最终的数据源名称
      name: da
      # 主库数据源名称
      master-data-source-name: ds0
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: ds1
    props:
      sql:
        show: true #打印SQL
  main:
    allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的
mybatis-plus:
  type-aliases-package: com.hz.pojo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false #驼峰映射
水平拆分
spring:
  main:
    allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的
  shardingsphere:
    datasource:
      names: ds0,ds1 # 一主一从
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
    sharding:
      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 #主键id
            type: SNOWFLAKE #生成策略雪花id
          databaseStrategy: #如果只分表,可不设置
            inline: # 指定表的分片策略
              shardingColumn: id #参与分片运算的列名
              algorithmExpression: ds$->{id % 2} #分片算法
          # 分表策略
          table-strategy:
            inline: #指定表的分片策略
              sharding-column: id
              algorithm-expression: user$->{id%2 + 1} #分片规则
    props:
      sql:
        show: true #打印SQL

mybatis-plus:
  type-aliases-package: com.hz.pojo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false #驼峰映射
server:
  port: 80

垂直拆分文章来源地址https://www.toymoban.com/news/detail-819137.html

spring:
  main:
    allow-bean-definition-overriding: true  #就是允许定义相同的bean对象 去覆盖原有的
  shardingsphere:
    datasource:
      names: ds0,ds1 # 一主一从
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
    sharding:
      tables:
        user:
          actual-data-nodes: ds0.user1 #指定关联的数据库
        bill:
          actual-data-nodes: ds1.bill1 #指定关联的数据库
    props:
      sql:
        show: true #打印SQL

mybatis-plus:
  type-aliases-package: com.hz.pojo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-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.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3301/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3302/smbms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
    sharding:
      tables:
        bill: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致
          actual-data-nodes:  ds0.bill$->{1..2} # 创建了两个表,下标0和1
          key-generator:
            column: id # 主键ID
            type: SNOWFLAKE # 生成策略雪花id
          # 分表策略
          table-strategy:
            inline: # 指定表的分片策略
              sharding-column: id
              algorithm-expression: bill$->{id % 2 + 1} #分片规则
        user: # 指定表名,此名必须和model中 @TableName(value = "my_table") 一致
          actual-data-nodes: ds0.user$->{1..2} # 创建了两个表,下标0和1
          key-generator:
            column: id # 主键ID
            type: SNOWFLAKE # 生成策略雪花id
          # 分表策略
          table-strategy:
            inline: # 指定表的分片策略
              sharding-column: id
              algorithm-expression: user$->{id % 2 + 1} #分片规则
      masterslave:
        # 读写分离配置
        load-balance-algorithm-type: round_robin # 多个从库的负载均衡策略:轮询
        # 最终的数据源名称
        name: da
        # 主库数据源名称
        master-data-source-name: ds0
        # 从库数据源名称列表,多个逗号分隔 至少需要有一个
        slave-data-source-names: ds1
    props:
      sql:
        show: true #打印SQL
mybatis-plus:
  type-aliases-package: com.hz.pojo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false #驼峰映射
server:
  port: 80

到了这里,关于ShardingSphere数据库中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Jmeter】压测mysql数据库中间件mycat

    目录 背景 环境准备 1、下载Jmeter 2、下载mysql数据库的驱动包 3、要进行测试的数据库 Jmeter配置 1、启动Jmeter图形界面 2、加载mysql驱动包 3、新建一个线程组,然后如下图所示添加 JDBC Connection Configuration 4、配置JDBC Connection Configuration 5、如图所示添加JDBC Request 6、如图所示配置

    2024年02月14日
    浏览(35)
  • MySQL数据库中间件Mycat介绍及下载安装(教程)

    MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat,对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器里面存储了什么数据,都无需关心。 具体的分库分表

    2024年02月11日
    浏览(39)
  • 【云原生技术】云计算中的数据库中间件简介

    云计算中的数据库中间件是位于客户端和数据库服务器之间的软件层,提供数据库操作的抽象、管理、优化和扩展功能。这些中间件可以简化数据库的管理,提高性能和安全性,同时使应用程序更容易与数据库进行交互。 主要功能 连接池管理 : 管理数据库连接,提供连接池

    2024年01月22日
    浏览(42)
  • Go重写Redis中间件 - Go实现内存数据库

    前面我们实现了一个简单的回发Redis,这里我们要实现一个真正的Redis内核 实现底层Dict数据结构 新建一个datastruct文件夹,放一些我们要用的数据结构,比如Redis的核心起始就是一个map,再新建一个包实现这个map或者叫字典,字典的底层使用的就是map dict.go 写一个Dict接口定义

    2024年02月11日
    浏览(35)
  • 搭建开源数据库中间件MyCat2-配置mysql数据库双主双从

    mycat2官网:MyCat2 前言:mycat2下载地址无法访问,不知道是不是被DNS污染了,还是需要搭梯子访问,所以我只能找到1.21的版本进行安装。搭建mycat2的前提是搭建数据库主从复制。 架构:双主双从 配置:3台服务器,4台数据库;其中2台服务器为数据库各装主从配置,1台服务器

    2024年01月21日
    浏览(50)
  • 数据库访问中间件--springdata-jpa的基本使用

    回顾 示例 JPQL 片段 And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2 Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1 Between findByStartDateBetween … where x.startDate between ?1 and ?2 LessThan findByAgeLessT

    2024年02月14日
    浏览(31)
  • Springboot整合activiti5,达梦数据库,mybatis中间件

    由于工作流引擎不支持达梦数据库以及国产中间件,所以我们引入的时候会报错,这个时候就需要去改造代码和配置文件。各种文档和资料查找一天,现在对这个问题进行解决了。 1.查看网上的各类教程,手动将源码复制粘贴出来,进行修改。这方面可以自行去查找对应文档

    2024年02月14日
    浏览(29)
  • 0101prox-shardingsphere-中间件

    1.1 获取 目前 ShardingSphere-Proxy 提供了 3 种获取方式: 二进制发布包 Docker Helm 这里我们使用Docker安装。 1.2 使用Docker安装 step1:启动Docker容器 step2:上传MySQL驱动 将MySQl驱动上传至 /Users/gaogzhen/data/docker/shardingsphere/proxy/proxy-a/ext-lib 目录 spte3:修改配置server.yaml 将配置文件上传至

    2024年02月11日
    浏览(43)
  • 0103水平分片-jdbc-shardingsphere-中间件

    随着系统业务的发展,t_order表数据快速增长,服务器压力增大,影响系统性能,我需要对server-order进行分库分表。 服务器规划: 服务器:容器名 server-order0 ,端口号3310 服务器:容器名 server-order1 ,端口号3311 1.1 创建server-order0容器 step1:创建挂载文件夹 Step2:创建容器 st

    2024年02月11日
    浏览(36)
  • 0101读写分离测试-jdbc-shardingsphere-中间件

    shardingshpere-jdbc定位为轻量级 Java 框架, 在 Java 的 JDBC 层提供的额外服务 。 它使用客户端直连数据库, 以 jar 包形式提供服务 ,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。 关于mysql配置主从复制,可以参考之前写的文章= 0101docker mysq

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包