使用ShardingSphere-Proxy实现分表分库

yizhihongxing

使用ShardingSphere-Proxy实现分表分库的攻略可以分为以下步骤:

1. 引入ShardingSphere-Proxy

在pom.xml中添加以下依赖:

<dependency>
     <groupId>org.apache.shardingsphere</groupId>
     <artifactId>shardingsphere-proxy-frontend</artifactId>
     <version>${latest.version}</version>
</dependency>

2. 编写配置文件

在src/main/resources下添加sharding.yaml文件,内容如下:

authentication:
  users:
    root:
      password: root
    test:
      password: test
# 配置数据源
dataSources:
  ds0:
    url: jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver
  ds1:
    url: jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver

rules:
  - !SHARDING
    tables:
      user_info:
        actualDataNodes: ds$->{0..1}.user_info_$->{0..2}
        tableStrategy:
          standard:
            shardingColumn: user_id
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: order_id
          keyGeneratorName: snowflake
  - !SHARDING
    tables:
      order_info:
        actualDataNodes: ds$->{0..1}.order_info_$->{0..2} 
        tableStrategy:
          standard:
            shardingColumn: order_id 
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: order_id
          keyGeneratorName: snowflake
    bindingTables:
      - user_info
      - order_info
    broadcasting: 
      tables:
        - config

  # 分表算法 
  - !SHARDING
    tables:
      config:
        actualDataNodes: ds0.config_$->{0..1}
        tableStrategy:
          standard:
            shardingColumn: id
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: id
          keyGeneratorName: snowflake    
    defaultDataSourceName: ds0
    props:
      max.connections.size.per.query: 1
      executor.size: 16
      sql.show: true
    # 配置分库算法
    shardingAlgorithms:
      t_modulo: 
        type: INLINE
        props:
          algorithm-expression: user_info_$->{user_id % 3}

我们可以在配置文件中定义多个数据源,这里定义了两个数据源ds0和ds1。其中,dataSources配置项设置了每个数据源的JDBC连接信息。

同时,我们可以定义多个表的分库分表规则。在本例中,我们定义了user_info和order_info两个表。在这两个表的定义中,我们使用了t_modulo算法对表数据进行分片。

3. 编写入口类

在入口类中,我们需要通过加载配置文件的方式启动ShardingSphere-Proxy。

public class ProxyServer {

    public static void main(String[] args) {
        Bootstrap.start("src/main/resources/sharding.yaml");
    }
}

4. 测试

启动入口类后,我们可以连接到它提供的端口进行测试。比如我们可以使用以下方式连接到测试数据库:

mysql -h 127.0.0.1 -P 3307 -u root -p

连接到数据库后就可以进行数据操作。这里我们给出一个简单的示例:

CREATE TABLE user_info (
  user_id bigint(20) NOT NULL AUTO_INCREMENT,
  user_name varchar(50) NOT NULL,
  password varchar(50) NOT NULL,
  PRIMARY KEY (user_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO user_info(user_name, password) VALUES ('test', 'test123');

5. 示例

为了更好的理解该攻略,我们这里通过两个示例来说明如何使用ShardingSphere-Proxy实现分表分库。

示例一: 分库

在该示例中,我们可以定义两个数据库ds0和ds1,让他们分别负责订单数据和用户数据。用户表和订单表数据都被分成两部分,分别存放在ds0和ds1两个库中。在分库中,我们可以使用sharding.yaml这样的配置:

authentication:
  users:
    root:
      password: root
    test:
      password: test
# 配置数据源
dataSources:{
  ds0:
    url: jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver
  ds1:
    url: jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver}
rules:
  # 分库算法
  - !SHARDING
    defaultDataSourceName: ds0
    tables:
      u_user:
        actualDataNodes: ds$->{0..1}.u_user_$->{0..2}
        tableStrategy:
          standard:
            shardingColumn: id 
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: id
          keyGeneratorName: snowflake      
    shardingAlgorithms:
      t_modulo: 
        type: INLINE
        props:
          algorithm-expression: u_user_$->{id % 3}
  # 分库算法
  - !SHARDING
    defaultDataSourceName: ds1
    tables:
      o_order:
        actualDataNodes: ds$->{0..1}.o_order_$->{0..2}
        tableStrategy:
          standard:
            shardingColumn: id 
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: id
          keyGeneratorName: snowflake      
    shardingAlgorithms:
      t_modulo: 
        type: INLINE
        props:
          algorithm-expression: o_order_$->{id % 3}

在该配置中,我们通过添加两个数据源ds0和ds1来实现分库。我们定义两张表u_user和o_order来分别存放用户信息和订单信息。在数据分片中,其中的u_user表数据被分片存储在ds0中,而o_order表数据被分片存储在ds1中。在ShardingSphere-Proxy的运行过程中,应该会在数据库中生成u_user_0、u_user_1、u_user_2、o_order_0、o_order_1、o_order_2等六个表来存放数据。

示例二: 分表

在这个示例中,我们使用分表算法将数据表分成多个小表来存储数据,最终可以通过这些小表来实现大数据存储分布式。

authentication:
  users:
    root:
      password: root
    test:
      password: test
# 配置数据源
dataSources:{
  ds0:
    url: jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver
  ds1:
    url: jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver}
rules:
  # 分布式表
  - !SHARDING
    tables:
      order_info:
        actualDataNodes: ds$->{0..1}.order_info_$->{0..2} 
        tableStrategy:
          standard:
            shardingColumn: order_id 
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: order_id
          keyGeneratorName: snowflake
    bindingTables:
      - user_info
      - order_info
  # 分布式表
  - !SHARDING
    tables:
      config:
        actualDataNodes: ds0.config_$->{0..1}
        tableStrategy:
          standard:
            shardingColumn: id
            shardingAlgorithmName: t_modulo
        keyGenerateStrategy:
          column: id
          keyGeneratorName: snowflake    
    defaultDataSourceName: ds0
    props:
      max.connections.size.per.query: 1
      executor.size: 16
      sql.show: true
    shardingAlgorithms:
      t_modulo: 
        type: INLINE
        props:
          algorithm-expression: order_info_$->{order_id % 3}

在本例中,我们使用分表算法将数据表order_info分成三个小表存储,而config表则按照分库的方式存储。在进行表的分片时,其中的order_info表数据被分片存储在ds0和ds1中,数据被分成了三部分,分别存储在ds0、ds1中的order_info_0、order_info_1、order_info_2中。ShardingSphere-Proxy运行过程中,应该会在数据库中生成5个表order_info_0、order_info_1、order_info_2、config_0、config_1来存放数据。

通过以上两个示例,我们可以看到,使用ShardingSphere-Proxy来实现分库分表是非常方便的。只要我们熟悉相关配置规则,就可以快速地实现分布式存储。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用ShardingSphere-Proxy实现分表分库 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java基础之打印万年历的简单实现(案例)

    下面是“Java基础之打印万年历的简单实现(案例)”的完整攻略: 简介 本案例演示了如何使用Java打印万年历,通过计算出每个月的天数和星期几,并将其输出到控制台中。 实现步骤 第一步:输入年份 Scanner scanner = new Scanner(System.in); System.out.print("请输入年份:"); in…

    Java 2023年5月20日
    00
  • Spring boot异步任务原理全面分析

    Spring Boot异步任务原理全面分析 在Spring Boot中,我们经常需要执行一些耗时的操作,如果将它们放入主线程中进行,会导致响应变慢,用户体验不佳。而异步任务可以避免这种情况的出现。 什么是Spring Boot异步任务 Spring Boot异步任务是指在独立的线程中处理某些任务,将主线程从处理任务中解放出来的机制。Spring Boot提供…

    Java 2023年5月19日
    00
  • springboot各种下载文件的方式汇总

    Spring Boot各种下载文件的方式汇总攻略 在Web应用程序中,下载文件是常见的功能之一。Spring Boot提供了多种方式来下载文件。本文将汇总介绍Spring Boot中各种下载文件的方式。 1. 使用OutputStream下载文件 最简单的方式是使用OutputStream将文件写入到HttpServletResponse的输出流,并将相应的…

    Java 2023年5月19日
    00
  • JSP指令元素(page指令/include指令/taglib指令)复习整理

    JSP指令元素是用于指定JSP页面的配置信息,包括页面的编码方式、引入的Java类库和定义自定义标签库等。常见的JSP指令元素包括page指令、include指令和taglib指令。 page指令元素 page指令元素是最常用的JSP指令元素之一,用于指定JSP页面的各种配置信息,它通常包含在JSP页面的头部位置,并以%@开&#…

    Java 2023年6月15日
    00
  • jQuery 重复加载错误以及修复方法

    jQuery 重复加载错误以及修复方法 在使用jQuery的过程中,经常会遇到jQuery重复加载的错误。这个错误一般是因为我们在多个地方重复引用了jQuery库导致的。下面,我们就来详细讲解如何避免和解决这个问题。 什么是jQuery重复加载错误 当我们在页面中引用jQuery库时,如果多个地方都引用了jQuery库,那么就会发生jQuery重复加载的错误…

    Java 2023年6月15日
    00
  • Spring Bean作用域与生命周期深入讲解

    Spring Bean作用域与生命周期深入讲解 在Spring框架中,可以通过配置Bean的作用域和生命周期来管理Bean对象的创建、销毁以及访问范围等问题。本文将详细讲解Spring Bean的作用域和生命周期相关的知识。 Bean的作用域 Bean的作用域指的是Bean对象在IoC容器中的存活周期和访问范围,Spring框架提供了5种作用域类型,分别是:…

    Java 2023年5月19日
    00
  • 在Mac OS上安装Tomcat服务器的教程

    在Mac OS上安装Tomcat服务器的教程 简介 Tomcat是一个基于Java语言实现的Web服务器,也可作为一个Servlet容器运行,目前是最为流行的Web服务器之一。在Mac OS操作系统上安装Tomcat服务器,可以方便地搭建Web应用程序,供其他用户访问。本文将介绍如何在Mac OS上安装Tomcat服务器的详细过程。 步骤一:下载Tomcat…

    Java 2023年5月19日
    00
  • JavaWeb Struts文件上传功能实现详解

    JavaWeb Struts文件上传功能实现详解 简介 本文将详细讲解如何在 JavaWeb Struts 框架中实现文件上传功能,其中包括前端页面的设计和后端逻辑的实现。 设计前端页面 前端页面是实现文件上传功能的基础。在这里,我们将使用HTML和JavaScript来设计一个简单的上传页面。 示例一:HTML 代码 <!DOCTYPE html&g…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部