使用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日

相关文章

  • JavaWeb Maven详解相关配置

    JavaWeb Maven是JavaWeb项目的构建工具,它可以管理和构建JavaWeb应用程序的依赖项,简化项目的构建和部署过程。下面是JavaWeb Maven的详解相关配置的完整攻略。 一、 Maven的安装 下载Maven压缩包(例如:apache-maven-3.8.3-bin.zip); 解压到指定目录(例如:/usr/local/maven);…

    Java 2023年5月19日
    00
  • Java OpenCV利用KNN算法实现图像背景移除

    让我来为您详细讲解“Java OpenCV利用KNN算法实现图像背景移除”的完整攻略。 1. 简介 1.1 OpenCV OpenCV是一个跨平台的计算机视觉库。它可以用于实时图像处理、计算机视觉、机器学习和人工智能等场景。OpenCV支持多种编程语言,如C++、Python、Java等。 1.2 KNN算法 KNN算法是一种基于数据的分类和回归方法。在分类…

    Java 2023年5月19日
    00
  • 教你如何使用Java输出各种形状

    如何使用Java输出各种形状 本文将介绍如何使用Java语言输出多种形状,包括矩形、三角形和菱形等。通过学习本文,您将了解到Java中输出各种形状的方法及实例。 矩形 矩形是最简单的图形之一,我们可以使用Java的for循环输出一个指定宽度和高度的矩形。以下是代码示例: // 输出一个5行4列的矩形 int width = 4; int height = 5…

    Java 2023年5月26日
    00
  • Java编程思想对象的容纳实例详解

    Java编程思想对象的容纳实例详解 在Java编程中,对象的容纳是一个非常重要的概念。在本文中,我们将详细介绍Java中对象的容纳,包括容纳的数据类型和常用的容纳实例方法。 容纳的数据类型 Java中可以容纳的数据类型非常多,比如基本数据类型(byte、short、int、long、float、double、char、boolean)、数组、对象、接口等等。…

    Java 2023年5月26日
    00
  • Spring Boot 如何正确读取配置文件属性

    Spring Boot 通过@ConfigurationProperties注解实现了属性注入功能,可以方便的读取配置文件中的属性值。下面将详细讲解如何正确读取配置文件属性的完整攻略。 1. 定义@ConfigurationProperties类 首先,我们需要在Spring Boot应用程序中定义一个带有@ConfigurationProperties注解…

    Java 2023年5月26日
    00
  • SpringSecurity如何实现配置单个HttpSecurity

    要实现配置单个HttpSecurity,可以通过在配置类中创建多个protected的方法,并使用@Order注解来指定它们的顺序来实现。每个protected方法都会配置一个单独的HttpSecurity对象。 下面是实现的步骤: 创建一个配置类,并添加@EnableWebSecurity注解。 在配置类中创建多个被@Order注解标记的protected…

    Java 2023年5月20日
    00
  • Java实现验证码具体代码

    Java实现验证码需要以下步骤: 1. 生成随机字符串 我们可以使用Java的Random类来生成随机数,并将随机数转换为字符串。以下是示例代码: Random random = new Random(); StringBuffer codeBuffer = new StringBuffer(); for (int i = 0; i < 4; i++)…

    Java 2023年5月20日
    00
  • 简单了解Spring中常用工具类

    下面我就来详细讲解下“简单了解Spring中常用工具类”的攻略,包括什么是Spring工具类,Spring常用工具类有哪些,以及如何使用这些工具类。 什么是Spring工具类 Spring工具类是指在Spring框架中提供的一些常用的工具类,用于完成一些常见的任务。这些工具类都封装了一些复杂的逻辑,方便我们在开发中直接调用。 Spring常用工具类 以下是S…

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