使用ShardingSphere-Proxy实现分表分库

使用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 IO流读取图片供前台显示代码分享

    下面是Java IO流读取图片供前台显示的完整攻略: 一、概述 在Java中,使用IO流读取图片供前台显示可以分为以下几个步骤: 使用Java IO流读取图片文件到内存中; 将读取到的图片字节流转换为Base64编码; 将Base64编码的图片数据返回给前台。 二、代码示例 以下是两条示例代码,可以供您参考: 使用FileInputStream和ByteAr…

    Java 2023年5月19日
    00
  • Json读写本地文件实现代码

    下面是关于”Json读写本地文件实现代码”的完整攻略: 什么是JSON JSON是一种轻量级的数据交换格式。它基于JavaScript,但与语言无关。它易于阅读和编写,同时也容易解析和生成。JSON的设计目标是易于使用和理解以及提高网络传输效率。 Json读写本地文件实现代码 本地读写Json文件的操作可以通过Node.js的文件系统模块fs来实现。 读取J…

    Java 2023年5月26日
    00
  • JavaScript实现简单音乐播放器

    现在我来为您详细讲解如何使用JavaScript实现简单音乐播放器的完整攻略。 1. 准备工作 在开始编写代码前,首先需要了解我们需要准备哪些工具和文件。常用的音乐播放器需要包含如下文件: HTML页面:用于展示具体的播放器界面; CSS文件:用于美化页面样式; JavaScript文件:用于实现音乐播放功能。 如果您还没有准备以上文件,可以按照以下步骤进行…

    Java 2023年6月15日
    00
  • 一文详解Object类和抽象类

    一文详解Object类和抽象类 什么是Object类 在Java中,所有的类都是继承自Object类的。Object类是Java语言中的根类,它是所有类的父类,也就是Java中的类都会隐式继承自Object类。在Object类中,定义了几个常用的方法,如: public String toString(): 返回对象的字符串表示。 public boolea…

    Java 2023年5月26日
    00
  • Java计算两个时间段的差的实例详解

    Java计算两个时间段的差的实例详解 在Java中,有时需要计算两个时间段之间的差值。例如,我们可能需要计算两个日期之间相差的天数、小时数、分钟数、秒数等等。 计算两个日期相差的天数 计算两个日期相差的天数可以通过以下步骤实现: 使用java.util.Calendar类获取两个日期所对应的Calendar对象。 使用java.util.Calendar类的…

    Java 2023年5月20日
    00
  • 避免sql注入_动力节点Java学院整理

    接下来我将详细讲解“避免SQL注入_动力节点Java学院整理”的完整攻略。 SQL注入是什么 SQL注入攻击是指攻击者在提交应用程序的输入值时,嵌入执行恶意的SQL语句,从而诱发数据库执行非预期的恶意操作。SQL注入是目前web程序中比较常见的漏洞种类之一,它是由于软件开发人员在编写应用程序或Web页面时,没有对用户输入的数据进行充分的检查,致使攻击者可以攻…

    Java 2023年5月27日
    00
  • java hibernate使用注解来定义联合主键

    下面是Java Hibernate使用注解来定义联合主键的完整攻略。 什么是联合主键? 在关系型数据库中,主键是用来唯一标识一条记录的,而联合主键(Compound Primary Key)是由多个字段组合而成的,用来唯一标识一条记录。在Java Hibernate中,定义联合主键可以使用注解来实现。 使用注解定义联合主键 定义实体类 在Java代码中定义需…

    Java 2023年5月19日
    00
  • java实现超大文件的读写功能

    Java实现超大文件的读写功能攻略 在Java开发中,读写大文件是非常常见的需求。但是在读写超大文件时,会遇到内存溢出或效率低下等问题,因此需要特别注意。 下面是Java实现超大文件的读写功能的攻略: 1. 分片读取和写入 要处理超大文件,一种有效的方法是将文件拆分成若干份,逐个读取或写入,再组合在一起即可完成整个文件的处理。可以使用RandomAccess…

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