使用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读取String分行字符串的方法

    下面我将详细讲解Java读取String分行字符串的方法。 使用StringBuilder对象 使用StringBuilder对象可以较为方便地处理分行字符串。大致思路是先将原始的String对象按照换行符分割成多个子字符串,然后逐个子字符串拼接到StringBuilder中。具体步骤如下: 使用String类的split方法将原始字符串按照换行符分割成一个…

    Java 2023年5月26日
    00
  • Kafka单节点伪分布式集群搭建实现过程详解

    Kafka单节点伪分布式集群搭建实现过程详解 背景介绍 Kafka是一种高吞吐量的分布式发布订阅消息系统,广泛应用于大数据领域。本文将介绍如何搭建一个Kafka单节点伪分布式集群。 搭建步骤 步骤1:下载和安装Kafka 在官网https://kafka.apache.org/downloads中下载最新的Kafka版本,并按照官方文档步骤进行安装。 步骤2…

    Java 2023年5月20日
    00
  • UrlDecoder和UrlEncoder使用详解_动力节点Java学院整理

    UrlDecoder和UrlEncoder使用详解 UrlDecoder和UrlEncoder是Java中用于处理URL参数编码和解码的工具类,通过使用它们可以有效地处理URL编码的数据。本文将详细介绍这两个工具类的使用方法和示例。 UrlDecoder的使用 使用方法 导入相关类 java import java.net.URLDecoder; 调用dec…

    Java 2023年5月20日
    00
  • springboot使用AOP+反射实现Excel数据的读取

    针对“springboot使用AOP+反射实现Excel数据的读取”的完整攻略,我将从以下几个方面进行详细讲解: AOP的介绍 反射的介绍 将AOP和反射结合起来实现Excel数据的读取 示例1:使用AOP+反射实现读取一个Excel文件 示例2:使用AOP+反射实现批量读取多个Excel文件 以下是具体的介绍和示例。 1. AOP的介绍 AOP(Aspec…

    Java 2023年5月20日
    00
  • java 基于maven多模块合并打包部署的操作过程

    下面我将详细讲解“java 基于maven多模块合并打包部署的操作过程”的完整攻略。 一、背景知识 在使用 Maven 管理多模块 Java 项目时,通常会出现需要将多个子模块合并成为一个独立的可部署应用程序的情况。本攻略的目的就是帮助你完成这一操作。 二、操作步骤 以下是基于 Maven 的多模块合并打包部署的操作步骤: 1. 创建一个 Maven 项目 …

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ChainConfigException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ChainConfigException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 链错误:如果链不正确,则可能会出现此错误。在这种情况下,需要检查链以解决此问题。 以下是两个实例: 例 1 如果配置文件中没有正确配…

    Java 2023年5月5日
    00
  • Spring系列中的beanFactory与ApplicationContext

    当提到Spring框架的IoC容器时,很容易想到beanFactory和ApplicationContext,这两者都属于Spring框架中IoC容器的范畴。本篇文章将详细讲解beanFactory和ApplicationContext的特点,优缺点以及使用场景。 BeanFactory BeanFactory是Spring框架最基本的IoC容器,提供了一种…

    Java 2023年5月19日
    00
  • Java对象简单实用案例之计算器实现代码

    下面我将详细讲解“Java对象简单实用案例之计算器实现代码”的完整攻略。 简介 本案例旨在用Java面向对象的思想实现一个简单的计算器,实现计算加、减、乘、除四则运算。 实现步骤 定义一个Calculator类,用于计算加、减、乘、除四则运算,并定义四个方法add、subtract、multiply和divide,其中方法的参数为两个double类型的数值,…

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