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

相关文章

  • Spring异常实现统一处理的方法

    下面我将详细讲解Spring异常实现统一处理的方法。 背景 在Spring应用程序中,系统可能会出现各种异常,如数据库连接异常、空指针异常等等。这些异常可能会导致应用程序崩溃或无法正常运行,对于程序员,处理这些异常非常重要。而在处理异常时,统一处理异常是一种最佳的方法。 实现步骤 第一步:全局异常处理类 编写一个全局异常处理类,该类应该用@Controlle…

    Java 2023年5月20日
    00
  • 详解Java如何优雅地书写if-else

    下面我将为你详细讲解“详解Java如何优雅地书写if-else”的完整攻略。 一、Java中if-else语句的基本用法 在Java中,if-else语句是一种常见的控制流程语句,用于根据条件是否满足来执行不同的代码。其基本语法如下: if (condition) { // condition为真时执行的语句块 } else { // condition为假…

    Java 2023年5月26日
    00
  • SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

    3)OAuth2 Client 结合GitHub授权案例 本随笔说明:这仅作为OAuth2 Client初次使用的案例,所以写得很简单,有许多的不足之处。 OAuth2 Client(OAuth2客户端)是指使用OAuth2协议与授权服务器进行通信并获取访问令牌的应用程序或服务。OAuth2客户端代表最终用户(资源拥有者)向授权服务器请求授权,并使用授权后的…

    Java 2023年5月9日
    00
  • 实例讲解java定时任务

    实例讲解Java定时任务的攻略如下: 1. 什么是Java定时任务? Java定时任务是指在预定的时间或间隔时间自动执行任务的一种机制,通常用于需要周期性执行的操作。Java常见的定时任务框架有Timer、ScheduledExecutorService和Quartz等。 2. Java定时任务的实现方式 2.1 Timer Timer是Java自带的定时任…

    Java 2023年6月1日
    00
  • JavaSpringBoot报错“BeanDefinitionStoreException”的原因和处理方法

    原因 “BeanDefinitionStoreException” 错误通常是以下原因引起的: 配置问题:如果您的配置不正确,则可能会出现此错误。在这种情况下,您需要检查您的配置并确保它们正确。 类型不匹配:如果您的代码中存在类型不匹配问题,则可能会出现此错误。在这种情况下,您需要检查您的代码并确保它们正确。 解决办法 以下是解决 “BeanDefiniti…

    Java 2023年5月4日
    00
  • SpringBoot 钩子接口的实现代码

    在SpringBoot中,我们可以通过实现钩子接口(Hook Interface)来在启动应用程序或者关闭应用程序时执行一些特定的逻辑行为。例如我们可以在应用启动时预加载某些资源,或者在应用关闭时清理一些资源等。本文将为大家介绍如何实现SpringBoot钩子接口,包含以下步骤: 新建Hook Interface 首先,我们需要新建一个Hook Interf…

    Java 2023年5月31日
    00
  • js阻止默认浏览器行为与冒泡行为的实现代码

    阻止默认浏览器行为和阻止冒泡事件是JavaScript中常用的操作。在以下的示例中,假设有一个HTML页面和一个按钮,我们将通过代码示例来演示如何阻止默认浏览器行为和阻止冒泡事件。 阻止默认浏览器行为 默认情况下,当用户点击一个链接或提交表单时,浏览器会自动执行一些动作。有时候我们需要阻止这些默认的动作,那么如何实现它呢?下面是一个实现阻止默认行为的示例代码…

    Java 2023年6月15日
    00
  • ajax异步读取后台传递回的下拉选项的值方法

    当我们需要从后台获取选项的值时,可以使用Ajax异步请求来实现。其中,下拉选项的值可以通过后台接口获取到。 以下是实现该功能的具体步骤: 第一步:准备工作 在HTML中,我们需要创建一个下拉选项: <select id="selectBox"> <option value="">请选择</…

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