【分库分表】基于mysql+shardingSphere的分库分表技术

这篇具有很好参考价值的文章主要介绍了【分库分表】基于mysql+shardingSphere的分库分表技术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.什么是分库分表

2.分片方法

3.测试数据

4.shardingSphere

4.1.介绍

4.2.sharding jdbc

4.3.sharding proxy

4.4.两者之间的对比

5.留个尾巴


1.什么是分库分表

分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃?

  • 单表过大的话,读请求进来,查数据需要的时间会过长

  • 读请求过多,单节点IO压力太大,IO压力太大会造成什么?可能会造成IO阻塞,造成响应速度变慢。

分库分表是指的两种维度,一种维度是分库,另一种维度是分表。分的话有两种分法,一种是水平分,另一种是垂直分。

水平分是指将数据分为多段,一个服务器节点上存放一段,读写的时候走自己要的那一段所在服务器上。一段也叫一个分片(sharding)

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

垂直分是指将一个库或者一个表从一个整体拆成多个部分,不同服务器上存储一部分:

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

2.分片方法

其实总的来说分库都还好,垂直分库对应着服务拆成微服务做到资源隔离各玩儿各的,问题都还不大,而且一般不会出现水平分库,因为库里面数据多的也就某一些表,我们面对更多的是水平分表。水平分表首先要面对的就是如何分片?

分片方法有如下几种:

  • hash分片法

  • range分片法

hash分片法:

主键对服务器数量取余。

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

这种方式在扩容后数据需要重新散列一遍,重新散列一遍花时间吗?当然花时间,但是不散列又不行,为什么喃?举个例,原来id=12的数据散列到了0表,扩容后不迁移的话按照规则id=12的表会散列到4表,这就会导致id=12这条数据在查找的时候找不到:

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

当然hash算法可以用一致性hash算法来优化,但其数据迁移肯定是无法规避的,且一致性hash算法本身也存在无法规避的缺点。博主之前有一篇一致性hash算法的文章,可移步:

一致性hash算法_一直hash算法-CSDN博客

range分片法:

按照编号顺序均匀的分片,好处是扩容不用散列,但是新数据往往是使用频率更高的数据,会导致压力不均匀,而且现在一般唯一ID为了安全性都是无序的,比如采用UUID做主键的时候,所以range分片法的场景适用也很有限。

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

3.测试数据

用一张订单表来做测试数据,根据主键来分库分表:

create table order_(
id varchar(100) primary key,
productName VARCHAR(100),
productId VARCHAR(100),
createTime datetime,
statue INT
)ENGINE=INNODB;

准备了两个库,db01和db02都有这张订单表:

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

依赖版本:

千万注意版本的对齐!

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--prometheus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
​
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!-- MyBatis Plus Starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--sharding-jdbc-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <!-- Alibaba Druid 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>
    
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

4.shardingSphere

4.1.介绍

分片方法说起来容易,要自己去实现一个全过程的分片分表还是很繁琐的,需要手动实现多数据源,然后实现散列算法来控制读写请求映射到哪一台服务器,升级一点的功能还包括要与服务器进行心跳通信,获取服务器的信息等等。所以说还是直接用"轮子"吧。

Apache ShardingSphere 是一个开源的分布式数据库中间件解决方案,它由阿里巴巴集团开源,目前是 Apache 软件基金会旗下的顶级项目。ShardingSphere 通过提供一组与数据库交互的标准化接口(如JDBC驱动或代理服务),对上层应用隐藏了复杂的分布式数据库处理逻辑,为开发者提供了易用且功能强大的分库分表、读写分离、数据治理、弹性伸缩等功能。

ShardingSphere分为三部分:Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar。

4.2.sharding jdbc

其中Sharding-JDBC,其会托管JDBC,然后支持实现分库分表、读写分离。分库分表和读写分离都是通过配置实现的,配置好数据源,然后配置好分库规则即可。当然读写分离的前提是数据库已经配置成了读写分离的模式。以下是配置示例:

spring:
  application:
    name: testDemo
  shardingsphere:
    datasource:
      names: ds0,ds1
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3306/db01?serverTimezone=UTC
        username: root
        password: admin
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3306/db02?serverTimezone=UTC
        username: root
        password: admin
    sharding:
      default-database-strategy:
        inline:
          sharding-column: order_id
          algorithm-expression: ds$->{order_id % 2}
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
            table-strategy:
              inline:
                sharding-column: order_id
                algorithm-expression: t_order_$->{order_id % 2}
      #读写分离
      master-slave-rules:
        ms_ds:
          master-data-source-name: ds0
          slave-data-source-names: ds1
          load-balance-algorithm-type: ROUND_ROBIN #负载均衡算法
    props:
      sql.show: true #是否打印sql

上述YAML配置已经使用了inline表达式实现了基于order_id字段的分库和分表规则。当然还提供了接口,对于自定义分库、分表规则,可以通过实现ShardingSphere提供的接口来自定义算法类,并在配置中引用这些类。

public class CustomDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
        // 根据order_id和其他可能的业务逻辑计算数据库名称
        int orderId = shardingValue.getValue();
        return "ds" + (orderId % 2); // 这里仅作为示例,实际请根据业务需求编写
    }
}
spring:
  application:
    name: testDemo
  shardingsphere:
    # ... 数据源配置 ...
    sharding:
      default-database-strategy:
        precise:
          sharding-column: order_id
          algorithm-class-name: com.example.CustomDatabaseShardingAlgorithm
      tables:
        t_order:
          actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
          table-strategy:
            precise:
              sharding-column: order_id
              # 同样可以为表级别分片指定自定义算法类
              algorithm-class-name: com.example.CustomTableShardingAlgorithm
      # ... 读写分离配置 ...
    props:
      sql.show: true

同样的,如果需要自定义分表规则,也需要创建一个实现相应接口(如PreciseShardingAlgorithm)的类,并在table-strategy部分通过algorithm-class-name属性引用它。以上示例中的CustomTableShardingAlgorithm即是一个假设存在的自定义分表策略类。请确保实际应用中已正确创建并配置此类。

4.3.sharding proxy

sharding proxy是一个中间件,也能实现分库分表和读写分离。不同于sharding jdbc需要侵入代码中对JDBC进行一个托管,sharding

proxy是无侵入式的,一个独立的组件。

sharding proxy需要先下载,然后解压、配置。

配置示例:

配置数据库的信息

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

然后需要导入mysql的驱动:

【分库分表】基于mysql+shardingSphere的分库分表技术,数据库,哈希算法,数据库,分布式,mysql

配置分库分表:

这里要注意了databaseName指向的数据库是一个总库,应用都会往这个库里面进行数据读写,然后由sharding proxy来向我们配置的不同数据源里进行分库分表。给出一个配置文件,大家感受一下,该配置文件基于Apache ShardingSphere 5.x版本的语法编写。不同版本可能配置项存在不同哈。

# config-sharding.yaml
​
schemaName: testDemo  # 指定逻辑库名称
​
rules:
  - !SHARDING
    dataSources:
      ds0:
        url: jdbc:mysql://localhost:3306/db01?serverTimezone=UTC
        username: root
        password: admin
        connectionTimeoutMilliseconds: 30000
        idleTimeoutMilliseconds: 60000
        maxLifetimeMilliseconds: 1800000
        type: com.alibaba.druid.pool.DruidDataSource
      ds1:
        url: jdbc:mysql://localhost:3306/db02?serverTimezone=UTC
        username: root
        password: admin
        # 其他连接池属性...
​
    shardingRule:
      tables:
        t_order:
          actualDataNodes: ds$->{0..1}.t_order_$->{0..1}
          databaseStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: ds$->{order_id % 2}
          tableStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: t_order_$->{order_id % 2}
​
      masterSlaveRules:
        ms_ds:
          masterDataSourceName: ds0
          slaveDataSourceNames: [ds1]
          loadBalanceAlgorithmType: ROUND_ROBIN
​
props:
  sql.show: true

4.4.两者之间的对比

sharding jdbc是侵入了应用,托管了JDBC,对代码有侵入性。

sharding proxy是对数据库下手,其并没用侵入数据库,也没用上数据库的bin log,而是去监听数据库的端口从而来拦截下sql。

但是proxy明显可以看到是中心化的,都在向一个点来写数据,是会有性能瓶颈的。

5.留个尾巴

不管是水平拆还是垂直拆,分库分表后一定会存在两个核心问题:

  • 不好join,需要在程序层面进行join

  • 分布式事务

sharding是如何解决第一个问题的喃?首先sharding会各个节点上进行全表扫描,用类似笛卡尔积的办法聚合成最终的结果。

至于第二个问题,留在后文,我们将深入探究一下sharding生态圈是如何实现分布式事务的。除此之外还有一些尾巴要留在后文继续展开,包括:文章来源地址https://www.toymoban.com/news/detail-838754.html

  • sharding jdbc是如何托管JDBC的
  • sharding proxy是否存在中心化架构带来的性能问题?有没有办法规避?

到了这里,关于【分库分表】基于mysql+shardingSphere的分库分表技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 编写shell脚本,利用mysqldump实现MySQL数据库分库分表备份

     查看数据和数据表 删除头部Database和数据库自带的表  编写脚本 检查脚本运行备份数据库 分表分库备份成功 还原检测 删除数据库并查看库 开始还原 使用备份的库进行还原,由于是压缩文件,使用压缩还原 查看数据库  

    2024年02月05日
    浏览(38)
  • 一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案

    导航: 【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/黑马旅游/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码-CSDN博客 目录 一、分库分表基本概念 二、分库分表的场景和核心思想 三、分库分表具体步骤 3.1 分库分表的原则:能不分就

    2024年02月03日
    浏览(32)
  • ShardingSphere-JDBC 分库分表

    springBoot  引入maven application.yml配置 table-strategy:指定表的分片策略,table-strategy有以下几种策略 1 ) none 表示不分片,所有数据都存储在同一个表中。 2 ) standard 表示使用标准分片策略,根据分片键的值进行范围匹配,将数据路由到对应的分片表中。         对应StandardShardi

    2024年01月19日
    浏览(29)
  • Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年03月26日
    浏览(36)
  • SpringBoot 整合 ShardingSphere4.1.1实现分库分表

    目录 前言 一、ShardingSphere4.1.1的spring boot配置 二、ShardingSphere的分片策略 三、SpringBoot 整合 ShardingSphere4.1.1 四 、ShardingSphere实现分布式事务控制     ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这

    2024年02月08日
    浏览(30)
  • shardingsphere-proxy 实现postgresql的分库分表

    1、拉取镜像 2、运行容器 3、查看容器是不是运行成功 1、获取镜像中的配置 2、启动shardingsphere-proxy 3、检查shardingsphere-proxy是否启动成功 1、拉取镜像 2、运行镜像 3、进入docker容器检查是否成功 4、创建查询用户,并赋值权限 修改server.xml文件,文件地址:/home/sunyuhua/docker/s

    2024年02月11日
    浏览(47)
  • shardingsphere5.x整合springboot分库分表实战

    官方文档不同版本配置变更记录:Spring Boot Start 配置 :: ShardingSphere pom.xml配置: 建表sql: yml配置: orders对象实体: OrdersMapper:  OrdersMapper.xml:  单元测试:  1、插入数据结果,按order_no分片取模,分片数为10,该数据被写入表orders_2: 2、查询数据sql,按order_no分片取模,分

    2024年02月07日
    浏览(33)
  • shardingsphere5.1.1分表分库yaml配置 自定义策略

    通过阅读官方稳定给出示例 https://shardingsphere.apache.org/document 在该配置中,有两个数据源ds0和ds1,分别对应两个数据库db0和db1。在ShardingSphere中,通过配置actual-data-nodes属性来指定数据分片的具体情况。在这里,我们指定了user表在ds0和ds1这两个数据源中的分片情况。其中,ac

    2024年02月09日
    浏览(30)
  • SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。

    👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 Docker部署MYSQL主从详细教程-阿木木AEcru-CSDN 那天写了 部署mysql主从后,想了想,还是有必要出多一篇关于ShardingSphere-JDBC 读写分离

    2024年04月13日
    浏览(27)
  • 数据库的分库分表

     

    2024年02月14日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包